0

例如,有一个符号名为country,我可以通过以下方式获取它的信息(类型、地址和长度)nm -D -S

$ nm -D libs_ma.so -S
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w __cxa_finalize
                 w __gmon_start__
0000000000004028 0000000000000008 D country

但是我怎样才能通过一些Linux命令转储长度为(8)的地址(4028)(就像在c程序中工作的dlsym()和printf()一样)?

4

1 回答 1

0

如何通过某些 Linux 命令转储长度为 (8) 的地址 (4028)

您最好的选择可能是使用调试器,例如radare2 或GDB。

这个问题显示了如何在radare2中做到这一点。

以下是使用 GDB 执行此操作的方法:

// foo.c
long country = 0xABCDEF0123456789;

gcc -shared -fPIC -o foo.so foo.c
nm -D foo.so | grep country
0000000000004020 D country

gdb -q --batch -ex 'x/gx 0x4020' foo.so
0x4020 <country>:       0xabcdef0123456789

用您选择的语言编写程序来执行此操作也相当容易。您的程序必须:

  1. 遍历LOAD段,直到找到一个.p_vaddr <= $address < .p_vaddr + .p_memsz
  2. mmapread那个段,寻求$address - .p_vaddr偏移,并从那里转储$length字节。
于 2022-01-30T16:09:09.110 回答