app样本
- 闲来无事搞一个app,不知道找啥目标搞。结果翻着翻着找到今天的主角那就搞它了。传说中的和抖音同名的抖阴app。常规操作下载app安装打开。介于这个app是有颜色的所以本次全部不打码直接搞。
过root检测
- 打开app一看这个提示这我的暴脾气能忍么。检测到手机root。。说我使用的模拟器或者设备已经被root了。
- 首先拖到jadx看看是否加壳。发现没有被加壳。但是app混淆了。握擦这防护的这么流弊么
- 首先开启我们的firda看看这货检测不检查frida什么的。发现不检查。这小子还算识相。这时候我们想到可以用objection 的disable root来干掉root检测。但是也有可能干不掉。如果app检测root手段比较全面呢。所以我们用自己写的firda root检测定位脚本来测试一下
- 用自己写的root定位检测脚本来看看。这样hook 。然后点击确定。进程没有退出我们已经hook了。然后在打开app看操作
- 打开app看看是否触发了root检测脚本。
at java.io.File.exists(Native Method)
at com.blankj.utilcode.util.w.q(DeviceUtils.java:3)
at com.niming.weipa.ui.splash.SplashActivity.A(SplashActivity.kt:1)
at com.niming.weipa.ui.splash.SplashActivity.K(SplashActivity.kt:3)
at com.niming.weipa.ui.splash.SplashActivity.initView(SplashActivity.kt:
抓包分析
- 抓包发现三处加密
- 分析请求头肯定是有hashmap 这种keyvalue的形式。和hook java bytes字节的方式。所以我们直接hook这种掏出我们的写的js脚本神器hook。直接拿捏定位。 com.niming.weipa.utils.b.b com.niming.weipa.utils.b.a 猜测是aes加密算法
- 根据定位反推一下上一层函数。发现和我们请求包的函数一样。
- 看代码。重点分析一下。f5317d 应该就是秘钥了。当然你直接hook秘钥也行。我们看这个他代码的意思是如果是release debug key就取TestUtil.getSecret2(); 否则是 如果是"release", "staging 取这个TestUtil.getSecretPre() 否则就是取这个 TestUtil.getSecret();。最终是取了 TestUtil.getSecret();。这里需要java 基础和安卓的函数基础如果不知道的可以hook看看
- 我们重点看TestUtil.getSecret(); 里面的这个函数。我们发现这个是native函数(一般这代码大部分在so文件里面)又发现采用静态加载方式System.loadLibrary("security"); 那在lib目录表现形式是libsecurity.so所以我们找这个so曾经就行
- 分析一下这个libsecurity.so getSecret 函数一般在so文件表现形式是java全包名和函数名称以_连接。并且在导出表里面。具体看截图。我们看。32位的so文件用32位的ida打开。
- 看函数的逻辑。我们看到返回一个字符串这就是key了 l8N2iooyp07M9IWa 填充方式加密模式 AES/ECB/PKCS7Padding,
)
验证和总结
- 验证是否正确解密一下看看。其他三处也是同样方式
- 总结要想理解今天的文章。需要动java基础 和java函数在so文件中如何调用如果并且使用的。函数的注册方式静态注册和动态注册等主要system.load 这个函数的函数并不一定就在这个so文件里面可能是个假的 so。通过动态方式注册的。本文恰好就在。要想在so层逆向中牛逼必要的c++和汇编和ida这些知识要学习的。