安卓某app_sign逆向分析过程

查看 139|回复 10
作者:a976606645   
开篇

安卓协议逆向之frida hook百例
在看到大佬的这篇文章后,想动手跟着分析一波,在下载目标APP时没有注意版本号的问题,下载了新版本的,记录下分析的过程。

准备工具
1. root设备
2. BlackDex
3. frida
4. IDA
5. jadx
目标
目标是搞到sign的算法 看sign的长相跟长度 先盲猜一波MD5

开工
直接用BlackDex打开目标APP 获取到dex
拖入jadx开始分析
搜索接口名字 查找调用

发现有两处调用的地方,双击进去探探情况

继续搜索一下定义的名称  查找调用

继续跟进 找到了关键点




分析so
解压apk  找到lib下的 libblackBox.so  在IDA中打开
在IDA方法窗口中搜索getInterfaceSign  无果
推测方法为动态注册  到JNI_OnLoad入口找找看

按下F5查看伪代码
看到VX+XXX这种格式的伪代码 鼠标点击定位到VX的位置 按Y键修复指针


进入查看
找到了动态注册的方法 分析上面JAVA层调用的getInterfaceSign方法 只有一个参数 最终确定so层的函数为sub_49268

继续跟进


鼠标点击定位到`a1`的位置 按`Y`键修复指针
一番寻找之后 发现所有的return里面 都有`a1`的参与
那现在目的就明确了 我们需要找到对`a1`有所改动的地方
但是没有发现直接对`a1`赋值的的语句
这说明`a1`是在某一个调用函数里面改变的值
接下来的重点就是调查里面的sub函数们
先着重调查了`a1`为参数的函数  没有找到有用的信息

在排查过程中  发现了这个函数 明文上没有a1参数的参与
但是把鼠标移动到v34上 弹出的提示信息中 有a1的存在 跟进一下



终于 在sub_F39A8发现了关键点 一个小写转大写的函数过程

这段代码中的sub_4BBE4就很可疑了,继续跟进
__int64 __fastcall sub_F39A8(__int64 a1, __int64 a2, const char *a3)
{
  __int64 v4; // x19
  if ( !a1 && !a3 )
    return 0xFFFFFFFFLL;
  v4 = 0LL;
  if ( sub_4BBE4() )
    return 0xFFFFFFFFLL;
  while ( (int)strlen(a3) > (int)v4 )
  {
    a3[v4] = toupper((unsigned __int8)a3[v4]);
    ++v4;
  }
  return 0LL;
}
在这里 发现了一个MD5关键函数
分析到这里 我们该验证一下了 已知该函数的偏移地址是:0x4BBE4

frida hook so

我这里使用的是安卓真机 安装了去root特征的系统
我不确定目标APP有无root检测
如测试时启动APP有闪退的情况 还需要自行过一下root检测

接下来编写frida的hook脚本
将IDA分析的函数偏移地址填写进脚本
Java.perform(function () {
    function get_func_addr(module, offset) {
        var base_addr = Module.findBaseAddress(module);
        console.log("base_addr: " + base_addr);
        console.log(hexdump(ptr(base_addr), {
            length: 16, header: true, ansi: true
        }))
        var func_addr = base_addr.add(offset);
        if (Process.arch == 'arm') return func_addr.add(1);  //如果是32位地址+1
        else return func_addr;
    }
    var func_addr = get_func_addr('libblackBox.so', 0x4BBE4);//参数:so名称  偏移地址
    console.log('func_addr: ' + func_addr);
    console.log(hexdump(ptr(func_addr), {
        length: 16, header: true, ansi: true
    }))
    Interceptor.attach(ptr(func_addr), {
        onEnter: function (args) {//产生调用时hook输入的参数
            console.log("onEnter");
            console.log(args[0].readCString())
        }, onLeave: function (retval) {
            console.log(retval)
        }
    });
});
编写好脚本后 使用adb shell命令 启动手机上的frida-server  注入脚本
frida -U -f com.cxxx.xxxxx --no-pause -l hook3.js
注入后出现问题了  app直接闪退

说明app识别到了frida的特征 自杀了属于是 我们需要过frida检测
在这里使用了大佬编译的去特征版本的strongR-frida
adb push到手机后 启动frida服务 重新注入 没有发生闪退情况
并且 可以看到sub_4BBE4()的参数被成功打印出来了

在app里面的账号登录页面  请求一下login接口试试情况
果然能看到明文信息


微信图片_20221120041005.png (239.4 KB, 下载次数: 2)
下载附件
2022-11-20 04:10 上传

将明文复制出来 MD5加密一下 看看结果


微信图片_20221120041352.png (62.87 KB, 下载次数: 1)
下载附件
2022-11-20 04:14 上传

验证成功!!
后记
这是我第一次尝试分析so 整个过程收获了许多
希望对你也有所帮助

函数, 参数

JackSon001   

so分析这块讲的有点快奥,根据返回长度能大概猜出大概的hash算法,然后通过hash查找插件找一下可疑函数,然后再hook,有可能是hash函数变种等等
constwm   

到哪都是一推大佬
xmnh   

路过学习
lbg2222000   

谢谢分享
maroo   

学习了,逆向最烦就是so了
lyghost   

能不能分析分析那种子进程附加无法frida的
y2006y2006   

给个精华,期待后续佳作,早日消除违规
wwb66668   

大老牛逼
lsrnb   

感谢楼主的分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部