Menooker/PFishHook

需要跳转的偏移大于32位数值,会直接报allocfail

Closed this issue · 11 comments

#9 mmap出来的位置至少比旧函数的地址大INT32_MAX,代码中会导致出错。

@Menooker 大佬,有没有什么通用简单的解法?我们是hook exit,是比较确定的,倒是可以强行改成绝对地址。
如果要通用,是不是要把所有的lea,mov那些都枚举一遍来转换。

在我最新的pr里面,修复了一个mmap搜索地址的错误,你可以试一下那个分支嘛?其实我本地也遇到了alloc失败的问题。还有就是你可以调整一下MemChunk的buffer大小嘛?目前是8MB,最小到4kb都是可以的

试试看调整一下

#define MCHUNK_SZ (8*1024*1024)

MCHUNK_SZ 大小吧?这个如果太大,可能塞不到已经分配内存的缝隙里面

试试看调整一下

#define MCHUNK_SZ (8*1024*1024)

MCHUNK_SZ 大小吧?这个如果太大,可能塞不到已经分配内存的缝隙里面

好滴,感谢大佬,我去试试

大佬,抱歉现在才回复您,非常感谢您的建议!

MCHUNK_SZ 大小吧?这个如果太大,可能塞不到已经分配内存的缝隙里面

我调成了4k是可以的。
有个小疑问,我看在代码里面获取了页表大小,为什么不直接用页表大小来调用mmap?而是要用8M作为mmap的大小。这里有什么讲究吗?

在我最新的pr里面,修复了一个mmap搜索地址的错误,你可以试一下那个分支嘛?其实我本地也遇到了alloc失败的问题。还有就是你可以调整一下MemChunk的buffer大小嘛?目前是8MB,最小到4kb都是可以的

另外, 我用了最新提交,还是会报alloc错误。

不过我注意到一个问题,不知道我有没有看懂代码,好像遍历寻找合适mmap范围的时候并没有比较addr跟mmap的返回值两者之间的大小,可能我的系统有点老,ubuntu16的,mmap出来的地址会比较小(addr > mmap_retvalue),但是范围变化却是tryaddr-=search_step,我尝试着改成了+=就可以返回成功了。

for(auto tryaddr = addr;;tryaddr-=search_step){

8mb原来是想一次多分配一些内存,这样可以减少mmap的次数,因为每次mmap我们都要浪费MemChunk头上几个字节来管理内存。

搜索mmap地址的问题确实需要改进,应该从addr的前后2gb内存的范围进行搜索。此外下面addr_ok这边已经检查了地址差距是否在2gb以内了。

我接下来提个pr改进搜索算法,到时候能否麻烦您测一下呢?谢谢!

谢谢大佬解答!

我接下来提个pr改进搜索算法,到时候能否麻烦您测一下呢?

可以的,你提交之后记得@我一下,我怕我可能没看到

@jacksonfu #12 我提交了这个PR,能不能帮忙测试一下?谢谢啦

@jacksonfu #12 我提交了这个PR,能不能帮忙测试一下?谢谢啦

大佬,我已经测过了,我看到提交中改成了pagesize,我试了pagesize和8M的情况,都符合预期。

@jacksonfu #12 我提交了这个PR,能不能帮忙测试一下?谢谢啦

大佬,我已经测过了,我看到提交中改成了pagesize,我试了pagesize和8M的情况,都符合预期。

谢谢~很开心问题得到解决了。pr已经合并!