是否可以找出精灵动态库中所有静态初始化的实例。我可以通过像这样的 objdump 命令转储 .init_array 部分中的函数指针数组。
objdump -s -j .init_array <libname.so>
有没有办法将这些函数指针映射回函数名称。我有带有调试符号的未剥离库。
是否可以找出精灵动态库中所有静态初始化的实例。我可以通过像这样的 objdump 命令转储 .init_array 部分中的函数指针数组。
objdump -s -j .init_array <libname.so>
有没有办法将这些函数指针映射回函数名称。我有带有调试符号的未剥离库。
这可以通过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'