gdb可以使函数指针指向另一个位置吗?

我会解释:

让我们说,我有兴趣替换某个应用程序使用的rand()函数。

所以我附加gdb到这个过程,并使其加载我的自定义共享库(它有一个自定义的rand()函数):

call (int) dlopen("path_to_library/asdf.so")

这将把定制的rand()函数放在进程的内存中。然而,在这一点上,符号rand仍然指向默认的rand()函数。有没有办法使gdb指向新的rand()函数的符号,强制进程使用我的版本?

我必须说我也不允许使用LD_PRELOAD(linux)和DYLD_INSERT_LIBRARIES(mac os x)方法,因为它们允许代码注入只在程序执行的开始。

我想替换rand()的应用程序启动几个线程,其中一些启动新的进程,我有兴趣在这些新进程之一上注入代码。正如我上面提到的,GDB是伟大的这一目的,因为它允许代码注入到一个特定的过程。

我跟着this postthis presentation,并想出了以下一组用于OSX的gdb命令与x86-64可执行文件,当附加到进程可以加载-x选项:

set $s = dyld_stub_rand
set $p = ($s+6+*(int*)($s+2))
call (void*)dlsym((void*)dlopen("myrand.dylib"), "my_rand")
set *(void**)$p = my_rand
c

魔术是在set $ p = …命令。 dyld_stub_rand是一个6字节的跳转指令。跳转偏移量在dyld_stub_rand 2(4字节)。这是一个$ rip相对的跳转,所以添加偏移到$ rip在这一点(紧接在指令后,dyld_stub_rand 6)。

这指向一个符号表项,它应该是真正的rand或动态链接器例程来加载它(如果它从未被调用)。然后由my_rand替换。

有时gdb会从libSystem或另一个共享库中获取dyld_stub_rand,如果发生这种情况,请先运行remove-symbol-file,然后再运行其他命令。

http://stackoverflow.com/questions/3270281/can-gdb-make-a-function-pointer-point-to-another-location

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:gdb可以使函数指针指向另一个位置吗?