“原始”偏移量到“反汇编”偏移量?

逆向工程 十六进制 抵消
2021-07-07 03:53:21

这是一个非常愚蠢的问题,但令人惊讶的是我今天遇到了这个问题。在十六进制编辑器中,我找到了一个偏移量,我想在反汇编器中查看该代码。在十六进制编辑器中,偏移量是 EBE75,它看起来像这样:

在此处输入图片说明

显然是一个 CALL,我想在 IDA/Olly 中找到它并查看一下。然而,这是我不确定如何将其转换为 IDA/Olly 可以理解的抵消。我是否添加了图像库,或者 .text 部分的偏移量?我设法使用 IDA 的 hexscan 找到了代码,它位于地址004ECA75

在此处输入图片说明

这些地址之间的区别是4ECA75 - EBE75 = 400C00这让我很惊讶,这个数字是从哪里来的?这与 .exe 的布局有什么关系?

2个回答

要将 PE 文件中的原始偏移量转换为其对应的“反汇编器偏移量”(称为虚拟地址或 VA),您需要执行以下步骤:

步骤1

使用 PE 编辑器,查看 PE 文件的节表以查找包含文件偏移量的节。

例如,假设您的 PE 文件的节表如下所示:

+-----------------------------------------------------------------+
|  Name  | Virtual Address | Virtual Size | Raw Offset | Raw Size |
|--------+-----------------+--------------+------------+----------|
| .text  |    00001000     |   00152CA1   |  00000400  | 00152E00 |
| .data  |    00154000     |   000040C0   |  00153200  | 00004200 |
| .rsrc  |    00159000     |   00062798   |  00157400  | 00062800 |
| .reloc |    001BC000     |   00003B3C   |  001B9C00  | 00003C00 |
+-----------------------------------------------------------------+

您可以在上面看到包含原始偏移量EBE75.text部分是该部分,因为00000400 <= EBE75 < 00153200.

第2步

使用 PE 编辑器,查找 PE 文件的映像库。例如,假设您的文件的图像库是00400000.

第 3 步

执行以下计算:

(target raw offset) - (raw offset of section) + (virtual address of section) + (image base)
= (target virtual address)

填写上面的示例值,我们发现原始偏移量的虚拟地址为EBE75

EBE75 - 00000400 + 00001000 + 00400000
= 4ECA75

ollydbg 1.10

如果你有

  1. ollydbg 中加载的二进制文件
  2. disasm 窗口在正确的模块中
  3. 二进制文件也在十六进制编辑器中打开

    右键单击 -> 查看 -> 可执行文件

在新窗口中ctrl+g输入你在 hexeditor 中看到的偏移量ebe75

right click in new window -> follow in disassembler

在十六进制编辑器 0x1529 中有 0xe8 操作码

xxd -s 0x1520 -l 0x10 -g 1 c:\WINDOWS\system32\calc.exe
0001520: ff d6 6a 01 a3 4c 4d 01 01 e8 e9 f8 ff ff 6a 69  ..j..LM.......ji

在 ollydbg 中右键单击-> 查看-> 可执行文件并在新窗口中按 ctrl+g 1520

00001520    FFD6            CALL    NEAR ESI
00001522    6A 01           PUSH    1
00001524    A3 4C4D0101     MOV     DWORD PTR DS:[1014D4C], EAX
00001529    E8 E9F8FFFF     CALL    00000E17
0000152E    6A 69           PUSH    69

在新窗口中右键单击 -> 在反汇编器中查看图像

01002120  |.  FFD6                   CALL    NEAR ESI                         ; \GetProfileIntW
01002122  |.  6A 01                  PUSH    1                                ; /Arg1 = 00000001
01002124  |.  A3 4C4D0101            MOV     DWORD PTR DS:[gbUseSep], EAX     ; |
01002129  |.  E8 E9F8FFFF            CALL    InitSciCalc                      ; \InitSciCalc
0100212E  |.  6A 69                  PUSH    69                               ; /TableName = 69