在未剥离的库中的 .init_array 部分中查找函数名称

逆向工程 小精灵 转储 海湾合作委员会 调试符号
2021-07-07 15:27:03

是否可以找出精灵动态库中所有静态初始化的实例。我可以通过像这样的 objdump 命令转储 .init_array 部分中的函数指针数组。 objdump -s -j .init_array <libname.so>

有没有办法将这些函数指针映射回函数名称。我有带有调试符号的未剥离库。

1个回答

这可以通过radare2轻松实现。我安装了这个版本

[rese] r2 -v
radare2 4.6.0-git 25072 @ linux-x86-64 git.4.4.0-486-ga5e8cf0c9
commit: a5e8cf0c9bd94e5f8d679e281c486584f23251e3 build: 2020-07-28__11:41:47

.init_array在程序中启用

#include <stdio.h>
static void f1(void) __attribute__((constructor));
static void f2(void) __attribute__((constructor));
static void f3(void) __attribute__((constructor));

void f1() { puts(__FILE__ ":f1"); }
void f2() { puts(__FILE__ ":f2"); }
void f3() { puts(__FILE__ ":f3"); }

int main(int argc, char **argv) {
    puts(__FILE__ ":main");
    return 0;
}

哪个按预期工作

[rese] make test
cc     test.c   -o test
[rese] ./test
test.c:f1
test.c:f2
test.c:f3
test.c:main

pxr在转储为十六进制时使用注释

[rese] r2 -AA -qq -c 'pxr 0x30 @ sym..init_array' test 
0x00200da0 0x0000000000000680   ........ @loc.__init_array_start 1664 (.text) sym.frame_dummy entry.init0 R X 'push rbp'
0x00200da8 0x000000000000068a   ........ 1674 (.text) sym.f1 sym.f1 R X 'push rbp'
0x00200db0 0x000000000000069d   ........ 1693 (.text) sym.f2 sym.f2 R X 'push rbp'
0x00200db8 0x00000000000006b0   ........ 1712 (.text) sym.f3 sym.f3 R X 'push rbp'
0x00200dc0 0x0000000000000640   @....... @loc.__init_array_end 1600 (.text) sym.__do_global_dtors_aux sym.__do_global_dtors_aux R X 'cmp byte [rip + 0x2009c9], 0'
0x00200dc8 0x0000000000000001   ........ @obj._DYNAMIC 0 loc.imp._ITM_deregisterTMCloneTable R X 'jg 0x47'