感谢肉丝大佬带小弟入门。
整个过程使用到了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] 纯文本查看 复制代码 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);
}); |