bytedance / bhook

:fire: ByteHook is an Android PLT hook library which supports armeabi-v7a, arm64-v8a, x86 and x86_64.
https://github.com/bytedance/bhook/tree/main/doc#readme
MIT License
2.05k stars 315 forks source link

关于符号查找的一个小建议 #24

Closed Mr-JingShi closed 2 years ago

Mr-JingShi commented 2 years ago

https://github.com/bytedance/bhook/blob/19f99d96c5e561b8e3598498024ef1285ee59c83/bytehook/src/main/cpp/bh_elf.c#L499

大佬,你好 关于符号的查找,个人觉得xhook的写法更好: 布隆过滤器对于item存在是有误判的,但对于item不存在是有精准保障的。 所以存在gnu_hash段、sym_name确实不存在于gnu_hash布隆过滤器时,不应该继续查找。

caikelun commented 2 years ago

这个函数是用来查询导入符号的,.gnu_hash中不包含导入符号。你可以仔细看下这个函数中每种查找的注释,约靠前的查找方式查找到的概率越大,如果概率相同,则速度快的放在前面。

Mr-JingShi commented 2 years ago

大佬,不好意思,这个文件相似符号名字的函数太多了,我标记错位置了。 应该是这个位置: https://github.com/bytedance/bhook/blob/19f99d96c5e561b8e3598498024ef1285ee59c83/bytehook/src/main/cpp/bh_elf.c#L544

个人觉得xhook的写法更好:

static int xh_elf_gnu_hash_lookup(xh_elf_t *self, const char *symbol, uint32_t *symidx)
{
    if(0 == xh_elf_gnu_hash_lookup_def(self, symbol, symidx)) return 0;
    // 当然对于export符号查找,这个import符号查找需要屏蔽掉
    // if(0 == xh_elf_gnu_hash_lookup_undef(self, symbol, symidx)) return 0;
    return XH_ERRNO_NOTFND;
}

static int xh_elf_find_symidx_by_name(xh_elf_t *self, const char *symbol, uint32_t *symidx)
{
    if(self->is_use_gnu_hash)
        return xh_elf_gnu_hash_lookup(self, symbol, symidx);
    else
        return xh_elf_hash_lookup(self, symbol, symidx);
}

存在gnu_hash段、sym_name确实不存在于gnu_hash布隆过滤器中时,不应该继续到sysv-hash中查找,而是提前退出。

Mr-JingShi commented 2 years ago

查询一个不存在的数据,容易造成白嫖,布隆过滤器可以快速识别白嫖,识别到白嫖之后就应该快速制止。

caikelun commented 2 years ago

我理解你说的意思。在实际的线上环境中,我们遇到过一些不太正常的so,有符号信息仅存在于.hash但是不存在于.gnu_hash中。

另外,请不要太相信xhook,这真的是一份很老的代码了,很多年前我就已经放弃维护了,xhook的很多细节也没有在线上做过大规模的验证。

Mr-JingShi commented 2 years ago

谢谢老师的细心回答。