Radare2 代码反汇编:将汇编代码还原为 C 代码

Radare2 是一个功能强大的开源反汇编、调试和分析工具,它可以帮助你深入理解程序的内部工作原理。其中一个强大的功能是将汇编代码还原为 C 代码,这可以帮助你更好地理解程序逻辑,并进行安全分析。

以下是一些关于使用 Radare2 将汇编代码还原为 C 代码的示例:

示例代码:

[0x00000468]> pd
            ;-- section..text:
            ;-- entry.fini1:
            ;-- pc:
            ;-- r15:
            ; NULL XREF from aav.0x00000014 @ +0x4(r)
┌ 12: entry0 ();
│           0x00000468      04009fe5       ldr r0, [0x00000474]        ; [0x474:4]=0x119c ; [13] -r-x section size 276 named .text
│           0x0000046c      00008fe0       add r0, pc, r0              ; 0x1610
│                                                                      ; segment.GNU_RELRO
└       ┌─< 0x00000470      4a0000ea       b sym.imp.__cxa_atexit      ; sym.imp.__cxa_finalize+0xc
        │   ; DATA XREF from entry0 @ 0x468(r)
        │   0x00000474      9c110000       muleq r0, ip, r1                                   │       │   ; CODE XREF from entry.fini0 @ 0x47c(x)
│      ┌──> 0x00000478      1eff2fe1       bx lr                                              ┌ 8: entry.fini0 ();
│      └──< 0x0000047c      fdffffea       b 0x478
        │   0x00000480      000050e3       cmp r0, 0
        │   0x00000484      1eff2f01       bxeq lr
        │   0x00000488      10ff2fe1       bx r0
        │   0x0000048c      0010a0e1       mov r1, r0
        │   0x00000490      0c009fe5       ldr r0, [0x000004a4]        ; [0x4a4:4]=0xffffffe0
        │   0x00000494      0c209fe5       ldr r2, [0x000004a8]        ; [0x4a8:4]=0x116c
        │   0x00000498      00008fe0       add r0, pc, r0
        │   0x0000049c      02208fe0       add r2, pc, r2
       ┌──< 0x000004a0      420000ea       b 0x5b0                     ; sym.imp.__strlen_chk+0x4
       ││   ; DATA XREF from entry.fini0 @ +0x14(r)
       ││   0x000004a4      e0ffffff       invalid
       ││   ; DATA XREF from entry.fini0 @ +0x18(r)
       ││   0x000004a8      6c110000       andeq r1, r0, ip, ror 2
┌ 98: sym.xorEncryptDecrypt (int16_t arg1, int16_t arg2);
│      ││   ; arg int16_t arg1 @ r0
│      ││   ; arg int16_t arg2 @ r1
│      ││   ; var int16_t var_4h @ sp+0x4
│      ││   ; var int16_t var_8h @ sp+0x8
│      ││   ; var char *s1 @ sp+0xc
│      ││   ; var int8_t var_dh @ sp+0x13
│      ││   ; var int16_t var_14h @ sp+0x14
│      ││   ; var int16_t var_18h @ sp+0x18
│      ││   ; var int16_t var_1ch @ sp+0x1c
│      ││   ; var int16_t var_0h @ sp+0x20
│      ││   0x000004ac      80b5           push {r7, lr}
│      ││   0x000004ae      6f46           mov r7, sp
│      ││   0x000004b0      88b0           sub sp, 0x20
│      ││   0x000004b2      0590           str r0, [var_14h]           ; arg1
│      ││   0x000004b4      07f80d1c       strb r1, [var_dh]           ; arg2
│      ││   0x000004b8      0598           ldr r0, [var_14h]
│      ││   ; CODE XREF from sym.xorEncryptDecrypt @ +0x62(x)
│     ┌───> 0x000004ba      0790           str r0, [var_1ch]
│     ╎││   0x000004bc      4ff0ff30       mov.w r0, -1
│     ╎││   0x000004c0      0690           str r0, [var_18h]
│     ╎││   0x000004c2      0798           ldr r0, [var_1ch]
│     ╎││   0x000004c4      0699           ldr r1, [var_18h]
│     ╎││   0x000004c6      00f07ce8       blx fcn.000005c0
│     ╎││   0x000004ca      0390           str r0, [s1]
│     ╎││   0x000004cc      0398           ldr r0, [s1]
│     ╎││   0x000004ce      0130           adds r0, 1                  ; const char *s1
│     ╎││   0x000004d0      00f07ee8       blx sym.imp.strcmp          ; int strcmp(const char *s1, const char *s2)
│     ╎││   0x000004d4      0290           str r0, [var_8h]
│     ╎││   0x000004d6      0020           movs r0, 0
│     ╎││   0x000004d8      0190           str r0, [var_4h]
│    ┌────< 0x000004da      ffe7           b 0x4dc
│    │╎││   ; CODE XREFS from sym.xorEncryptDecrypt @ 0x4da(x), 0x4fe(x)
│   ┌└────> 0x000004dc      0198           ldr r0, [var_4h]
│   ╎ ╎││   0x000004de      0399           ldr r1, [s1]
│   ╎ ╎││   0x000004e0      8842           cmp r0, r1
│   ╎┌────< 0x000004e2      0dd2           bhs 0x500
│  ┌──────< 0x000004e4      ffe7           b 0x4e6
│  │╎│╎││   ; CODE XREF from sym.xorEncryptDecrypt @ 0x4e4(x)
│  └──────> 0x000004e6      0598           ldr r0, [var_14h]
│   ╎│╎││   0x000004e8      019a           ldr r2, [var_4h]
│   ╎│╎││   0x000004ea      805c           ldrb r0, [r0, r2]
│   ╎│╎││   0x000004ec      17f80d1c       ldrb r1, [var_dh]
│   ╎│╎││   0x000004f0      4840           eors r0, r1
│   ╎│╎││   0x000004f2      0299           ldr r1, [var_8h]
│   ╎│╎││   0x000004f4      8854           strb r0, [r1, r2]
│  ┌──────< 0x000004f6      ffe7           b 0x4f8
│  │╎│╎││   ; CODE XREF from sym.xorEncryptDecrypt @ 0x4f6(x)
│  └──────> 0x000004f8      0198           ldr r0, [var_4h]
│   ╎│╎││   0x000004fa      0130           adds r0, 1
│   ╎│╎││   0x000004fc      0190           str r0, [var_4h]
│   └─────< 0x000004fe      ede7           b 0x4dc
│    │╎││   ; CODE XREF from sym.xorEncryptDecrypt @ 0x4e2(x)
│    └────> 0x00000500      0299           ldr r1, [var_8h]
│     ╎││   0x00000502      039a           ldr r2, [s1]
│     ╎││   0x00000504      0020           movs r0, 0
│     ╎││   0x00000506      8854           strb r0, [r1, r2]
│     ╎││   0x00000508      0298           ldr r0, [var_8h]
│     ╎││   0x0000050a      08b0           add sp, 0x20
└     ╎││   0x0000050c      80bd           pop {r7, pc}
      └───< 0x0000050e      d4d4           bmi 0x4ba                   ; sym.xorEncryptDecrypt+0xe
