新建项目,然后添加frida代码提示
frida 代码提示安装--vscode / node
npm i @types/frida-gum
任务 : sign 和 data,止于mobilekey是设备号,测试可以随机
sign 加密在 native 层
动态调试配置:
把ida 的 dbsgv 文件下的 android_server 复制到真机
chmod -R 777 android_server 给权限
./android_server 启动服务
启动多一个命令窗口 :端口转发:adb forward tcp:23946 tcp:23946
可以看到有4个包名一样的进程,我们要附加到主进程用frida-ps -Ua 查看一下
确定是9376
这个报错是因为我的机子是armx64,而我用的是32位的ida
改了之后进来了
加载objection
objection -g com.temperaturecoin explore -P ~/.objection/plugins
定位SO
这里有个concatTokenMd5函数,可以作为定位
function main() {
console.log("==== 0")
Java.perform(function () {
var process_Obj_Module_Arr = Process.enumerateModules();
for(var i = 0; i < process_Obj_Module_Arr.length; i++) {
//包含"lib"字符串的
if(process_Obj_Module_Arr[i].path.indexOf("lib")!=-1)
{
console.log("模块名称:",process_Obj_Module_Arr[i].name);
// console.log("模块地址:",process_Obj_Module_Arr[i].base);
// console.log("大小:",process_Obj_Module_Arr[i].size);
// console.log("文件系统路径",process_Obj_Module_Arr[i].path);
var libname = process_Obj_Module_Arr[i].name
frida_Module_import(libname)
}
}
})
}
function frida_Module_import(libname) {
Java.perform(function () {
const hooks = Module.load(libname);
var Imports = hooks.enumerateExports();
for(var i = 0; i < Imports.length; i++) {
if (Imports[i].name.indexOf('concatTokenMd5') != -1) {
//函数类型
console.log("type:",Imports[i].type);
//函数名称
console.log("name:",Imports[i].name);
//属于的模块
console.log("module:",Imports[i].module);
//函数地址
console.log("address:",Imports[i].address);
}
}
});
}
setImmediate(main)
关键代码在libns.so模块
确认无误,那么m1508s 肯定也在其中
0x28 = 40 ,静态+动态结合,理解代码
MRS X8, #3, c13, c0, #2"表示将协处理器13(c13)的寄存器0(c0)的第2个字段(#2)的值读取到X8寄存器中
经过分析V27是传进来的 timestap + subscribeListEncryption
16907601734120subscribeListEncryption
V28 是 token : ee00a8d3928bed31551132d5449ba3c7
静态分析过,X0是传进来的参数,然后动态单步到 STUR X0, [X29,#var_30] 这里,才开始获取到传入的变量
看到 pre load
我们知道程序流程的下一步就是V25,能定位到附近的关键代码可以快速解决问题
F7 步入V27(V29,V28)
对比在java 层的传入参数,token 和 时间戳字符串,确认这是核心加密函数 cxor
用nodepad++ 改写成标准C++代码
上VS测试结果
结果sign
GFJAIOGCOBMFJGMQJSEPMCBRPTZNPCRA
对比抓包结果一致,至此sign参数算法搞定。
下面是java 层的data 参数,比较简单,简单说一下
也就是这里 时间戳+0-9随机字符一个+subscribel
data 参数直接找到decrpyt函数得到key和iv:
看到了AES字眼,data数据看也像AES
setImmediate(function(){
Java.perform(function(){
console.log("starting script");
var Activity = Java.use("com.temperaturecoin.utils.AESUtil");
Activity.decrypt.implementation = function(para){
console.log("输入参数:"+para)
var result = this.decrypt(para)
console.log("输出:"+result)
return result
}
})
})
frida -U -F com.temperaturecoin -l frida_test.js
易语言算法测试
至此data 参数搞定
某coin APP 的逆向,让我复习了一下frdia基本用法+关键函数SO定位+SO分析算法还原