安卓某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
## 开工
直接用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`就很可疑了,继续跟进
```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`
## 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直接闪退
说明app识别到了frida的特征 ~~自杀了属于是~~ 我们需要过frida检测
在这里使用了大佬编译的[去特征版本的strongR-frida](https://github.com/hzzheyang/strongR-frida-android/releases)
`adb push`到手机后 启动frida服务 重新注入 没有发生闪退情况
并且 可以看到`sub_4BBE4()`的参数被成功打印出来了
在app里面的账号登录页面请求一下login接口试试情况
果然能看到明文信息
将明文复制出来 MD5加密一下 看看结果
验证成功!!
## 后记
这是我第一次尝试分析so 整个过程收获了许多
希望对你也有所帮助 给个精华,期待后续佳作,早日消除违规{:301_997:} 不会就学就对了 到哪都是一推大佬 路过学习 谢谢分享 学习了,逆向最烦就是so了 能不能分析分析那种子进程附加无法frida的:lol 大老牛逼 感谢楼主的分享 学到了啊,膜拜大佬