2025 年结束了,garlic decompiler 一堆 bug 还没有解决完;
我就挖了一个新坑:做 android native 层的反汇编,也就是 arm 的汇编。
这个路径绕啊绕的,很 SB ,可以借鉴,做事之前一定要调研好。
哎,第一次做反汇编的大概都是根据二进制的位与来与去,写出来的极其不通用 , pass掉这种玩具写法。
嗯,发现开源项目比如 capstone 实现的真好啊,去看看,发现反汇编有引擎这么一说。
哦,原来 capstone 也是跟随着 LLVM 更新的,我去看看 LLVM 。
哦,原来人家官方是有 fat 数据的,那还写鸡毛的反汇编引擎,直接解析官方 fat 数据就 ok 了。
哦,不对,官方数据只能提供汇编文本化的输出,很多东西要自己定义。
经过了这么大一圈,我写了一个关于 arm - T32/A32/A64 的反汇编引擎。实现方案很简单
T32 和 A32 还在调试,A64 效果:
[ELF] 0x000000000008b0f0 <avcodec_find_decoder> # .text
8b0f0: f00018e1 adrp x1, #0x8b40f
8b0f4: f947a421 ldr x1, [x1, #0xf48]
8b0f8: 17ffffe4 b #0x8b088
[ELF] 0x000000000008b0fc <avcodec_find_encoder_by_name> # .text
8b0fc: f00018e1 adrp x1, #0x8b41b
8b100: f945a421 ldr x1, [x1, #0xb48]
8b104: 14000001 b #0x8b108
8b108: d100c3ff sub sp, sp, #0x30
8b10c: a90153f5 stp x21, x20, [sp, #0x10]
8b110: a9027bf3 stp x19, x30, [sp, #0x20]
8b114: f90007ff str x31, [sp, #0x8]
8b118: b40001c0 cbz x0, #0x8b150
8b11c: aa0103f3 mov x19, x1 // alias orr
8b120: aa0003f4 mov x20, x0 // alias orr
8b124: 94000019 bl #0x8b188
8b128: aa0003f5 mov x21, x0 // alias orr
8b12c: b4000140 cbz x0, #0x8b154
8b130: aa1503e0 mov x0, x21 // alias orr
8b134: d63f0260 blr x19
8b138: 34ffff60 cbz w0, #0x8b124
8b13c: f94002a1 ldr x1, [x21, #0x0]
8b140: aa1403e0 mov x0, x20 // alias orr
8b144: 97ff30c7 bl #0x57460
8b148: 35fffee0 cbnz w0, #0x8b124
8b14c: 14000002 b #0x8b154
8b150: aa1f03f5 mov x21, x31 // alias orr
8b154: aa1503e0 mov x0, x21 // alias orr
8b158: a9427bf3 ldp x19, x30, [sp, #0x20]
8b15c: a94153f5 ldp x21, x20, [sp, #0x10]
8b160: 9100c3ff add sp, sp, #0x30
8b164: d65f03c0 ret x30
[ELF] 0x000000000008b168 <avcodec_find_decoder_by_name> # .text
8b168: f00018e1 adrp x1, #0x8b487
8b16c: f947a421 ldr x1, [x1, #0xf48]
8b170: 17ffffe6 b #0x8b108
8b174: b0001ac0 adrp x0, #0x8b4cd
8b178: 90000001 adrp x1, #0x8b178
8b17c: 91013000 add x0, x0, #0x4c
8b180: 91003021 add x1, x1, #0xc
8b184: 17ff31c7 b #0x578a0
8b188: 910023e0 add x0, sp, #0x8
8b18c: 17ff358d b #0x587c0
8b190: a9bf7bf3 stp x19, x30, [sp, #0x3f0]!
8b194: b941ec08 ldr w8, [x0, #0x1ec]
8b198: 7100091f cmp w8, #0x2 // alias subs
8b19c: 540000eb b #0x8b1b8
8b1a0: b00013e1 adrp x1, #0x8b41d
8b1a4: 9113c821 add x1, x1, #0x4f2
8b1a8: 97ff2f5a bl #0x56f10
8b1ac: 5297d600 mov w0, #0xbeb0 // alias movz
8b1b0: 72b75500 movk w0, #0xbaa8, lsl #0x10
8b1b4: 1400003a b #0x8b29c
8b1b8: f9402c13 ldr x19, [x0, #0x58]
8b1bc: b941e808 ldr w8, [x0, #0x1e8]
8b1c0: 52800029 mov w9, #0x1 // alias movz
8b1c4: b901ec09 str w9, [x0, #0x1ec]
顺便感叹一下,AI 真的好用
1
rainrdx 1 天前
这个项目从一开始就 star 了关注了这么久作者一直在坚持。不知道做着有没有兴趣接个小单,不涉及到黑产灰产不涉及传播,就是想把自己付费买了的资源保存下来。。。
|