2

场景:

我试图对移动基板 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,它就会打印:

  1. snakeninny:命令行工具的第 6 行
  2. snakeninny:dylib 的 ctor
  3. snakeninny:命令行工具的第 8 行

然后在 iOSTestDylib.dylib 中设置一个断点似乎可以解决问题。但是突然发现,在dlopen iOSTestDylib.dylib之前,iOSTestDylib.dylib的ASLR偏移是未知的,所以bp的地址是不确定的。同时,在dlopen之后,虽然我们可以计算出ASLR偏移量,但是ctor已经被执行了,所以bp变得毫无意义。在任何一种情况下,我都无法打破 dylib 的构造函数。任务失败了,我也没有再想,也没有B计划:(

问题:

我应该怎么做才能达到我的目标?

4

0 回答 0