我有一个.so来自 android 应用程序的文件,我知道如何在IDA Pro.
我怎样才能做到这一点radare2?
我有一个.so来自 android 应用程序的文件,我知道如何在IDA Pro.
我怎样才能做到这一点radare2?
有几种方法可以显示radare2中二进制文件的不同功能。
首先打开二进制文件并分析它。
$ r2 -A libdbm64.so
到列表中的功能,最简单的方法是afl它代表命令一nalysis ˚F恩膏升IST。该命令将列出二进制文件中的所有函数并将其打印为四列:偏移量、块数、长度和名称。
[0x00001ba0]> afl
0x00001ba0 4 50 -> 44 entry0
0x00001ed9 1 114 sym.startWatchDbus
0x00001b70 1 6 sym.imp.g_bus_watch_name
0x00003115 1 43 sym.setItemEnabled
0x00001b60 1 6 sym.imp.dbusmenu_menuitem_property_set_bool
0x000033f0 1 9 sym._fini
0x00001f4b 1 20 sym.stopWatchDbus
0x00001a70 1 6 sym.imp.g_bus_unwatch_name
0x000030eb 1 42 sym.setItemLabel
...
...
该afll命令是不是更详细的afl命令。它将显示更多列及其标题。
address size nbbs edges cc cost min bound range max bound calls locals args xref frame name
================== ==== ===== ===== ===== ==== ================== ===== ================== ===== ====== ==== ==== ===== ====
0x0000000000001ba0 44 4 4 4 19 0x0000000000001ba0 50 0x0000000000001bd2 0 0 0 1 8 entry0
0x0000000000001ed9 114 1 0 1 30 0x0000000000001ed9 114 0x0000000000001f4b 1 3 3 0 56 sym.startWatchDbus
0x0000000000001b70 6 1 0 1 3 0x0000000000001b70 6 0x0000000000001b76 0 0 0 1 0 sym.imp.g_bus_watch_name
0x0000000000003115 43 1 0 1 18 0x0000000000003115 43 0x0000000000003140 1 2 2 0 24 sym.setItemEnabled
0x0000000000001b60 6 1 0 1 3 0x0000000000001b60 6 0x0000000000001b66 0 0 0 3 0 sym.imp.dbusmenu_menuitem_property_set_bool
0x00000000000033f0 9 1 0 1 5 0x00000000000033f0 9 0x00000000000033f9 0 0 0 0 8 sym._fini
0x0000000000001f4b 20 1 0 1 12 0x0000000000001f4b 20 0x0000000000001f5f 1 0 0 0 8 sym.stopWatchDbus
0x0000000000001a70 6 1 0 1 3 0x0000000000001a70 6 0x0000000000001a76 0 0 0 1 0 sym.imp.g_bus_unwatch_name
0x00000000000030eb 42 1 0 1 17 0x00000000000030eb 42 0x0000000000003115 1 2 2 0 24 sym.setItemLabel
该aflt命令使用了radare2 中新引入的Table API。默认情况下,它将返回一个数据表,如下所示:
[0x00001ba0]> aflt
╭─────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ addr │ size │ name │ nbbs │ xref │ calls │ cc │
│─────────────────────────────────────────────────────────────────────────────────────────────────────────│
│ 0x00001ba0 │ 50 │ entry0 │ 4 │ 3 │ 0 │ 4 │
│ 0x00001ed9 │ 114 │ sym.startWatchDbus │ 1 │ 0 │ 1 │ 1 │
│ 0x00001b70 │ 6 │ sym.imp.g_bus_watch_name │ 1 │ 1 │ 0 │ 1 │
│ 0x00003115 │ 43 │ sym.setItemEnabled │ 1 │ 0 │ 1 │ 1 │
│ 0x00001b60 │ 6 │ sym.imp.dbusmenu_menuitem_property_set_bool │ 1 │ 3 │ 0 │ 1 │
│ 0x000033f0 │ 9 │ sym._fini │ 1 │ 0 │ 0 │ 1 │
│ 0x00001f4b │ 20 │ sym.stopWatchDbus │ 1 │ 0 │ 1 │ 1 │
│ 0x00001a70 │ 6 │ sym.imp.g_bus_unwatch_name │ 1 │ 1 │ 0 │ 1 │
│ 0x000030eb │ 42 │ sym.setItemLabel │ 1 │ 0 │ 1 │ 1 │
...
...
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Table API 允许您查询想要查看的数据。例如,如果我只想看到 Name、Offset 和 Size,我可以这样做:
[0x00001ba0]> aflt name/cols/addr/size
╭──────────────────────────────────────────────────────────────────────────╮
│ name │ addr │ size │
│──────────────────────────────────────────────────────────────────────────│
│ entry0 │ 0x00001ba0 │ 50 │
│ sym.startWatchDbus │ 0x00001ed9 │ 114 │
│ sym.imp.g_bus_watch_name │ 0x00001b70 │ 6 │
│ sym.setItemEnabled │ 0x00003115 │ 43 │
│ sym.imp.dbusmenu_menuitem_property_set_bool │ 0x00001b60 │ 6 │
│ sym._fini │ 0x000033f0 │ 9 │
│ sym.stopWatchDbus │ 0x00001f4b │ 20 │
│ sym.imp.g_bus_unwatch_name │ 0x00001a70 │ 6 │
│ sym.setItemLabel │ 0x000030eb │ 42 │
...
...
│ fcn.00001930 │ 0x00001930 │ 6 │
│ loc.imp.XKeysymToString │ 0x00001b50 │ 6 │
╰──────────────────────────────────────────────────────────────────────────╯
如果您使用radare2 编写脚本,建议使用每个命令的JSON 输出。aflj将向您显示包含所有功能的 json 输出。我附加了{}使其更漂亮。
[0x00001ba0]> aflj~{}
[
{
"offset": 7072,
"name": "entry0",
"size": 50,
"is-pure": "false",
"realsz": 44,
"stackframe": 8,
"calltype": "amd64",
...
...
}, {
...
}
最后,如果您觉得在逆向工程会话中使用命令行不方便。我推荐使用Cutter,它是由radare2 提供支持并由radare 组织创建的GUI 逆向工程框架。
0x00000000]> \iE* libjni.so
它显示了导出函数签名的列表及其在内存中的绝对地址,如下所示:
f sym.fun._Znaj = 0xc5a3f8b5
f sym.fun._ZdaPv = 0xc5a3e579
f sym.fun._ZdlPv = 0xc5a3e575
f sym.fun.__cxa_begin_catch = 0xc5a3ebd5
f sym.fun._ZSt9terminatev = 0xc5a3f4bd
f sym.fun._Znwj = 0xc5a3f861
f sym.var._ZTVN10__cxxabiv117__class_type_infoE = 0xc5a97290
f sym.fun.JNI_OnLoad = 0xc5a257a9
f sym.fun.__cxa_allocate_exception = 0xc5a3e655
f sym.fun.__cxa_throw = 0xc5a3f571
f sym.fun.__cxa_free_exception = 0xc5a3e6fd
f sym.fun.__cxa_rethrow = 0xc5a3f5f1
f sym.fun.__cxa_end_catch = 0xc5a3ec65
f sym.var._ZSt7nothrow = 0xc5a94138
f sym.fun._ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE5clearEv = 0xc5a36c99
f sym.fun._ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE16_M_insert_uniqueISsEESt4pairISt17_Rb_tree_iteratorISsEbEOT_ = 0xc5a36d3d
f sym.fun._ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEE4findERKSs = 0xc5a38701
f sym.fun._ZNSt6vectorISsSaISsEED2Ev = 0xc5a2df71
f sym.fun._ZNSt8_Rb_treeISsSsSt9_IdentityISsESt4lessISsESaISsEED2Ev = 0xc5a36f11
f sym.fun._ZNSt6vectorISsSaISsEE7reserveEj = 0xc5a32455
f sym.fun._ZNSt6vectorISsSaISsEE19_M_emplace_back_auxIJSsEEEvDpOT_ = 0xc5a39361
f sym.fun.__cxa_guard_acquire = 0xc5a3f665
f sym.fun.__cxa_guard_release = 0xc5a3f7dd
f sym.fun._ZNSt9exceptionD2Ev = 0xc5a3ed01
...