考虑mono / domain.c中的以下代码:
static MonoDomain *mono_root_domain = NULL;
...
MonoDomain* mono_get_root_domain (void)
{
return mono_root_domain;
}
我的任务是从另一个进程读取运行时mono_root_domain指针指向的结构数据。 (已经解决了从这个其他过程中附加,读取,定位dylib等)
查看生成的libmono dylib,我可以找到相应的符号:
此符号指向0x2621A8的地址,该地址位于本地重定位部分(__DATA,__ bss):
这指向0x1A7690(__TEXT,__ sinmbol_stub)的地址:
所以0x1A7DF8(__TEXT,__ stub_helper):
此时我完全忘记了如何检索指向MonoDomain结构的实际指针。任何帮助表示赞赏。
答案 0 :(得分:0)
出于安全原因并防止缓冲区溢出攻击和其他攻击,您无法知道,因为称为PIE或ASLR(地址空间布局随机化)的安全措施。但是,可以禁用此功能以进行调试。 LLDB和GDB做/可以调试可执行文件。使用CLI应用程序的方式如下:
cd
打开您的可执行文件chmod +x ./change_mach_o_flags.py
以使脚本可执行./change_mach_o_flags.py --no-pie ./YourExecutable
现在,您的可执行文件的地址不应再随机化了。因此,可以计算静态/全局变量的地址。为此,请在终端中执行以下操作(我假设您使用的是64位计算机):
otool -v -l ./YourExecutable | open -f
(这将生成一个文件文本,其中包含可执行文件中有关如何在内存中布局DATA,TEXT等的命令)
查找您感兴趣的部分。查看addr
字段。如果它包含让我们说0x0000000100001020
,那么变量将被放置在ASLR禁用的位置。
我不确定这是否适用于dylib但您可以试试。现在我已经没时间了,但是我可以在家里试一试,看看这是否适用于dylibs。