V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
neocanable
V2EX  ›  分享创造

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

  •  
  •   neocanable ·
    neocanable · 1 天前 · 532 次点击
    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 条回复    2026-01-05 04:29:24 +08:00
    rainrdx
        1
    rainrdx  
       1 天前
    这个项目从一开始就 star 了关注了这么久作者一直在坚持。不知道做着有没有兴趣接个小单,不涉及到黑产灰产不涉及传播,就是想把自己付费买了的资源保存下来。。。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5854 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 03:09 · PVG 11:09 · LAX 19:09 · JFK 22:09
    ♥ Do have faith in what you're doing.