我想挂钩到mmap和munmap,通常在内存分配器函数中调用libc内部。一种方法是LD_PRELOAD - 无论如何要做到这一点编程?请注意,我想钩住libc中的mmap/munmap,而不是来自我的应用程序。Hook mmap/munmap without LD_PRELOAD
0
A
回答
1
LD_PRELOAD
只能在glibc中重定向函数调用,以获取与分配器(malloc
,free
等)相关的一小部分函数。系统调用通常是内联的,所以根本不涉及函数调用。正如Antti Haapala所说,使用ptrace
,或者您也可以使用systemtap或手动编写的内核模块。
0
是否有编程方式做到这一点?
有,但它不漂亮。
可以扫描的libc.so.6
的.text
,寻找CALL __mmap
指令,那就是:0xE8
(或其它操作码CALL
),随后4个字节等于下一指令和__mmap
之间增量。
一旦你找到了这样的指令,就可以mprotect
页面可写,它更新为CALL
不同的套路,并mprotect
回来。
有几个缺点:
- 这是一个总黑客。
- 您最好确保在修补时没有线程同时运行。
- 您最好确保在修补时不要拨打
malloc
(或其他可以调用您正在修补的代码)。 - 错误肯定是可能的(看起来像
CALL
的字节序列实际上可能不是CALL
)。在我看来,这从未发生过。 - 在64位的过程中,你的目标程序可能离
CALL
更远,然后+/-2GiB
偏移量你可以填入CALL
指令本身。解决这个问题需要另外一个粗陋的窍门(CALL
给蹦床,你可以在libc.so.6
本身内建立足够长的NOP
s序列;蹦床可以执行任意地址的JMP
)。
我提到这不美吗?
另一种选择是建立自己的libc.so.6
,其中__mmap
和__munmap
例程通过PLT公开。这个补丁很小,但是只有在你运行的每个地方都可以使用你自己的GLIBC版本的情况下,这个补丁才有效。
0
这取决于你需要什么。您可以随时使用env或putenv()设置备用环境,然后执行目标程序。同样,你可以使用gdb将一个断点添加到进程中。
为什么你不描述你的真实任务?
相关问题
- 1. Hook for pthread_create
- 2. LD_PRELOAD,bash和printf
- 3. LD_PRELOAD帮助
- 4. LD_PRELOAD更改LD_LIBRARY_PATH
- 5. LD_PRELOAD与MySQL
- 6. LD_PRELOAD麻烦
- 7. AIX上的LD_PRELOAD
- 8. 重写使用LD_PRELOAD
- 9. 的Linux,LD_PRELOAD错误
- 10. 替代LD_PRELOAD或LD_LIBRARY_PATH
- 11. libfaketime和Mac OS,LD_PRELOAD
- 12. Hook FindWindow
- 13. CreateFile Hook
- 14. Subversion Hook
- 15. Valgrind和LD_PRELOAD - 无法预装对象
- 16. Drupal 6 - hook theme_preprocess(&$ vars,$ hook)多次调用
- 17. 为什么add-hook允许`hook'无效?
- 18. LD_PRELOAD与几个源文件
- 19. Android 4.2 - 是否支持LD_PRELOAD?
- 20. LD_PRELOAD不工作的printf
- 21. LD_PRELOAD加载的事件
- 22. 的Android LD_PRELOAD相当于
- 23. 带文件功能的LD_PRELOAD
- 24. LD_PRELOAD套接字函数java
- 25. 不能拦截PyDict_New与LD_PRELOAD
- 26. Deface _products data-hook
- 27. gitosis auto merge hook
- 28. post commit hook fail
- 29. WSARecv Detour hook crypt
- 30. GitHub:Enterprise post-receive hook
在Linux上,使用'ptrace' ... –