场景:
我试图对移动基板 dylib 进行逆向工程。通过 IDA,dylib 在构造函数中调用了 MSHookFunction(),参数来自 dlopen 和 dlsym。IDA 未能显示 dlopen 和 dlsym 的符号,所以我不得不求助于 gdb,它可能会在运行时打印 dlsym 的第二个参数,一个 char*。
目标:
用 gdb 在这个 dylib 的构造函数的最开始处中断。
第一个想法:
dylib 的构造函数在加载后立即执行,进行所有必要的初始化(如果我错了,请纠正我)。所以我写了一个命令行工具,它简单地 dlopen dylib 然后 dlclose 它,以运行构造函数。仅供参考,这是 dylib 和命令行工具的代码:
// iOSTestDylib.dylib: I'm using [Logos][1] here
%ctor
{
%init;
NSLog(@"snakeninny: ctor of dylib");
}
// iOSTestTool
#include <mach-o/dyld.h>
#include </usr/include/dlfcn.h>
int main(int argc, char **argv, char **envp)
{
NSLog(@"snakeninny: line 6 of command line tool");
void *handle = dlopen("pathOfTheAboveDylib", RTLD_LAZY);
NSLog(@"snakeninny: line 8 of command line tool");
dlclose(handle);
return 0;
}
你可以猜到,一旦我运行 iOSTestTool,它就会打印:
- snakeninny:命令行工具的第 6 行
- snakeninny:dylib 的 ctor
- snakeninny:命令行工具的第 8 行
然后在 iOSTestDylib.dylib 中设置一个断点似乎可以解决问题。但是突然发现,在dlopen iOSTestDylib.dylib之前,iOSTestDylib.dylib的ASLR偏移是未知的,所以bp的地址是不确定的。同时,在dlopen之后,虽然我们可以计算出ASLR偏移量,但是ctor已经被执行了,所以bp变得毫无意义。在任何一种情况下,我都无法打破 dylib 的构造函数。任务失败了,我也没有再想,也没有B计划:(
问题:
我应该怎么做才能达到我的目标?