我正忙于学习一个教程,作者使用 DUMPBIN 列出导出,并使用 OllyDbg 获取导出函数的汇编代码。鉴于导出表 RVA 与反汇编中的实际地址不对应,我将如何在完整的反汇编中找到函数代码。
ProfK
问问题
4405 次
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,您可以使用-AA
flag 以二进制形式(也许)分析函数,然后使用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]>
于 2019-12-28T04:38:17.293 回答