0x1-前言:
这是<如何在OLLVM混淆中探寻算法>系列的第二篇文章,相信读者通过前面文章的学习,已经对unidbg有了初步的认识,这篇是unidbg的一个进阶,样本涉及的依赖相对前面文章的样本来说比较多,主要是jni调用与文件访问的问题,笔者将拆分成两篇来讲述,一篇是unidbg补环境,一篇是算法分析.国内有难度的样本有四个,分别是libmetasec_ml.so,libsgmain.so,libmtguard.so,libtiny.so,还有一个unidbg补环境的高峰--同盾样本,本篇的样本在这五个样本看来,难度上算简单的.此文是我公众号上面发布后复制过来的,图片和代码块可能会有显示的问题,请移步我的原文:
aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL3MvT0NOUkFfVC1Fek1jRHNjUVBCSDJSUQ==
也欢迎各位师傅关注我的公众号.
0x2-样本信息:
链接直达:
version:
0x3-抓包分析与入口定位:

每个接口的头部都会带上anti_token这个参数,且是2af为前缀的,这个就是我们的目标了,至于定位入口,关键字搜索/hook newstringutf都能定位到.
笔者就不带着大家去跟一遍了,看过我前面的文章,脚本拿过来改一改就能定位了,贴一下最终的入口.
这个info2方法就是最终的入口位置了,他所属的so是libpdd_secure.so,他的入参是一个content和long类型,long类型的参数是时间戳,可以使用我这篇文章的脚本,把native方法的信息枚举出来.
文章跳转
Fashion哥,公众号:Fashion哥的爬虫历险记安卓Native层逆向-只通过一个native方法名枚举出native方法的所有信息
0x4-Unidbg搭架子补环境
先搭个架子:
读者也不必着急复制粘贴,文章末尾会贴一份补好的环境代码.
0x01-补Jni调用
右键运行,发现报了个错

对于此方法,他的返回值是void,我们直接返回即可.
补完发现没有其他报错了,红色的日志是样本自己调用的打印方法,我们可以不管.

接下来是主动调用目标函数,这里有两种方法一种是通过符号去调用,另一种是通过地址去调用,笔者比较习惯符号调用.
info2方法的参数有两个一个是android/content/Context,一个是long,
对于java的八大基本数据类型(byte,char,int,short,long,double,float)等不用做处理,可以直接原封不动的传递,其他的要做包装,像这样进行一层包装.
在main进行调用
运行

报了这个错误
此方法是Android框架中用于获取系统级服务的方法
谷歌官网文档
如果对方法不是很了解的可以看看谷歌的开发文档
可以这样补
打印看看是获取了哪些系统服务

只获取了一个,可以写个判断,然后返回

这个需要frida去主动调用一下拿到结果,返回结果是个string类型,要用unidbg的api封装一下.

同样的,用frida主动调用获取结果,返回时int,基本数据类型,就不用封装.
接着是这个,主动调用获取结果

接着是这个,主动调用获取结果

接着是这个

下一个是

下一个是

下一个接着




这个方法是判断是否处于调试连接,给他返回false

对于这种方法,不会补怎么办,看unidbg的示例代码,看unidbg如何写的,我们也跟着写.
点击(AbstractJni.java:753)跳转过去

unidbg提供了两个示例,我们也跟着改一改
接着继续

他需要的返回值是
我们可以用unidbg提供的api嵌套返回.
代码如下

下面是一个replaceall方法

可以点进去看看unidbg如何实现的,改一改代码即可
当补到这个方法时,离成功已经很接近了,同时也要注意,这个jni调用也拖带出了第一个算法gzip


注意补这个方法要外层套上try-catch

对于此方法,我们也可以看看unidbg内部时如何实现的,然后照猫画虎




补完这个方法过后,成功的出值了.


[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!