windbg - 在 IDA Pro 中分析从内存转储中获取的二进制文件

标签 windbg binaryfiles disassembly ida

我在 IDA Pro 中分析简单的二进制文件时遇到问题。

运行程序时,我使用WinDbg将其部分内存(例如内存中解压的代码部分)转储到文件中。

我想使用 IDA 对其进行分析,但是当尝试加载二进制文件时 - 它只会显示其原始数据。

当然,二进制文件不是完整的 PE 文件,因此我并不期望进行深入分析,只是一种更好的方式来读取反汇编代码。

所以问题是 - 我怎样才能让 IDA 反汇编二进制文件?

谢谢! :)

最佳答案

选择适当的地址并按 c 即MakeCode(Ea); ida 会将原始字节转换为代码并反汇编它

下面粘贴的是一个带有 idc 脚本的简单自动化,但 idas 自动化是恕我直言,所以你应该坚持在用户界面中手动按下 C

:dir /b
foo.dmp
foo.idc    
:xxd foo.dmp
0000000: 6a10 6830 b780 7ce8 d86d ffff 8365 fc00  j.h0..|..m...e..
0000010: 64a1 1800 0000 8945 e081 7810 001e 0000  d......E..x.....
0000020: 750f 803d 0850 887c 0075 06ff 15f8 1280  u..=.P.|.u......
0000030: 7cff 750c ff55 0850 e8c9 0900 00         |.u..U.P.....    
:type foo.idc
#include <idc.idc>
static main (void) {
        auto len,temp,fhand;
        len = -1; temp = 0;
        while (temp < 0x3d && len != 0 ) {
                len = MakeCode(temp);
                temp = temp+len;
        }
        fhand = fopen("foo.asm","wb");
        GenerateFile(OFILE_LST,fhand,0,0x3d,0x1F);
        fclose(fhand);
        Wait();
        Exit(0);
}
:f:\IDA_FRE_5\idag.exe -c -B -S.\foo.idc  foo.dmp

:head -n 30 foo.asm | tail
seg000:00000000 ; Segment type: Pure code
seg000:00000000 seg000          segment byte public 'CODE' use32
seg000:00000000                 assume cs:seg000
seg000:00000000 assume es:nothing, ss:nothing, ds:nothing, fs:no    thing, gs:nothing
seg000:00000000                 push    10h
seg000:00000002                 push    7C80B730h
seg000:00000007                 call    near ptr 0FFFF6DE4h
seg000:0000000C                 and     dword ptr [ebp-4], 0

使用windbg,您可以像这样从命令行直接进行反汇编

:cdb -c ".dvalloc/b 60000000 2000;.readmem foo.dmp 60001000 l?0n61;u 60001000 60001040;q"计算

0:000> cdb: Reading initial command '.dvalloc /b 60000000 2000;.readmem foo.dmp 60001000 l?0n61;u 60001000 60001040;q'
Allocated 2000 bytes starting at 60000000
Reading 3d bytes.
60001000 6a10            push    10h
60001002 6830b7807c      push    offset kernel32!`string'+0x88 (7c80b730)
60001007 e8d86dffff      call    5fff7de4
6000100c 8365fc00        and     dword ptr [ebp-4],0
60001010 64a118000000    mov     eax,dword ptr fs:[00000018h]
60001016 8945e0          mov     dword ptr [ebp-20h],eax
60001019 817810001e0000  cmp     dword ptr [eax+10h],1E00h
60001020 750f            jne     60001031
60001022 803d0850887c00  cmp     byte ptr [kernel32!BaseRunningInServerProcess (7c885008)],0
60001029 7506            jne     60001031
6000102b ff15f812807c    call    dword ptr [kernel32!_imp__CsrNewThread (7c8012f8)]
60001031 ff750c          push    dword ptr [ebp+0Ch]
60001034 ff5508          call    dword ptr [ebp+8]
60001037 50              push    eax
60001038 e8c9090000      call    60001a06
6000103d 0000            add     byte ptr [eax],al
6000103f 0000            add     byte ptr [eax],al
quit:

ollydbg 1.10 View ->文件->(屏蔽任何文件)->foo.dmp->右键->反汇编

关于windbg - 在 IDA Pro 中分析从内存转储中获取的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29433415/

相关文章:

windows - 从 Microsoft 符号服务器下载符号

c - 在这种情况下使用 JL 和 JLE 吗?

assembly - lea 0x0(%esi),%esi 是什么意思

c# - 了解 WinDbg 输出

c++ - 如何在 WinDbg 扩展中基于转储文件内存创建对象?

.net - 用于调试和发布构建的 WinDbg 不同堆栈跟踪

c++ - 在 Visual Studio 中的 C++ 可执行文件中静态包含大型二进制文件

c++ - 读取二进制文件并打印其内容(Web 服务器)

c - 使用 fread() 将二进制文件转换为结构体时出现问题

c - 基于ebp的寻址和esp寻址之间的区别