Closed Mr-JingShi closed 2 years ago
这个函数是用来查询导入符号的,.gnu_hash中不包含导入符号。你可以仔细看下这个函数中每种查找的注释,约靠前的查找方式查找到的概率越大,如果概率相同,则速度快的放在前面。
大佬,不好意思,这个文件相似符号名字的函数太多了,我标记错位置了。 应该是这个位置: 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中查找,而是提前退出。
查询一个不存在的数据,容易造成白嫖,布隆过滤器可以快速识别白嫖,识别到白嫖之后就应该快速制止。
我理解你说的意思。在实际的线上环境中,我们遇到过一些不太正常的so,有符号信息仅存在于.hash但是不存在于.gnu_hash中。
另外,请不要太相信xhook,这真的是一份很老的代码了,很多年前我就已经放弃维护了,xhook的很多细节也没有在线上做过大规模的验证。
谢谢老师的细心回答。
https://github.com/bytedance/bhook/blob/19f99d96c5e561b8e3598498024ef1285ee59c83/bytehook/src/main/cpp/bh_elf.c#L499
大佬,你好 关于符号的查找,个人觉得xhook的写法更好: 布隆过滤器对于item存在是有误判的,但对于item不存在是有精准保障的。 所以存在gnu_hash段、sym_name确实不存在于gnu_hash布隆过滤器时,不应该继续查找。