【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库

/作者:Kali_MG1937
QQ:3496925334
****博客号:ALDYS4
/

某天午睡,朦朦胧胧梦到给学校提供建站模板的公司有个注射点
梦醒后,我凭借着零散的记忆日进了对面的数据库,,,

0x00寻找突破点

打开学校的官网,找到技术支持,百度域名
打开首页,emm
就一个登录页面,没了
随便写点东西提交看看
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
天生手欠的我一不小心就多输了一个单引号
回车
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
WDNMD,除了数字和字母其他都不行?
这叫我怎么日你?
刚刚要放弃,就在这时,首页的一个二维码吸引了我
正是该公司开发的安卓端的软件,我眼前一亮,仿佛找到了打开新世界的大门

开开心心地把软件下载过来,正想反编译找找看有什么可利用的接口
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
360加固?
fa?!
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
本以为上帝关上了我的门,还会留个窗给我,结果还是无情地把窗砰地一声给我锁上了

0x01 ZjDroid脱壳

经过一番搜索,找到了一款脱壳工具
我们已经知道不论是利用什么方法加固apk
若要让软件要正常运行,就必须让程序最终加载原dex文件,这样的话,如果我能dump出内存中已经加载的dex
就可以无视在加载dex前的一大堆解壳操作
ZjDroid就可以做到这一点,ZjDroid是一款基于Xposed开发的插件,它可以轻松地hook住所有的activity,并且将软件当前加载的dex写出

在github上fork其源码,进行分析
有进行过Xposed插件开发的大佬们都知道,想让Xposed加载你编写的插件的核心代码
就必须在assest/xposed_init文件内写入你想要加载的核心代码的所在包
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
进入ReverseXposedModule类
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
可以看到图中两处红线标记处
因为我们的目的是Dump处dex文件,所以先对第二处红线标记处进行分析
跟进DexFileInfoCollecterstart方法
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
通过观察代码可知,第一处红线标记处程序利用反射找到了系统DexFile类openDexFileNative方法
这个方法和系统加载dex文件有关,这里不深入分析
接着看第二处标记处,程序调用Xposed模块的hookMethod方法hook住了openDexFileNative方法
继续看第三处,在hook完成之后,只要系统调用到了openDexFileNative方法,红线处的代码就会执行
第三处红线处的代码用于获取加载的dex的信息,这里不深入分析
也就是说,只要用户打开某个app,系统调用dex文件的方法就会被执行,那么ZjDroid只需要hook住系统调用dex文件的方法,就可以在软件加载原dex后做任何事情了!
hook加载dex方法的代码已经执行完毕

我们回到ReverseXposedModule类中的第一处红线标记处,进行分析
跟进其调用的initModuleContext方法
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
查看第一处标记,程序同样的找到了Application类的onCreate方法
开发过app的大佬们都很熟悉这个onCreate方法吧,这是每个软件在启动时默认最先执行的方法
这里ZjDroid同样对系统的Application类的onCreate方法进行了hook,换句话说,只要用户点开任何一个软件,都能被程序hook住
同样的,程序也是利用hookMethod进行的hook操作,hook后的操作在ApplicationOnCreateHook类中,跟进代码
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
可以看到程序给每个被hook的app注册了一个广播,跟进代码
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
分析代码可知,当被hook的app接收到含有com.zjdroid.invoke字符的广播时就会进入判断
程序将提取出广播中键为"target"和"cmd"的值
通过图中第二处红线下方的代码可知target就是app的pid号
在获取cmd的值后,cmd的值将被传入CommandHandlerParser类中
跟进代码
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
观察代码可知cmd的值就是一个json格式的字符串
程序将根据json中的值对应地执行操作
我们需要dump出dex文件,假设我发送的广播进入了ACTION_DUMP_DEXFILE分支
程序将向DumpDexFileCommandHandler类传入指定值,跟进代码
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
其中红线标记处就是dump dex文件的核心代码了
跟进
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
查看其中红线处,data成员调用的方法就是dump出内存中dex文件的代码,接着程序将data写出到指定目录
遗憾的是,红线出的代码为native层的代码,而native层的代码作者并没有开源
编译,运行
踩坑注意:这个工具的so文件似乎在5.0以上的安卓系统不起作用,所以我特意刷了一个4.4的安卓再去安装ZjDroid
在手机的Xposed中启用此插件,然后打开需要脱壳的app
adb shell dumpsys activity top查看最顶层活动的PID号
接着发送广播dump出dex
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
dex被成功dump

0x02寻找接口

【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
查看软件的入口
打开指定类
未加壳的dex成功被加载了!
我现在看到的是原dex的代码,而不是壳dex的代码!
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
可以看到onCreate方法为native层方法,但是接着往下看
getInfo方法中有一个利用post请求调用的登录接口
请求一下看看什么情况
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
WTF?返回的实体中告诉我无权调用此接口?!
难怪把onCreate方法放在native层里!一定是在onCreate方法中需要进行什么操作才能正常调用此接口
可native层的代码实在是无能为力
本打算就这么放弃了,最后一次在代码中搜索可能存在的接口
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
其中一处接口让我眼前一亮
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
我抱着试试看的心态请求了此接口
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
WTF?!WTF?!居然可以请求!还没有过滤特殊符号?!
管理员还真是粗心
丢到sqlmap里
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库
【分析&渗透实战】Dump内存中Dex的神器_我是如何脱壳某公司加固过的Apk并利用其API日进对方数据库MSSQL数据库!
成功日进对方数据库!
完事,收工!