【问题标题】:Find file offset of a symbol with nm用 nm 查找符号的文件偏移量
【发布时间】:2016-04-12 07:49:36
【问题描述】:

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

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

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

我在 Mac 上运行 nm

【问题讨论】:

  • 内存中的地址是怎样的?文件未加载。
  • @trojanfoe 因为它比文件大
  • 您需要了解文件是如何映射到内存中的。文本区域的开头类似于100000000,因此如果您能找出文件中文本区域的开始位置,则该符号很可能位于从那里偏移10f8ff 处。你所做的非常先进,所以我希望你已经知道这一点......

标签: macos reverse-engineering nm


【解决方案1】:

假设我们要找到var2的偏移量:

int var1 = 1;
int var2 = 2;

int main(){}

构建后,nm 给出:

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

使用gobjdump (port 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

因此nm返回的var2的地址在.data段中,它在虚拟内存地址100001000处加载,文件偏移为1000。可以得到var2as100001004 - 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  ................

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2018-09-04
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多