┌ 102: sym.Java_com_example_decryptdemo_MainActivity_checkPassword (int16_t arg1, int16_t arg2, int16_t arg3);
│      ││   ; arg int16_t arg1 @ r0
│      ││   ; arg int16_t arg2 @ r1
│      ││   ; arg int16_t arg3 @ r2
│      ││   ; var int16_t var_0h @ sp+0x0
│      ││   ; var int8_t var_19h @ sp+0x7
│      ││   ; var int16_t var_8h @ sp+0x8
│      ││   ; var int16_t var_ch @ sp+0xc
│      ││   ; var int16_t var_10h @ sp+0x10
│      ││   ; var int16_t var_14h @ sp+0x14
│      ││   ; var int16_t var_18h @ sp+0x18
│      ││   ; var int16_t var_1ch @ sp+0x1c
│      ││   ; var int16_t var_0h_2 @ sp+0x20
│      ││   0x00000510      80b5           push {r7, lr}
│      ││   0x00000512      6f46           mov r7, sp

步骤:

  1. 打开 Radare2: 在终端中输入 r2 命令打开 Radare2。
  2. 加载文件: 使用 o 命令加载目标文件,例如 o <文件名>
  3. 定位代码段: 使用 s 命令定位到代码段,例如 s mains entry0
  4. 反汇编: 使用 pd 命令反汇编代码。
  5. 还原 C 代码:
    • 使用 aaa 命令尝试自动分析代码并生成 C 代码。
    • 使用 pcc 命令手动分析代码并生成 C 代码。
    • 使用 pc 命令逐行分析代码,并根据需要使用其他命令,例如 pdfpdjpdi,来生成 C 代码。

注意事项:

  • 并非所有汇编代码都能完美地还原为 C 代码。
  • Radare2 可能会生成一些不正确的 C 代码,需要人工检查和修正。
  • 需要熟悉 C 语言和汇编语言才能更好地理解生成的代码。

示例:

假设我们想还原 sym.xorEncryptDecrypt 函数的 C 代码,我们可以使用以下命令:

r2 <文件名>
s sym.xorEncryptDecrypt
aa

Radare2 会尝试分析函数并生成相应的 C 代码。

总结:

Radare2 是一款强大的反汇编工具,可以帮助你将汇编代码还原为 C 代码,这对于理解程序逻辑、进行安全分析和逆向工程非常有用。但是,需要熟悉 C 语言和汇编语言才能更好地理解生成的代码。

Radare2 代码反汇编:将汇编代码还原为 C 代码

原文地址: http://www.cveoy.top/t/topic/bFCD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录