Xposed+FDex2 app脱壳 (某投诉app脱壳)
Xposed 安装与 FDex2 安装
Xposed框架是一款可以在不修改APK的情况下影响程序运行(修改系统)的框架服务,通过替换/system/bin/app_process程序控制zygote进程,使得app_process在启动过程中会加载XposedBridge.jar这个jar包,从而完成对Zygote进程及其创建的Dalvik虚拟机的劫持。
基于Xposed框架可以制作出许多功能强大的模块,且在功能不冲突的情况下同时运作。此外,Xposed框架中的每一个库还可以单独下载使用,如Per APP Setting(为每个应用设置单独的dpi或修改权限)、Cydia、XPrivacy(防止隐私泄露)、BootManager(开启自启动程序管理应用)对原生Launcher替换图标等应用或功能均基于此框架。
现在市场中加固apk的方式一般有两种:
第一种是对源apk整体做一个加固,放到指定位置,运行的时候再解密动态加载。
第二种是对so进行加固,在so加载内存的时候进行解密释放。
主要针对第一种加固方式进行dex文件的获取。
- 两个链接任选一个都可
脱壳
开启 FDex2 软件检测添加到黑猫投诉APP
点击黑猫投诉
在 /data/user/0/com.sin.heimao 的文件夹下有脱出的 dex 文件,之后反编译dex文件即可
第三种解包方式
脱壳之后在 /data/app/sina.heimao-1/ 的文件下有 base.apk 的黑猫投诉apk包,将base.apk的包分享到本地重新命名为 base.zip 的zip包,解压之后就是app的的源码文件
- 通过文件助手分享到本地
抓包数据分析
- 使用Fiddler抓取模拟器app包, 开启fiddler,配置fidder捕获HTTPS会话和端口连接设置,点击HTTPS,勾选Decrypt HTTPS traffic和Ignore server certificate(unsafe),https设置及connections设置,勾选选择项
参考链接(按照这个流程配置)
- 夜神浏览器网络配置之后开启监听才会被fiddler监听抓到包,注意:fidder配置完需要重启,需要在外面的windows查到本机IP
- 开启fiddler,在模拟浏览器中打开黑猫投诉app,开始抓包
分析源码
用Idea软件打开解压的包文件,在 \assets\dist\views\tousu\tousuDetail.js 路径下找到tousuDetail.js文件,全局查找 signture
根据函数 getUrlParam() 返回的 urlparam 值,查找signature 相关的函数,复原js函数
- app_demo.js 相关参数函数复原
function randomWord(randomFlag, min, max) {
var str = "",
range = min,
arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
// 随机产生
if (randomFlag) {
range = Math.round(Math.random() * (max - min)) + min;
}
for (var i = 0; i < range; i++) {
var pos = Math.round(Math.random() * (arr.length - 1));
str += arr[pos];
}
return str;
}
function getParam() {
var ts = new Date().getTime();
var rs = randomWord(false, 16);
var token = 'P0tk894Tcxi4t%S$';
sign = [ts, rs, token].sort().join('');
return {'ts': ts, 'rs': rs, 'sign': sign};
}
- get_app_sign.py 调用js文件
import execjs
import hashlib
def get_sha256():
with open('app_demo.js', 'r', encoding='utf-8') as f:
js_text = f.read()
ctx = execjs.compile(js_text)
ctx_dict = ctx.call('getParam')
sign_str = ctx_dict['sign']
rs = ctx_dict['rs']
ts = ctx_dict['ts']
sha256 = hashlib.sha256()
sha256.update(sign_str.encode('utf-8'))
signature = sha256.hexdigest()
return {'ts': ts, 'rs': rs, 'signature': signature}
"""
使用sha256加密算法,返回str加密后的字符串
"""
# s = get_sha256()
# print(s)
本文来自博客园,作者:愺様,转载请注明原文链接:https://www.cnblogs.com/wyh0923/p/16523862.html