最近好懒、好焦虑,因为菜而焦虑,有段时间没写文章了,今个儿整一篇 uni-app 框架开发的 app 逆向

  1. # 抓包分析接口

    • # 多次抓包,确认 sign 是动态的加密参数

  2. # 定位加密参数

    • # 看起来像 md5 之类的 hash 算法,直接 hook java.security.MessageDigest ,没有得到结果,然后试了试 Hmac 也没结果,看来可能是自己实现的 md5 ,或者再 native 实现的。

    • # 没有壳, jadx 反编译一下,静态分析分析,一顿乱搜,啥特么也没有。。。
    • # 通过大佬的项目 OkHttpLogger-Frida,查询 okhttp3 的特征,具体用法查看此项目的 READMME 。可以看到能 hook 的数据:url、header、response,

    • # 既然找到了混淆的 okhttp3hook 下设置 header 的函数,发现有 uaaccept 等,但还是没有 sign

    • # 总不能在 native 层设置吧,解压包看看,在 assert 下面发现了蛛丝马迹,这不就是 uniapp 的玩意么

    • # uniapp 开发的 app 其实相当于内嵌的 h5 ,是使用 vue 开发前端的框架,可以发布在多个平台。到 开发者选项 勾选 显示布局边界 ,可以看到 app 界面是一个控件。

    • # 对于这种 h5app ,可以通过 chrome 浏览器进行调试,前提是要把可调试功能打开,可以通过 xposed 插件 WebViewDebugHook 或者鱼佬的 frida 脚本, xposed 插件覆盖更广些。
      console.log("脚本加载成功");
      function main(){
          Java.perform(function(){
              var WebView = Java.use('android.webkit.WebView');
              WebView.$init.overload('android.content.Context').implementation = function(a){
                  var result = this.$init(a);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet').implementation = function(a,b){
                  var result = this.$init(a,b);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int').implementation = function(a,b,c){
                  var result = this.$init(a,b,c);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int', 'int').implementation = function(a,b,c,d){
                  var result = this.$init(a,b,c,d);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int', 'boolean').implementation = function(a,b,c,d){
                  var result = this.$init(a,b,c,d);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int', 'java.util.Map', 'boolean').implementation = function(a,b,c,d,e){
                  var result = this.$init(a,b,c,d,e);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
              WebView.$init.overload('android.content.Context', 'android.util.AttributeSet', 'int', 'int', 'java.util.Map', 'boolean').implementation = function(a,b,c,d,e,f){
                  var result = this.$init(a,b,c,d,e,f);
                  this.setWebContentsDebuggingEnabled(true);
                  return result;
              }
          });
      }
      setImmediate(main);
    • # 可调试设置为 True 之后,打开 chrome 浏览器,然后输入 chrome://inspect ,就能看到请求的接口

    • # 点击 inspect,再点击 network,滑动手机界面,查看接口,如果数据是在 js 里请求的,就可以动态调试,但是此 appjava 层请求的,可以看到抓包只有一些图片,那只能静态分析了。

      • # 安装包解压出来,然后用编辑器打开。全局搜一下,还好只有两个地方。

    • # 看起来就是这里,sign 通过 n.default 函数对时间戳加盐值 进行加密

    • # 盲猜 md5 验证一下,竟然蒙对了😂。

    • # 如果加密逻辑复杂点应该和 flutter 似的,也不太好搞。
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

渣渣文 微信支付

微信支付

渣渣文 支付宝

支付宝