使用nm查找符号的文件偏移量

时间:2016-04-12 07:49:36

标签: macos reverse-engineering nm

我正在尝试使用脚本修补程序。所以我需要一个符号的文件偏移量

但是nm只在内存中打印地址,我怎样才能找到它的文件偏移?

%> nm a | grep checkUpdate
000000010010f8ff t -[UIManager checkUpdate]

我在Mac上运行nm

1 个答案:

答案 0 :(得分:0)

让我们说我们想要找到var2

的偏移量
int var1 = 1;
int var2 = 2;

int main(){}

构建后,nm给出:

nm -a a.out | grep var
0000000100001000 D _var1
0000000100001004 D _var2

使用gobjdumpport install binutils),我们可以阅读程序标题:

gobjdump -x a.out

a.out:     file format mach-o-x86-64
a.out
architecture: i386:x86-64, flags 0x00000012:
EXEC_P, HAS_SYMS
start address 0x0000000100000f90

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000000b  0000000100000f90  0000000100000f90  00000f90  2**4
                  CONTENTS, ALLOC, LOAD, CODE
  1 __TEXT.__unwind_info 00000048  0000000100000f9c  0000000100000f9c  00000f9c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .eh_frame     00000018  0000000100000fe8  0000000100000fe8  00000fe8  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .data         00000008  0000000100001000  0000000100001000  00001000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
0000000100000000 g       0f SECT   01 0010 [.text] __mh_execute_header
0000000100000f90 g       0f SECT   01 0000 [.text] _main
0000000100001000 g       0f SECT   04 0000 [.data] _var1
0000000100001004 g       0f SECT   04 0000 [.data] _var2
0000000000000000 g       01 UND    00 0100 dyld_stub_binder

因此var2返回的nm地址位于.data部分,该部分加载到虚拟内存地址100001000并且文件偏移量为1000。您可以将var2的文件偏移量设为100001004 - 100001000 + 1000 = 1004

可以使用十六进制编辑器验证:

256 0000ff0: 017a 5200 0178 1001 100c 0708 9001 0000  .zR..x..........
257 0001000: 0100 0000 0200 0000 0000 0000 0000 0000  ................
258 0001010: 0000 0000 0000 0000 0000 0000 0000 0000  ................