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

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


1.jpg (99.95 KB, 下载次数: 0)
下载附件
2024-11-14 23:01 上传



2.jpg (143.61 KB, 下载次数: 0)
下载附件
2024-11-14 23:01 上传

操作步骤:
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] 纯文本查看 复制代码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(',')[1];
                    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(',')[1];
                    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);
        };
    });[Asm] 纯文本查看 复制代码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
OP
  


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

android8.0,frida12.8.0,app是1.6.7
kimiman   

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

算一卦,哈哈哈
lyn1875   

感谢分享。
laugh68   

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


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

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


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

看来算命的app不少啊
我又不乱来y   

这种软件到底谁在用
wangjichuan   

感谢分享
您需要登录后才可以回帖 登录 | 立即注册

返回顶部