fyr666 发表于 2024-11-14 23:20

某算命app过付费以及抓取结果数据

感谢肉丝大佬带小弟入门。
整个过程使用到了frida、objection、wallbreaker、jadx、jeb。
当前实现结果:在首页输入相关信息后,直接运行frida脚本 ,直接调用计算方法,并自动跳转到结果界面,在frida脚本中也输出了结果。




操作步骤:
1.脱壳,拿到dex文件
2.查找MainActivity存在的classdex文件
3.使用jadx和jeb分析MainActivity
4.确定是在调用e0()方法后,跳转界面,所以e0()很关键
5.e0()中排查到v.a.x和v.a.j,来处理是否过期
6.使用frida动态修改v.a.x,v.a.j,使两个值都为true
7.通过jeb分析,显示结果是webshow,其中使用的是webview进行加载,那么就hook webview的加载方法,获取结果值
8.关键代码如下:

Java.perform(function(){
                  var va = Java.use("v.a");
                        var result3 = va.x.value = true;
                        var result4 = va.j.value = true;
                        console.log("result3 , result4 => ",result3+","+result4);
                  Java.use("com.xxxx.xxxxx.MainActivity").e0.implementation = function(){
                        console.log("ffffffffff");
                        var va = Java.use("v.a");
                        var result3 = va.x.value = true;
                        var result4 = va.j.value = true;
                        console.log("result3 , result4 => ",result3+","+result4);
      
                        console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
            
                  }
                })

Java.perform(function () {
      // Hook WebView 类
      var WebView = Java.use('android.webkit.WebView');
   
      // Hook loadData 方法
      WebView.loadData.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, mimeType, encoding) {
            console.log('==== Hooked WebView.loadData ====');
            console.log('HTML Content: ' + data);
            console.log('MIME Type: ' + mimeType);
            console.log('Encoding: ' + encoding);
            // 调用原始方法
            this.loadData(data, mimeType, encoding);
      };
   
      // Hook loadDataWithBaseURL 方法
      WebView.loadDataWithBaseURL.overload('java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (baseUrl, data, mimeType, encoding, historyUrl) {
            console.log('==== Hooked WebView.loadDataWithBaseURL ====');
            console.log('Base URL: ' + baseUrl);
            console.log('HTML Content: ' + data);
            console.log('MIME Type: ' + mimeType);
            console.log('Encoding: ' + encoding);
            console.log('History URL: ' + historyUrl);
            // 调用原始方法
            this.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
      };
   
      // Hook loadUrl 方法
      WebView.loadUrl.overload('java.lang.String').implementation = function (url) {
            console.log('==== Hooked WebView.loadUrl ====');
            console.log('URL: ' + url);
            // 检查是否是 data:text/html 类型的 URL
            if (url.startsWith('data:text/html')) {
                try {
                  // 提取 HTML 内容
                  var base64Content = url.split(',');
                  var decodedContent = Java.use('android.util.Base64').decode(base64Content, 0);
                  var htmlContent = Java.use('java.lang.String').$new(decodedContent);
                  console.log('Decoded HTML Content: ' + htmlContent);
                } catch (e) {
                  console.error('Failed to decode HTML content: ' + e);
                }
            }
            // 调用原始方法
            this.loadUrl(url);
      };
    });Java.perform(function () {
      // Hook WebView 类
      var WebView = Java.use('android.webkit.WebView');
   
      // Hook loadData 方法
      WebView.loadData.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, mimeType, encoding) {
            console.log('==== Hooked WebView.loadData ====');
            console.log('HTML Content: ' + data);
            console.log('MIME Type: ' + mimeType);
            console.log('Encoding: ' + encoding);
            // 调用原始方法
            this.loadData(data, mimeType, encoding);
      };
   
      // Hook loadDataWithBaseURL 方法
      WebView.loadDataWithBaseURL.overload('java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (baseUrl, data, mimeType, encoding, historyUrl) {
            console.log('==== Hooked WebView.loadDataWithBaseURL ====');
            console.log('Base URL: ' + baseUrl);
            console.log('HTML Content: ' + data);
            console.log('MIME Type: ' + mimeType);
            console.log('Encoding: ' + encoding);
            console.log('History URL: ' + historyUrl);
            // 调用原始方法
            this.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
      };
   
      // Hook loadUrl 方法
      WebView.loadUrl.overload('java.lang.String').implementation = function (url) {
            console.log('==== Hooked WebView.loadUrl ====');
            console.log('URL: ' + url);
            // 检查是否是 data:text/html 类型的 URL
            if (url.startsWith('data:text/html')) {
                try {
                  // 提取 HTML 内容
                  var base64Content = url.split(',');
                  var decodedContent = Java.use('android.util.Base64').decode(base64Content, 0);
                  var htmlContent = Java.use('java.lang.String').$new(decodedContent);
                  console.log('Decoded HTML Content: ' + htmlContent);
                } catch (e) {
                  console.error('Failed to decode HTML content: ' + e);
                }
            }
            // 调用原始方法
            this.loadUrl(url);
      };
    });Java.perform(function () {
            console.log("开始执行延迟启动 Activity");

            // 获取当前应用的 Context
            var Activity = Java.use('android.app.Activity');
            var currentActivity = Java.use('android.app.ActivityThread').currentActivityThread().getApplication().getApplicationContext();

            // 创建 Intent 对象
            var Intent = Java.use('android.content.Intent');
            var intent = Intent.$new();
            
            // 设置目标 Activity
            var targetClass = 'com.x x x x.xxxx.webshow'; // 替换为你的目标类的完整路径
            intent.setClassName(currentActivity.getPackageName(), targetClass);

            // 启动目标 Activity
            currentActivity.startActivity(intent);
            console.log("启动目标 Activity 成功: " + targetClass);
      });

fyr666 发表于 2024-11-18 09:11

zhangsan173 发表于 2024-11-16 00:47
大佬frida版本和app版本号是多少啊

android8.0,frida12.8.0,app是1.6.7

kimiman 发表于 2024-11-15 12:38

大佬,有推荐的练手软件吗

zyh5028 发表于 2024-11-15 12:48

算一卦,哈哈哈

lyn1875 发表于 2024-11-15 13:19

感谢分享。

laugh68 发表于 2024-11-15 13:59

哈哈哈哈,和论坛上另一个赛博算命的app有的一拼,学习了学习了。

fyr666 发表于 2024-11-15 14:01

kimiman 发表于 2024-11-15 12:38
大佬,有推荐的练手软件吗

我是随便搜了一个,自己就拿来练手了。没想到它都是本地做的,抓包都用不上。

fyr666 发表于 2024-11-15 14:06

laugh68 发表于 2024-11-15 13:59
哈哈哈哈,和论坛上另一个赛博算命的app有的一拼,学习了学习了。

看来算命的app不少啊

我又不乱来y 发表于 2024-11-15 14:08

这种软件到底谁在用

wangjichuan 发表于 2024-11-15 14:32

感谢分享

msmvc 发表于 2024-11-15 15:06

laugh68 发表于 2024-11-15 13:59
哈哈哈哈,和论坛上另一个赛博算命的app有的一拼,学习了学习了。

南方起名程序
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 某算命app过付费以及抓取结果数据