GoForum🌐 V2EX

开源日记 - garlic decompiler - 2026-01-05

neocanable · 2026-01-05 01:18 · 0 次点赞 · 1 条回复
  1. 用 c 手撸一个 Java 的 decompiler
  2. 开源一个 c 语言实现的 Java 反编译器
  3. 开源反编译器支持 dex/apk

2025 年结束了,garlic decompiler 一堆 bug 还没有解决完;

我就挖了一个新坑:做 android native 层的反汇编,也就是 arm 的汇编。

这个路径绕啊绕的,很 SB ,可以借鉴,做事之前一定要调研好。

  1. 哎,第一次做反汇编的大概都是根据二进制的位与来与去,写出来的极其不通用 , pass掉这种玩具写法。

  2. 嗯,发现开源项目比如 capstone 实现的真好啊,去看看,发现反汇编有引擎这么一说。

  3. 哦,原来 capstone 也是跟随着 LLVM 更新的,我去看看 LLVM 。

  4. 哦,原来人家官方是有 fat 数据的,那还写鸡毛的反汇编引擎,直接解析官方 fat 数据就 ok 了。

  5. 哦,不对,官方数据只能提供汇编文本化的输出,很多东西要自己定义。

经过了这么大一圈,我写了一个关于 arm - T32/A32/A64 的反汇编引擎。实现方案很简单

  1. 用 ruby 定义 arm 汇编语言的 DSL ,和编写测试
  2. 定义 c 语言的结构,脚本生成静态数据
  3. 实现一边解析规则
  4. 对比测试,IDA/Ghidra 等等对比
  5. alias 啊,宽指令,simd 什么的支持一下

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 · 2026-01-05 04:33
#1

这个项目从一开始就 star 了关注了这么久作者一直在坚持。不知道做着有没有兴趣接个小单,不涉及到黑产灰产不涉及传播,就是想把自己付费买了的资源保存下来。。。

添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: neocanable
发布: 2026-01-05
点赞: 0
回复: 0