4

我正忙于学习一个教程,作者使用 DUMPBIN 列出导出,并使用 OllyDbg 获取导出函数的汇编代码。鉴于导出表 RVA 与反汇编中的实际地址不对应,我将如何在完整的反汇编中找到函数代码。

4

3 回答 3

3

函数的一个很好的指标,至少对于用高级语言编写的程序来说是设置堆栈帧的代码。

如果您知道用于生成相关代码的编译器,您应该能够找出要查找的内容。

例子

$ cat main.c
int main(int argc, char **argv) {
        return 1;
}
$ gcc -m32 -S main.c
$ cat main.s 
        .file     "main.c"
        .text
.globl main
        .type    main, @function
main:
        leal     4(%esp), %ecx
        andl     $-16, %esp
        pushl    -4(%ecx)
        pushl    %ebp
        movl     %esp, %ebp
        pushl    %ecx
        movl     $1, %eax
        popl     %ecx
        popl     %ebp
        leal     -4(%ecx), %esp
        ret
        .size    main, .-main
        .ident   "GCC: (Debian 4.3.3-4) 4.3.3"
        .section    .note.GNU-stack,"",@progbits

在我的示例中,movl %esp, %ebp指令是该设置代码的最后一条指令。

可免费下载啤酒版本的商业反汇编程序 IDA Pro在自动查找功能方面做得很好。

于 2009-03-01T13:06:31.073 回答
3

RVA 是可重定位的虚拟地址。要在进程空间中找到真正的地址,您需要知道在进程中加载​​模块的基地址。将该基地址添加到 RVA,您就有了真实地址。我没有使用过 ollydbg,但如果它没有为它所连接的进程中加载​​的模块提供基地址,我会感到震惊。如果由于某种原因它不提供该信息,您可以使用 sysinternal 工具中的 procexp.exe 来获取它。

于 2009-03-03T06:49:57.047 回答
0

如果使用radare2,您可以使用-AAflag 以二进制形式(也许)分析函数,然后使用afl命令列出所有函数。例如 :

% r2 -AA hello
[Cannot analyze at 0x00400420g with sym. and entry0 (aa)
[x] Analyze all flags starting with sym. and entry0 (aa)
[Cannot analyze at 0x00400420ac)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for objc references
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
[x] Finding function preludes
[x] Enable constraint types analysis for variables
-- Greetings, human.
[0x00400430]> afl
0x00400430    1 41           entry0
0x00400410    1 6            sym.imp.__libc_start_main
0x00400460    4 50   -> 41   sym.deregister_tm_clones
0x004004a0    4 58   -> 55   sym.register_tm_clones
0x004004e0    3 28           entry.fini0
0x00400500    4 38   -> 35   entry.init0
0x004005b0    1 2            sym.__libc_csu_fini
0x004005b4    1 9            sym._fini
0x00400540    4 101          sym.__libc_csu_init
0x00400526    1 21           main
0x00400400    1 6            sym.imp.puts
0x004003c8    3 26           sym._init
[0x00400430]>

用于radare2 Cutter的Windows版本->

于 2019-12-28T04:38:17.293 回答