某coin数据加密接口分析

文章介绍了如何使用Frida工具进行动态调试,包括设置代码提示、安装依赖、设备配置、进程附加、模块定位以及加密函数的查找和分析。作者通过示例详细解释了如何处理Android应用的加密签名校验和data参数解密过程,涉及到静态和动态分析的结合应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 新建项目,然后添加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分析算法还原

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值