如何在可执行文件中找到加密的字符串?

逆向工程 视窗 加密 风袋 编码 字符串
2021-06-15 19:14:28

我正在尝试对可执行文件进行逆向工程。

我正在使用进程资源管理器转储 exe 映像中存在的所有字符串,并在进程运行时从进程的 RAM 中转储。

进程资源管理器字符串转储

这两个转储返回不同数量的字符串,后者(来自 RAM)返回更多数量的字符串。这种差异可能意味着以下情况之一。

  1. 可执行文件被加密(使用了打包程序?)
  2. 可执行文件被压缩
  3. 字符串被加密/混淆
  4. 字符串来自进程加载的 DLL 或由它打开的文件。

我使用了各种工具来排除 1 和 2。这些工具检查文件熵并进行其他统计检查来解决这个问题。

我使用的一些工具:

  1. 检查正在使用的打包程序:https : //www.aldeid.com/wiki/PEiD
  2. 加密/压缩的统计分析 - 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 中。这怎么可能?

1个回答

在我的分析过程中,我使用Floss!,它是一个出色的工具,使用起来非常简单,有几次我可以找到我要找的字符串,您使用 PEID 检查加壳器请使用更新的工具,例如DIE(轻松检测),如果它是 .EXE 文件,请考虑使用专业且更新的调试器(如 x96DBG(x64dbg/x32dbg))进行分析,我相信您会通过这种方式获得更好的结果。