安卓逆向 某易学app过付费以及抓取结果数据

admin 2024年12月5日21:13:27评论13 views字数 4469阅读14分53秒阅读模式

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

安卓逆向  某易学app过付费以及抓取结果数据
安卓逆向  某易学app过付费以及抓取结果数据

操作步骤:
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 类型的 URLif (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 类型的 URLif (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 () {            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);        });

本文内容来自网络,如有侵权请联系删除

原文始发于微信公众号(逆向有你):安卓逆向 -- 某易学app过付费以及抓取结果数据

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月5日21:13:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   安卓逆向 某易学app过付费以及抓取结果数据https://cn-sec.com/archives/3469319.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息