计算从exe中的push指令到数据部分中的字符串的偏移量

逆向工程 聚乙烯 C# 抵消
2021-06-24 20:52:08

所以我正在寻找关于这个主题的一些指导。

如果我在 Hexeditor 中打开我的 exe 并转到字符串地址作为参数推送的位置,我有以下内容:

68 7C 9D F1 01 - push 01F19D7C

然而,exe 中的字符串位于 01ADC808。

我确实有相同的 exe,但用于不同的语言。

68 78 DE F0 01 - push 01F0DE78

并且字符串在 01B94B0C。

例如,在 Ghidra 中查看它,push 指令中的地址与字符串的位置匹配。所以目前我最好的猜测是,Ghidra 将数据与 PE 标头中的信息正确对齐。

我正在编写一个修改该字符串的工具。可以为每个版本创建模式,但是我想要一种相当“通用”的方法来解决这个问题。

此外,这里是第一个示例的部分标题的概述: 在此处输入图片说明

如果我的问题不够清楚或需要更多信息,请随时告诉我!

提前感谢您的任何建议!:)

编辑:忘了提及我正在编写的工具是用 C# 编写的。

2个回答

push 402010 被分解了

402010 - base_address - virtual_address_of_section + file_ptr_to_rawdata

您的数据存在一些不一致之处,它必须是计数字符串或帕斯卡字符串等地址 0xc/0x8 之间存在 4 字节不匹配

拆解串推

0:000> u . l4
msgbox!WinMain:
002c1000 55              push    ebp
002c1001 8bec            mov     ebp,esp
002c1003 6a00            push    0
002c1005 6810202c00      push    offset msgbox!⌂USER32_NULL_THUNK_DATA+0x4 (002c2010)

0:000> db 2c2010 l20
002c2010  57 69 6e 64 20 54 65 73-74 00 00 00 54 65 73 74  Wind Test...Test
002c2020  20 54 68 65 20 57 69 6e-64 00 00 00 00 00 00 00   The Wind.......

0:000> ? msgbox
Evaluate expression: 2883584 = 002c0000

0:000> ? 2c2010 -msgbox
Evaluate expression: 8208 = 00002010

0:000> .shell -ci "!dh -s msgbox" grep -A 5 #2
SECTION HEADER #2
  .rdata name
     206 virtual size
    2000 virtual address
     400 size of raw data
     600 file pointer to raw data


0:000> ? 0x2010 - 0x2000 + 0x600
Evaluate expression: 1552 = 00000610

0:000> q
quit:

在十六进制编辑器上显示

:\>xxd -g 1 -s 0x610 -l0x20 msgbox.exe
0000610: 57 69 6e 64 20 54 65 73 74 00 00 00 54 65 73 74  Wind Test...Test
0000620: 20 54 68 65 20 57 69 6e 64 00 00 00 00 00 00 00   The Wind.......

你是对的,这是因为对齐。有两种类型的节对齐。在磁盘上对齐,在内存中对齐。它们通常分别等于 0x400 和 0x1000。当您在 hexeditor 中打开 exe 时,您应该注意到您的 .text 部分从 0x400 开始,但 Ghidra 向您显示 exe 就像它在内存中一样,因此 .text 现在从 401000(图像库 + 虚拟地址)开始。解决这个问题的最好方法是使用:

CreateFileMapping、MapViewOfFile、ViewMapOfFile