我正在尝试对可执行文件进行逆向工程。
我正在使用进程资源管理器转储 exe 映像中存在的所有字符串,并在进程运行时从进程的 RAM 中转储。
这两个转储返回不同数量的字符串,后者(来自 RAM)返回更多数量的字符串。这种差异可能意味着以下情况之一。
- 可执行文件被加密(使用了打包程序?)
- 可执行文件被压缩
- 字符串被加密/混淆
- 字符串来自进程加载的 DLL 或由它打开的文件。
我使用了各种工具来排除 1 和 2。这些工具检查文件熵并进行其他统计检查来解决这个问题。
我使用的一些工具:
- 检查正在使用的打包程序:https : //www.aldeid.com/wiki/PEiD
- 加密/压缩的统计分析 -
binwalk -EJ <exe-name>, https://github.com/kiathan/Encryption-Detector
为了排除 4,我使用进程资源管理器检查每个打开的文件句柄和加载的 DLL。没有发现任何可疑之处。
对于 3,我进行了如下操作。
我将进程附加到 WinDbg,并尝试从进程资源管理器获得的 RAM 字符串转储中搜索字符串。
例如。搜索字符串“--control”。
s -a 0 L?80000000 "--control"
该字符串出现在 location 014ebbf5。为了弄清楚这个地址存在于哪种内存中,我使用了 WinDbg 的!address命令。
这是我得到的输出。
Usage: Image
Base Address: 01165000
End Address: 01560000
Region Size: 003fb000 ( 3.980 MB)
State: 00001000 MEM_COMMIT
Protect: 00000002 PAGE_READONLY
Type: 01000000 MEM_IMAGE
Allocation Base: 00c70000
Allocation Protect: 00000080 PAGE_EXECUTE_WRITECOPY
Image Path: C:\Program Files (x86)\<exe-path>.exe
Module Name: <exe-name>
Loaded Image Name: C:\Program Files (x86)\<exe-path>.exe
Mapped Image Name:
More info: lmv m <exe-name>
More info: !lmi <exe-name>
More info: ln 0x14ecbf5
More info: !dh 0xc70000
Content source: 1 (target), length: 7340b
我原以为这是来自stack或来自的地址heap,但它来自进程READ ONLY区域,其中存在可执行文件的内存映射文件。只读区域不能存储解码后的字符串,因为您必须读取编码后的字符串,对其进行解码,然后将它们写入某处。
在这一点上,我觉得 exe 既没有加密,也没有压缩,也没有对字符串进行编码/加密。尽管如此,不知何故,许多字符串并不存在于 exe 中,而是存在于 RAM 中。这怎么可能?
