声明
本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负!
如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!
本文适用于对安卓开发和Java有了解的同学!
文中涉及的app均放在网盘中,有需自取!
前言
前几天写了一篇关于某动网的js逆向文章,然后又发现了它的app竟然也有加密。那么今天就将这个app分析一下。
其实网页端和app端的加密非常类似(一模一样),区别在于实现的语言的不同。
附js文章链接:js逆向-某动网演出数据获取
目标app:x动
目标参数:data、sign
工具介绍
- frida
- charles
- nexus 6p
- postern
抓包分析
这个app对于抓包会有一些检测,对于挂了代理软件都会有检测。
使用fiddler甚至都抓不到包。
对于这个问题怎么解决呢,凡事不会就去百度,一般来说都可以找到解决方案。
这里我使用的是一个hook vpn的脚本,依然是依赖于frida。
function hook_vpn(){
Java.perform(function (){
var String = Java.use("java.lang.String");
var NetworkInterface = Java.use("java.net.NetworkInterface");
NetworkInterface.getName.implementation = function (){
var result = this.getName();
console.log("find getName:", result);
if (result && (result.indexOf("ppp0") > -1 || result.indexOf("tun0") > -1)){
result = String.$new("rmnet_data0");
}
return result;
}
var ConnectivityManager = Java.use("android.net.ConnectivityManager");
ConnectivityManager.getNetworkCapabilities.implementation = function (arg){
var result = this.getNetworkCapabilities(arg);
console.log("find getNetworkCapabilities:", result);
return null;
}
Java.use("android.net.NetworkCapabilities").hasTransport.implementation = function(v){
console.log(v)
var res = this.hasTransport(v)
console.log("res hasTransport ==> ", res)
return false;
}
})
}
setImmediate(hook_vpn);
如果小伙伴们有更好的过代理检测脚本可以在下方评论或者私信分享给笔者哦。
启动脚本后,打开charles后发现就可以抓到包了。
抓包数据和真机数据完全是对的上的,这里的抓包就没有任何问题。
做爬虫的同学都知道,要构建一个爬虫需要一个完整的request。看一下post请求中提交的data。
在这里有三个可疑的值,经过反复抓包发现aru是一个定值,sign和data在不断的变换,可以确定这两个地方是进行了加密。
脱壳
完成上述分析后,就要开始编写frida的hook脚本了。
打开后会有一个坑,看不到apk的源码。
这是为什么呢?是因为apk做了防护,加了一层壳。
这里的加壳很简单是一个360的,使用一下脚本或工具就可以脱掉。
介绍一个查壳工具,只需要将apk拖进去就可以看出是什么加固。
所以在分析源码之前最好是查一下有没有加固。
寻找加密参数
完成脱壳后将所以的dex文件放进jadx中,搜索关键字,找到如下图:
进入之后就定位到了sign、data的加密处。
Frida hook 脚本编写
直接看函数f.v.a.j.l.d(x, jSONString)
,因为sign的参数值里也有相同的JSONS字符串。
运行脚本后关于x和JSONString就被输出了.
jSONString = {"action":"/app/activity/search","deviceName":"Nexus 6P","qtime":1673682226239,"query":{"activityType":"34","cityId":"10","cityType":1,"isHome":1,"pageNo":7,"pageSize":脱敏,脱敏,脱敏,脱敏,脱敏,,"sysVersion":"8.1.0"}
x = FztG254r4uaUo7Ih
hook脚本:
# -*- coding:utf-8 -*-
import frida, sys
hook_data = """
Java.perform(function () {
send("start hook!")
var l = Java.use('f.v.a.j.l')
l.d.implementation = function (str1,jSONString) {
console.log("str1---->:",str1)
console.log("jSONString---->:",jSONString)
console.log("data---->:",this.d(str1,jSONString))
return this.d(str1,str2);
};
});
"""
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
process = frida.get_usb_device().attach('com.showstartfans.activity')
script = process.create_script(hook_data)
script.on('message', on_message)
script.load()
sys.stdin.read()
data值加密,所以继续追踪源码观察加密,之后就可以使用rpc或者python去还原。
这也太熟悉了,AES加密,和网页端一模一样。
d函数完成了加密,传入的第一个参数就是x,也就是AES的密钥。
那不用说sign肯定是md5,直接看源码。
知道了加密参数和加密方法,使用python直接还原就可以了。
剩下的就是都会的事情了。
最后
总结一下该apk使用到的一些方法:
- 抓包检测
- apk脱壳
- 加密还原
链接:代码
apk获取
链接:https://pan.baidu.com/s/1v09qWEP5qnaxfqeYAmBTGw
提取码:8888