a976606645 发表于 2022-11-20 04:53

安卓某app_sign逆向分析过程

## 开篇
> [安卓协议逆向之frida hook百例](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1711668)
> 在看到大佬的这篇文章后,想动手跟着分析一波,在下载目标APP时没有注意版本号的问题,下载了新版本的,记录下分析的过程。

## 准备工具
```python
1. root设备
2. BlackDex
3. frida
4. IDA
5. jadx
```
## 目标
目标是搞到sign的算法 看sign的长相跟长度 先盲猜一波MD5
![](https://pic.imgdb.cn/item/6379083f16f2c2beb11c4e7c.jpg)
## 开工
直接用BlackDex打开目标APP 获取到dex
拖入jadx开始分析
搜索接口名字 查找调用

![](https://pic.imgdb.cn/item/6379062516f2c2beb1189b2b.jpg)

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

![](https://pic.imgdb.cn/item/637906f316f2c2beb11a2bbd.jpg)

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

![](https://pic.imgdb.cn/item/6379088916f2c2beb11cc9e6.jpg)

继续跟进 找到了关键点

![](https://pic.imgdb.cn/item/63790aea16f2c2beb1203897.jpg)

![](https://pic.imgdb.cn/item/63790b7c16f2c2beb120f438.jpg)

![](https://pic.imgdb.cn/item/63790c3e16f2c2beb12266bb.jpg)

![](https://pic.imgdb.cn/item/63790cde16f2c2beb123b178.jpg)

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

![](https://pic.imgdb.cn/item/63790eab16f2c2beb1275449.jpg)

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

![](https://pic.imgdb.cn/item/63790f1016f2c2beb127c457.jpg)

![](https://pic.imgdb.cn/item/637915bd16f2c2beb12f43f5.jpg)

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

![](https://pic.imgdb.cn/item/6379167c16f2c2beb1300ded.jpg)

继续跟进

![](https://pic.imgdb.cn/item/6379172c16f2c2beb130fb1e.jpg)

![](https://pic.imgdb.cn/item/6379187b16f2c2beb132b1b0.jpg)

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

![](https://pic.imgdb.cn/item/63791cd616f2c2beb139ef9c.jpg)

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

![](https://pic.imgdb.cn/item/63791f6816f2c2beb13c6896.png)

![](https://pic.imgdb.cn/item/6379225a16f2c2beb13f1ef6.png)

![](https://pic.imgdb.cn/item/6379230116f2c2beb13fbae8.jpg)

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

![](https://pic.imgdb.cn/item/637925de16f2c2beb1422780.jpg)

这段代码中的`sub_4BBE4`就很可疑了,继续跟进
```Cpp
__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 = toupper((unsigned __int8)a3);
    ++v4;
}
return 0LL;
}
```

在这里 发现了一个MD5关键函数
分析到这里 我们该验证一下了 已知该函数的偏移地址是:`0x4BBE4`

![](https://pic.imgdb.cn/item/6379286716f2c2beb14498df.jpg)

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

接下来编写frida的hook脚本
将IDA分析的函数偏移地址填写进脚本
```javascript
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.readCString())
      }, onLeave: function (retval) {
            console.log(retval)
      }
    });
});
```
编写好脚本后 使用`adb shell`命令 启动手机上的`frida-server`注入脚本
```
frida -U -f com.cxxx.xxxxx --no-pause -l hook3.js
```

注入后出现问题了app直接闪退

![](https://pic.imgdb.cn/item/6379311116f2c2beb14e3ed0.jpg)

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

![](https://pic.imgdb.cn/item/6379367516f2c2beb152f488.jpg)

在app里面的账号登录页面请求一下login接口试试情况

果然能看到明文信息



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



验证成功!!

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

正己 发表于 2022-11-20 09:26

给个精华,期待后续佳作,早日消除违规{:301_997:}

JackSon001 发表于 2022-11-22 16:17

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

constwm 发表于 2022-11-20 08:55

到哪都是一推大佬

xmnh 发表于 2022-11-20 09:00

路过学习

lbg2222000 发表于 2022-11-20 09:07

谢谢分享

maroo 发表于 2022-11-20 09:16

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

lyghost 发表于 2022-11-20 09:23

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

y2006y2006 发表于 2022-11-20 10:01

大老牛逼

wwb66668 发表于 2022-11-20 10:21

感谢楼主的分享

lsrnb 发表于 2022-11-20 10:25

学到了啊,膜拜大佬
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 安卓某app_sign逆向分析过程