WeHack BBS
接下来要看看怎么把Win32 PE文件还原为汇编 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 逆向工程讨论区 (https://bbs.wehack.space/forum-9.html)
+--- 主题: 接下来要看看怎么把Win32 PE文件还原为汇编 (/thread-131.html)



接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 01-29-2020

和裸数据不一样,PE文件是有元数据的,所以想还原出一个完全相同的PE文件是有难度的,只能还原出一个功能相同的文件。
一个难点在于工具链,winegcc只能把C代码变成链接到libwine的so文件,mingw的工具链倒是可以把ELF的目标文件链接成PE,但是Windows API的符号名不知道为什么要改动。
其他的工作和r2dumpbin的做法应该类似,而且PE文件有分段信息,应该更容易区分代码和数据。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 11-04-2020

前几天做 Broadwell 的 refcode.elf 的时候,我给 r2dumpbin 加入了重定位的支持,对于某些类型的文件会有帮助。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 04-07-2021

gcc 会把 ExitProcess 的符号名变成 __imp__ExitProcess@4, 这是因为 ExitProcess(uint32_t) 的函数原型有两个 attribute.

__attribute__((dllimport)) 把 func 的符号名变成 __imp__func.
__attribute__((__stdcall__)) 把 func(int) 的符号名变成 _func@4.
两者一起使用,即 __attribute__((dllimport)) int __attribute__((__stdcall__)) func(int) 把 func 的符号名变成 __imp__func@4.


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 04-09-2021

这几天用r2dumpbin反汇编wine的32位notepad.exe,修改输出的汇编可以汇编并链接成功,但是产生的是一个功能残缺的记事本。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 05-03-2021

notepad.exe的dump终于搞定了,现在能生成一个看起来比较正常的记事本。

一个关键点:不要输出.idata节到汇编里面。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 05-05-2021

wine里面有个winedump程序,可以输出PE文件的信息。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 05-08-2021

刚刚r2dumpbin把大富翁4的rich4.exe还原为了汇编。有几个要点:

- 它有.reloc节,说明程序可重定位,并且可以通过重定位信息获得所有的指针。
- 有大量的函数需要手动标记,一部分是结构体里的指针常量,一部分是用mov填入内存的回调函数指针,还有的是Windows API用的回调函数。
- radare2/rizin解析PE节有bug,rich4.exe的DGROUP节权限是rw-,但r2却认为没写权限。结果得到的文件运行时出现访存异常,最后把DGROUP改成.data就正常了。后来用winedump确认了DGROUP节是可写的。

刚刚试跑了一下,程序还是有问题的,不知道哪里出错了。


RE: 接下来要看看怎么把Win32 PE文件还原为汇编 - vimacs - 05-09-2021

对比了一下代码,发现是capstone反汇编movs系列指令的问题。

代码:
bits 32

repne movsd ; capstone misses repne
db 0x66, 0xa5 ; movsw
db 0xf3, 0x66, 0xa5 ; rep movsw
db 0x66, 0xf3, 0xa5 ; capstone says rep movsd
db 0x66, 0xf3, 0xa4 ; rep movsb, capstone doesn't show o16/data16

; ndisasm -b 32 movs
; 00000000  F2A5              repne movsd
; 00000002  66A5              movsw
; 00000004  F366A5            rep movsw
; 00000007  66F3A5            rep movsw
; 0000000A  66F3A4            rep o16 movsb

; $ objdump -d movs.o
;
; 00000000 <.text>:
;    0:    f2 a5                    repnz movsl %ds:(%esi),%es:(%edi)
;    2:    66 a5                    movsw  %ds:(%esi),%es:(%edi)
;    4:    f3 66 a5                 rep movsw %ds:(%esi),%es:(%edi)
;    7:    66 f3 a5                 rep movsw %ds:(%esi),%es:(%edi)
;    a:    66 f3 a4                 data16 rep movsb %ds:(%esi),%es:(%edi)

; $ llvm-objdump -d movs.o
;
; 00000000 <.text>:
;        0: f2 a5                            repne        movsl    (%esi), %es:(%edi)
;        2: 66 a5                            movsw    (%esi), %es:(%edi)
;        4: f3 66 a5                         rep        movsw    (%esi), %es:(%edi)
;        7: 66 f3 a5                         rep        movsw    (%esi), %es:(%edi)
;        a: 66 f3 a4                         rep        movsb    (%esi), %es:(%edi)