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文件的获取。

  • 两个链接任选一个都可

安装详情参考链接-1
安装详情参考链接-2

脱壳

开启 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)
posted @ 2022-07-27 10:30  愺様  阅读(2178)  评论(0编辑  收藏  举报