京麒ctf2024-Re-babyharmony(鸿蒙OS逆向)

鸿蒙HarmonyOS逆向

找到的工具:HapViewer 发行版 - Gitee.com

完全不知道鸿蒙os如何逆向QAQ
那就按安卓的方法来逆但是没有工具!!!
.apk其实可以按zip的格式打开看见拥有源码的.dex文件,那么.hap是不是也可以这样!

百度一些.abc文件发现啥也没有资料QAQ,直接用txt打开发现居然有源码在里面!!

发现需要用utf-8可以解决部分中文乱码!

提取出主要的代码:

    constructor(parent, params, __localStorage, elmtId = -1) {
        super(parent, __localStorage, elmtId);
        this.context = getContext(this);
        this.__message = new ObservedPropertySimplePU('请输入flag', this, "message");
        this.__button_name = new ObservedPropertySimplePU('提交', this, "button_name");
        this.__flag = new ObservedPropertySimplePU('', this, "flag");
        this.__result = new ObservedPropertySimplePU('', this, "result");
        this.dialogController = new CustomDialogController({
            builder: () => {
                let jsDialog = new CustomDialogExample(this, {
                    textValue: this.__result,
                });
                jsDialog.setController(this.dialogController);
                ViewPU.create(jsDialog);
            }
        }, this);
        this.setInitiallyProvidedValue(params);
    }

这段代码初始化了一个flag提交框!!!

        this.observeComponentCreation((elmtId, isInitialRender) => {
            ViewStackProcessor.StartGetAccessRecordingFor(elmtId);
            Button.createWithLabel(this.button_name);
            Button.onClick(() => {
                this.context.resourceManager.getRawFileContent("bin").then((value) => {
                    var c = testNapi.check(this.flag, value);
                    if ((c & 0b100) === 0b100) {
                        this.result = '系统环境异常';
                    }
                    else if ((c & 0b10) === 0b10) {
                        this.result = 'flag格式错误';
                    }
                    else if ((c & 0b1) === 0b1) {
                        this.result = 'flag错误或系统环境异常';
                    }
                    else {
                        this.result = 'flag正确';
                    }
                    this.dialogController.open();
                });
            });
            if (!isInitialRender) {
                Button.pop();
            }
            ViewStackProcessor.StopGetAccessRecording();
        });

在txt里面找到了判断flag的按钮!!var c = testNapi.check(this.flag, value);
发现这里就有check函数可以判断flag!
但是找不到testNapi.check方法百度一下!
发现testNapi其实就类似于安卓的Native方法:16.7:NAPI 加载原理(上) | 《ArkUI实战》
百度查一下发现方法是写在libentry.so文件里!

拖入ida直接搜索字符串找到了方法!!!
发现这个check方法是在so文件里的!

找到check方法!!

发现这个调用的原理是使用使用ArkTs调用so方法QAQ,我去问chatgpt他说是js调用so方法差点肝死我了!
js调用so方法:node-ffi-napi/node-ffi-napi:用于 Node.js N-API 样式的外部函数接口 (FFI)

// example.js
const ffi = require('ffi-napi'); // 使用 ffi-napi 模块来加载 SO 文件

// 加载 example.so 文件
const example = ffi.Library('./libentry.so', {
  'add': ['int', ['int', 'int']] // 定义 SO 文件中的 add 函数
});

// 暴露一个函数给 JavaScript 使用
function add(a, b) {
  return example.add(a, b);
}

module.exports = { add };
// main.js
const { add } = require('./example');

// 调用封装的 add 函数
const result = add(2, 3);
console.log(result); // 输出 5

去配了js的的ffi-napi库再去调用这个so文件的check方法发现报错:

然后继续百度才发现它用的是ArkTs调用so方法!!!
那继续肝,去下载一个鸿蒙开发环境:

  1. DevEco Studio-HarmonyOS SDK下载和升级-华为开发者联盟 (huawei.com)
  2. 华为官方:手把手教你使用鸿蒙 HarmonyOS 本地模拟器 - IT之家 (ithome.com)
  3. 鸿蒙手机版JNI实战(JNI开发、SO库生成、SO库使用) - 齐行超 - 博客园 (cnblogs.com)
    成功了!!!

    打开模拟器!成功剩下的就是分析so文件的具体调用了!!!

知识链接:
DevEco Studio-HarmonyOS SDK下载和升级-华为开发者联盟 (huawei.com)
华为官方:手把手教你使用鸿蒙 HarmonyOS 本地模拟器 - IT之家 (ithome.com)
手把手教你使用HarmonyOS本地模拟器 (qq.com)手把手教你使用HarmonyOS本地模拟器_harmonyos怎么本地模拟器-CSDN博客
鸿蒙 hap apk,逆向分析第一个鸿蒙OS应用-CSDN博客
华为hap安装包逆向记录 - LY 的博客 (young-lord.github.io)
[下载][原创]鸿蒙APP逆向分析-HarmonyOS-看雪-安全社区|安全招聘|kanxue.com
硬核教程:OpenHarmony和鸿蒙hap包逆向解析应用名称~_哔哩哔哩_bilibili
hap查看器的实现原理以及逆向解析应用名的初步方案 - 文章 OpenHarmony开发者论坛

安装js的ffi-napi库在kali上根本装不了一点!!!
nodejs动态调试:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值