radare2 的 afl 返回的函数名称语法?

逆向工程 雷达2
2021-06-20 17:49:30

Radare2 的 afl 命令返回具有特定语法的函数名称,我找不到相关文档:

例如:

radare2 -2 -A -q -c "aflj" C:/Windows/system32/advapi32.dll

0x77cce13c   22 280          sub.ntdll.dll_RtlNtStatusToDosError_13c
0x77cce259    7 62           fcn.77cce259
0x77cce29c   10 88           sub.KERNEL32.dll_lstrcmpiW_29c
0x77cce2f9   24 463          sub.KERNEL32.dll_lstrlenW_2f9
0x77c617b4    1 40           sym.imp.KERNEL32.dll_LocalAlloc
0x77c6abe5    5 92   -> 130  sub.KERNEL32.dll_LocalAlloc_be5
0x77c7edd5    1 20           sub.KERNEL32.dll_LocalAlloc_dd5
  • 函数名后的十六进制数是什么意思?
  • 为什么前缀“sym”之间的核心区别是。和“子”。DLL 函数名称?
  • 小写或大写的库名有什么区别?

DLL 文件名都是小写的:

  • C:\Windows\System32\ntdll.dll
  • C:\Windows\System32\kernel32.dll
1个回答

我将首先回答您的三个具体问题,然后将更多地阐明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"