React-native 0.61.2与爱马仕拆装index.android.bundle

时间:2019-12-26 16:02:11

标签: android react-native disassembly android-bundle react-native-hermes

我使用React-native 0.61.2创建了我的应用程序的发布版本,并启用了Hermes。 在我的Crashlytics中,我收到有关崩溃的信息以及堆栈跟踪。以前我曾经使用apktool从我的apk中提取index.android.bundle,它包含js代码,可以通过stacktrace找到问题。

但是现在使用Hermes index.android.bundle似乎包含字节码而不是js,因此我浪费了一天试图对其进行反汇编。我最后尝试过的是https://github.com/facebook/hermes/blob/master/doc/BuildingAndRunning.md中提到的 hbcdump 工具,但我得到的只是“错误:无法反序列化字节码:错误的字节码版本。期望73但得到62”

我该如何分解用爱马仕创建的index.android.bundle?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

编辑:从Hermes v0.5.0开始,还有一个hermes-engine-cli NPM包含字节码反汇编程序。它仅与相应的hermes-engine版本兼容(即hermes-engine-cli@0.5.0hermes-engine@0.5.0一起使用)。

它仍然主要对编译器开发人员有用,而不对调试应用程序崩溃有用。


Hermes工具不向后兼容,因此您需要先签出正确的版本。对于字节码版本62,您可以使用v0.2.1检出git checkout v0.2.1版本。对于任意字节码版本,git log -p include/hermes/BCGen/HBC/BytecodeFileFormat.h将显示哪些提交将格式更新为哪个版本。

构建完成后,您可以在出现提示时使用hbcdump myfile.hbc后跟disassemble来显示文件的禁用版本。

请注意,hbcdumpjavap -cobjdump -d一样,是用于开发/调试编译器的。这是您可以期望得到的输出:

Function<fizzbuzz>1(1 params, 22 registers, 0 symbols):
Offset in debug table: src 0xd, vars 0x0
fizzbuzz.js[1:21]
    LoadConstZero     r11
    LoadConstUInt8    r10, 15
    LoadConstUInt8    r9, 3
    LoadConstString   r8, "Fizzbuzz"
    LoadConstString   r7, "Fizz"
    LoadConstString   r6, "Buzz"
    GetGlobalObject   r5
    LoadConstUndefined r0
    LoadConstUInt8    r4, 1
    LoadConstUInt8    r3, 100
    LoadConstUInt8    r2, 5
    LoadConstZero     r1
L2:
fizzbuzz.js[1:21]
    Mod               r12, r1, r10
    Mov               r13, r8
    JStrictEqual      L1, r12, r11
    Mod               r12, r1, r9
    Mov               r13, r7
    JStrictEqual      L1, r12, r11
    Mod               r12, r1, r2
    Mov               r13, r6
    JStrictEqual      L1, r12, r11
    AddEmptyString    r13, r1
L1:
fizzbuzz.js[8:5]
    TryGetById        r12, r5, 1, "print"
    Call2             r12, r12, r0, r13
    AddN              r1, r1, r4
    JLessN            L2, r1, r3
    Ret               r0