找到的工具: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方法!!!
那继续肝,去下载一个鸿蒙开发环境:
- DevEco Studio-HarmonyOS SDK下载和升级-华为开发者联盟 (huawei.com)
- 华为官方:手把手教你使用鸿蒙 HarmonyOS 本地模拟器 - IT之家 (ithome.com)
- 鸿蒙手机版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动态调试: