`af` 似乎没有在 Radare2 中找到所有函数

逆向工程 雷达2
2021-07-05 20:18:54

入口点的反汇编如下所示:

 :   ;-- entry0:
        :   ;-- _mainCRTStartup:
        :   ;-- eip:
        :   0x004014e0      83ec0c         sub esp, 0xc
        :   0x004014e3      c70598534000.  mov dword [0x405398], 0     ; [0x405398:4]=0
        :   0x004014ed      e86e020000     call sym.___security_init_cookie
        :   0x004014f2      83c40c         add esp, 0xc
        `=< 0x004014f5      e986fcffff     jmp sym.___tmainCRTStartup
            0x004014fa      90             nop
            0x004014fb      90             nop
            0x004014fc      90             nop
            0x004014fd      90             nop
            0x004014fe      90             nop
            0x004014ff      90             nop
            ;-- ___gcc_register_frame:
            0x00401500      a130304000     mov eax, dword [0x403030]   ; [0x403030:4]=0
            0x00401505      85c0           test eax, eax
        ,=< 0x00401507      7443           je 0x40154c
        |   0x00401509      55             push ebp
        |   0x0040150a      89e5           mov ebp, esp
        |   0x0040150c      83ec18         sub esp, 0x18
        |   0x0040150f      c70424004040.  mov dword [esp], str.libgcj_13.dll ; section..rdata
        |                                                              ; [0x404000:4]=0x6762696c ; "libgcj-13.dll"
        |   0x00401516      ff151c614000   call dword [sym.imp.KERNEL32.dll_GetModuleHandleA] ; 0x40611c ; "Lb" ; HMODULE GetModuleHandleA(LPCSTR lpModuleName)
...

当我执行af它时,它只能在entry0. 为什么无法找到后面的其他功能?例如,在功能0x004014ed0x00401516

1个回答

我想知道af适用于查找函数的逻辑

嗯......你可以准确地阅读那个逻辑。Radare2 是开源的

特别是,第r_core_anal_fcn4243 行调用的是“核心”主力,它查看实际指令、创建和交联基本块、重建局部变量和函数参数签名等。它从哪里开始查看?addr说法。什么东西会传进去?第 4225 行,ut64 addr = core->offset;af从逻辑开始的当前地址,一个你通过与寻求改变s命令(这是相同的,当通过临时设定的寻求af @ 0x1234)。

看,你可以从一页 C 代码中找到很多东西。如果您不擅长浏览大型 C 代码库,那么定位该页面可能会很困难,但是在这里,我为您找到了它。

为什么无法找到后面的其他功能?

af不“查找”功能,它从您告诉它的确切位置开始(见上文)。好吧,除了e anal.calls=1- 然后它递归分析。或者使用e anal.hasnext=1,则它假定刚刚分析的函数后面将跟随另一个函数。

如果我这样做,af @ main它似乎会发现更多。

让我们看一下entrypoint-main关系。

首先,main是由你的程序作者编写的。并非总是如此:人们会使用各种存根、框架和语言——但让我暂时假设最简单的情况。

入口点代码永远不会由您的程序作者编写。我又过分简化了;相当极端的反例是用手动汇编编码的程序,或r2 鸡蛋几乎总是,入口点的代码由编译器放置在那里——因此,由与程序作者完全不同的人编写。出于这个原因,它比主要的有趣一点。此外,它通常非常通用,不包含任何特定于您的程序的内容,因此很无聊且无用。最好在 main 或更高级别开始分析。

相关地,入口点逻辑不main直接引用,因为必须是通用的。会有间接的。简单/幼稚的分析(即 skipping call rax)不会遍历那些间接——因此,af @ entry0不会到达main.

为什么无法找到后面的其他功能?例如,0x004014ed、0x00401516 处的函数。

正如评论中所建议和上面解释的那样,aaf更适合分析所有功能afr将处理递归函数您也可以寻求各地和手动定义它们一个接一个(这是在视觉模式相当快一点:带开关V,循环反汇编视图与p,然后df定义函数)。

确保探讨内置帮助af?a?aa?等。另见https://book.rada.re阅读源代码最终可以提供所有可能的答案。