我正在开发一个项目,我需要使用LD_PRELOAD
将一些库加载到内存空间。
就像:
LD_PRELOAD="./libapp.so" ./my_app
由于某些原因(我实际上正在进行一些二进制黑客操作),我必须知道某些功能的内存地址(不是符号)(比如说,{{1在foo
中{}}并在执行前检测libapp.so
的二进制代码。
但是,由于my_app
(地址空间布局随机化),每次ASLR
都会被加载到不同的内存地址,而我之前无法知道libapp.so
的内存地址执行。
我想以某种方式拦截加载时间,读出foo
的内存地址,在libapp.so
上使用内存地址my_app
执行一些检测,然后加载{{1进入内存空间。
所以这是我的问题:如何拦截加载过程并获取foo
的内存地址?
答案 0 :(得分:0)
所以这是我的问题:如何拦截加载过程并获取libapp.so的内存地址?
这不起作用:在加载器启动之前,内核将my_app
加载(mmap
到内存中),并且在它有机会查看之前LD_PRELOAD
。
您最好的选择是在禁用ASLR的情况下运行应用程序(setarch $whatever -R my_app
),或安排may_app
,以便libapp.so
能够动态识别my_app
自己的加载地址。