【问题标题】:React-native 0.61.2 with hermes disassembling index.android.bundle带有爱马仕反汇编 index.android.bundle 的 React-native 0.61.2
【发布时间】:2019-12-26 16:02:11
【问题描述】:

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

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

如何反汇编使用 Hermes 创建的 index.android.bundle?非常感谢任何帮助!

【问题讨论】:

  • 您可以通过查看 v0.2.1 版本标签来反汇编您的文件,但这对您没有任何好处。输出是字节码汇编代码,而不是 JavaScript。你有什么堆栈跟踪数据?

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


【解决方案1】:

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

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


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

构建后,您可以在提示符处使用hbcdump myfile.hbc 后跟disassemble 来显示文件的禁用版本。

请注意,hbcdump 旨在开发/调试编译器,与javap -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

【讨论】:

  • @ksenia,解决了吗?我也面临同样的问题。
  • 输出是什么?每个人都说它是字节码,但这是什么意思?是java字节码还是一些只在Hermes vm中运行的自定义字节码?我怎样才能把它反编译成更易读的东西?
  • 这是一个自定义的 Hermes 字节码,只在 Hermes vm 中运行(这对于 JSVM 来说是正常的:V8 和 JSC 也有自己自定义的内部字节码)。目前没有工具可以尝试从 Hermes 字节码重构人类可读的 JS。
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
相关资源
最近更新 更多