Yricky / abcde

openHarmony逆向工具包
Apache License 2.0
334 stars 53 forks source link

增加asm转伪代码的难度如何,打算把他维护成jadx那样的工具。 #1

Closed MartinKayJr closed 5 months ago

MartinKayJr commented 5 months ago

我目前还不是特别熟练kotlin和jetpack compose,正在通过经验去阅读,试图去pr这个项目。

然后就是 我没有在arkcompile_runtime_core看到类似 ART中的SwitchExecuteImpl那样的switch解释器,这个官方的项目包含了执行解释器的代码吗?

然后想要提前去做鸿蒙相关的frida框架以及xposed框架和插件,以及针对鸿蒙的root方案。

Yricky commented 5 months ago

asm转伪代码难度比安卓高,因为方舟指令集调用方法没有dalvik指令集那样直观。

截屏2024-06-25 17 24 25

方舟指令集的方法调用通常是loadObject+callthis等指令组合调用实现的。上图是一个例子,15-22行对应的伪代码应该就是mainAbilityStage.context.getApplicationContext,目前还没找到是否有准确的根据数条字节码指令反推回伪代码的方法。感觉可能需要根据callThis指令回溯。

本项目反汇编的核心代码在abcde/src/commonMain/kotlin/me/yricky/oh/abcd/isa/Asm.kt

arkcompile_runtime_core中是否有解释器我具体也不清楚,官方源码我也才刚开始看,我目前也就粗略看过这个仓库中disasm和isa部分的内容。

目前一切都在起步阶段,一起努力吧😂

MartinKayJr commented 5 months ago

我看到的是先有.pa,然后再有.abc,这让我觉得很疑惑,如果.hap安装包中的是.abc,应该会有一个专门的运行时解释器去执行他,但在arkcompile_runtime_core中我没有看到对应的解释器,看到了irtoc和llvm以及cpp两种实现,这里面看似有两套引擎,一套panda asm引擎,一套abc引擎,在这一点上,你有什么见解吗?

pandasm::Opcode Disassembler::BytecodeOpcodeToPandasmOpcode(BytecodeInstruction::Opcode o) const {
    switch (o) {
% Panda::instructions.each do |i|
    case BytecodeInstruction::Opcode::<%= i.opcode.upcase %>:
        return pandasm::Opcode::<%= i.mnemonic.tr('.', '_').upcase %>;
% end
    default:
        return pandasm::Opcode::INVALID;
    }
}
Yricky commented 5 months ago

pa 和abc的关系应该类似smali和dex的关系,引擎应该只有一套。

突然想起来HDC的工作人员提到他们的大部分逻辑都在arkcompiler_ets_runtime里面,简单找了一下,解释器部分的代码应该是这个:https://gitee.com/openharmony/arkcompiler_ets_runtime/tree/master/ecmascript/interpreter

MartinKayJr commented 5 months ago

我们加个QQ好友讨论一下吧?

Yricky commented 5 months ago

不介意的话可以加个飞书,QQ我平时基本不用,可能收不到消息,而且协作之类的也不太方便 20240626-165053