Menooker / PFishHook

An x64 inline hook library
Apache License 2.0
30 stars 10 forks source link

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

Closed jacksonfu closed 5 months ago

jacksonfu commented 5 months ago

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

jacksonfu commented 5 months ago

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

Menooker commented 5 months ago

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

Menooker commented 5 months ago

试试看调整一下https://github.com/Menooker/PFishHook/blob/6b900bb3d8d1bdc813fb1a6b2aa9daece843991b/inline_hook.cpp#L121

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

Menooker commented 5 months ago

试试看调整一下https://github.com/Menooker/PFishHook/blob/6b900bb3d8d1bdc813fb1a6b2aa9daece843991b/inline_hook.cpp#L121

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

jacksonfu commented 5 months ago

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

jacksonfu commented 5 months ago

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

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,我尝试着改成了+=就可以返回成功了。

https://github.com/Menooker/PFishHook/blob/b83acd469bef429c922cc299ccd27d72b7e1189c/inline_hook.cpp#L168

Menooker commented 5 months ago

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

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

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

jacksonfu commented 5 months ago

谢谢大佬解答!

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

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

Menooker commented 5 months ago

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

jacksonfu commented 5 months ago

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

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

Menooker commented 5 months ago

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

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

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