我有一个运行中的内存转储另存为原始二进制文件。这不是一个独立的可执行文件-实际上只是运行内存的快照。

我正在寻找一个工具来帮助我识别此二进制文件中的汇编指令。是否存在这样的工具?

我知道您可以使用OllyDebug或IDAPRO分析可执行文件。但是,由于这是一个完整的内存转储,因此我不清楚这些工具是否仍然适用。对于原始内存转储,IDA并没有明确的切入点。

任何建议都将非常有帮助。谢谢!

评论

我可能会先从易变性之类的东西来分析内存转储,并隔离其中的各个部分,这可能需要更深入的分析。
您是如何获得此快照的?它来自哪个操作系统?它的大小是多少?

它是进程的内存转储(虚拟内存,用户模式)还是整个PC的内存转储(物理内存,内核转储)?

您能告诉我们有关在内存转储中期望其操作码的体系结构的任何具体信息吗?

如果我正确理解了问题,则(几乎)不可能(因为)正在运行的应用程序会修改其寄存器,因此您至少需要了解EIP,但其他值很可能会控制执行流程。因此,您最好将WinDbg之类的东西附加到正在运行的进程中,而不要创建内存转储。

#1 楼

反汇编

您可以在WinDbg中的任何内存地址反汇编,例如

在我的示例中,没有必要反汇编DLL标头中的MZ魔术字节)。 DLL的一部分

代码应主要位于DLL或EXE中(在WinDbg中称为映像或模块)。要在内存转储(内核或用户模式)中找到它们,可以运行WinDbg命令

0:067> db 000007fe`ff4d0000
000007fe`ff4d0000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
000007fe`ff4d0010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......
000007fe`ff4d0020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
000007fe`ff4d0030  00 00 00 00 00 00 00 00-00 00 00 00 e0 00 00 00  ................
000007fe`ff4d0040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th
000007fe`ff4d0050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f  is program canno
000007fe`ff4d0060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t be run in DOS 
000007fe`ff4d0070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$.......

0:067> u 000007fe`ff4d0000 L1
advapi32!WmipBuildReceiveNotification <PERF> (advapi32+0x0):
000007fe`ff4d0000 4d5a            pop     r10


从WinDbg帮助: br /> .imgscan命令扫描虚拟内存中的图像标头。

.imgscan命令显示其找到的所有图像标头和标头类型。标头类型包括可移植可执行(PE)标头和Microsoft MS-DOS MZ标头。有,它什么也不会输出。

来自用户模式转储的示例输出:

可用。在用户模式转储的情况下,我曾使用过

.imgscan


将DLL写入磁盘并在以后进行分析。

<Range>根据地址和范围语法,例如

MZ at 000007fe`ff4d0000, prot 00000004, type 00020000 - size db000
  Name: ADVAPI32.dll


这可能不适用于内核模式转储,因为模块的某些部分可能已交换到磁盘,因此内存中的DLL不再完整。

这种方法也将找不到动态生成的代码。

查找潜在的可执行文件代码

可以执行的代码必须驻留在设置了executable标志的内存块中。

不幸的是命令

.writemem <FileName> <Range>


在WinDbg 6.2.9200中损坏。它应该在用户模式转储中工作,并输出可执行的开始和结束地址列表。

目前,我只得到

.writemem advapi32.dll 000007fe`ff4d0000 Ldb000


尽管我有一个完整的内存转储

!address -f:<filter>


但是你得到这个想法,也许可以将其应用于其他工具。

评论


非常感谢!由于没关系,我将删除评论,以便在此进行清理。

–T.Todua
8月19日15:38

#2 楼

如果您知道处理器的类型以及字节序的大小,则可以搜索函数中使用的常见操作码。例如,在x86中常见的操作码如下:

push    ebp
mov     ebp, esp
add     esp ...


,二进制形式为55 8B EC 83 C4,然后在转储中搜索它。

如果发现包含高密度操作码的区域,则可能是代码。