我将首先回答您的三个具体问题,然后将更多地阐明radare2 中函数的命名结构。
函数名后的十六进制数是什么意思?
像“sub.KERNEL32.dll_lstrlenW_2f9”这样的函数名末尾的3个十六进制数字的含义是函数地址的后3位。这里的混淆是因为这不是一个导入的函数名,而是一个常规函数。这种命名是由aan
您在执行aaa
或打开带有 th-A
标志的文件时可能使用的命令引起的:$ r2 -A <filename>
。
如radare2文档中所述:
...
aan autoname functions that either start with fcn.* or sym.func.*
...
该aan
命令将根据函数中使用的标志自动生成一个名称。这应该在分析函数之前简化用户的分析。
那么让我们来看看一个名为 的函数sub.KERNEL32.dll_DisableThreadLibraryCalls_18002a860
。您可以看到正在调用名为“DisableThreadLibraryCalls”的导入函数。这就是该函数被重命名的原因aan
:
[0x18002a860]> pdf
╭ (fcn) sub.KERNEL32.dll_DisableThreadLibraryCalls_18002a860 35
│ sub.KERNEL32.dll_DisableThreadLibraryCalls_18002a860 ();
│ ; arg unsigned int arg3 @ rdx
│ 0x18002a860 4883ec28 sub rsp, 0x28
│ 0x18002a864 83fa01 cmp edx, 1
│ ╭─< 0x18002a867 7510 jne 0x18002a879
│ │ 0x18002a869 48833dff1f00. cmp qword [0x18002c870], 0 ; [0x18002c870:8]=0
│ ╭──< 0x18002a871 7506 jne 0x18002a879
│ ││ 0x18002a873 ff159f170000 call qword sym.imp.KERNEL32.dll_DisableThreadLibraryCalls
│ ╰╰─> 0x18002a879 b801000000 mov eax, 1
│ 0x18002a87e 4883c428 add rsp, 0x28
╰ 0x18002a882 c3 ret
[0x18002a860]>
为什么前缀“sym”之间的核心区别是。和“子”。DLL 函数名?
sym
代表“符号”。这是取自二进制符号表的符号。
sub.
代表“子程序”。这可以是一个独立的函数,但很可能是函数的一部分,如 JMPTABLE 块、指针表中的地址等。
小写或大写的库名有什么区别?
通常,radare2 保留库的大小写,如导入地址表中所示。但我认为有时为了可读性和更容易区分导入函数和重命名函数 ( aan
)会对其进行修改。
ASCII-ART 时间
我为你制作了一些 ASCII 艺术,希望这能让事情更清楚。
正则函数
fcn.77cce259
| |
| |__ The function's address
|
|__ stands for "Function"
导入功能
sym.imp.KERNEL32.dll_LocalAlloc
| | | |
| | | |__ The imported function name, "LocalAlloc"
| | |
| | |__ the Library name. In this case, "kernel32.dll"
| |
| |
| |___ "Import", this is an imported function
|
|___ "Symbol", taken from the Symbol Table
自动生成的名称
sub.ntdll.dll_RtlNtStatusToDosError_13c
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| |__ auto-generated name based on flags that being used
| the 3 digits at the end are the function's address
|__ "Subroutine"