使用radare2从Android应用程序逆向工程.so文件

逆向工程 拆卸 雷达2 手臂 共享对象
2021-06-11 09:12:08

我有一个.so来自 android 应用程序文件,我知道如何在IDA Pro.

我怎样才能做到这一点radare2

3个回答

有几种方法可以显示radare2中二进制文件的不同功能。

首先打开二进制文件并分析它。

$ r2 -A libdbm64.so

命令:afl

到列表中的功能,最简单的方法是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

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

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     │
╰──────────────────────────────────────────────────────────────────────────╯



JSON

如果您使用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 逆向工程框架。

在此处输入图片说明

默认情况下,您将在左侧看到一个函数列表。您可以展开它以显示更多信息。 在此处输入图片说明

我建议您将这个这个备忘单用于radare2.

从文件:

list functions: afl

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
...