Files
workphone-sdk/sdk/agent/hook/hook_capture_send.js

81 lines
3.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 微信8.0.56 真实发送类名捕获脚本
// 策略Hook WCDB写入 + OkHttp/网络层,捕获真实调用栈
var results = {
send_classes: [],
sns_classes: [],
network_calls: [],
db_writes: []
};
// 1. Hook WCDB SQLiteDatabase.insert - 捕获消息写入调用栈
try {
var WCDBClass = Java.use('com.tencent.wcdb.database.SQLiteDatabase');
WCDBClass.insert.overload('java.lang.String', 'java.lang.String', 'android.content.ContentValues').implementation = function(table, nullColumnHack, values) {
var result = this.insert(table, nullColumnHack, values);
if (table === 'message' || table === 'SnsInfo' || table === 'StarSnsInfo') {
var stack = Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Exception').$new()).split('\n');
var relevant = stack.filter(function(s) { return s.indexOf('com.tencent.mm') > -1 && s.indexOf('wcdb') === -1; }).slice(0, 8);
send({type: 'db_write', table: table, stack: relevant.join('\n'), rowId: result});
}
return result;
};
console.log('[+] WCDB insert hooked');
} catch(e) { console.log('[-] WCDB insert hook failed: ' + e); }
// 2. Hook OkHttp3 发送请求 - 捕获微信HTTP请求
try {
var OkHttpClient = Java.use('okhttp3.OkHttpClient');
var Request = Java.use('okhttp3.Request');
var RealCall = Java.use('okhttp3.internal.connection.RealCall');
RealCall.execute.implementation = function() {
var req = this.request();
var url = req.url().toString();
if (url.indexOf('weixin') > -1 || url.indexOf('wx') > -1 || url.indexOf('mm') > -1) {
var stack = Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Exception').$new()).split('\n');
var relevant = stack.filter(function(s) { return s.indexOf('com.tencent.mm') > -1; }).slice(0, 6);
send({type: 'network', url: url, stack: relevant.join('\n')});
}
return this.execute();
};
console.log('[+] OkHttp3 hooked');
} catch(e) { console.log('[-] OkHttp3 hook failed: ' + e); }
// 3. Hook MMProtocol/网络发送 - 微信自己的协议层
var netClasses = [
'com.tencent.mm.protocal.MMProtocol',
'com.tencent.mm.network.MMNetworkManager',
'com.tencent.mm.sdk.platformtools.NetWorkUtil',
'com.tencent.mm.model.b',
'com.tencent.mm.model.c',
'com.tencent.mm.model.d',
];
netClasses.forEach(function(cls) {
try {
var C = Java.use(cls);
send({type: 'found_class', cls: cls});
} catch(e) {}
});
// 4. 枚举所有已加载的 com.tencent.mm.model.* 类发送消息通常在model层
Java.enumerateLoadedClasses({
onMatch: function(name) {
if (name.indexOf('com.tencent.mm.model') > -1 ||
name.indexOf('com.tencent.mm.protocal') > -1 ||
name.indexOf('com.tencent.mm.network') > -1 ||
name.indexOf('SnsUpload') > -1 ||
name.indexOf('SendMsg') > -1 ||
name.indexOf('ChatMsg') > -1) {
send({type: 'class_found', name: name});
}
},
onComplete: function() {
send({type: 'enum_done'});
}
});
console.log('[*] Hook setup complete. Waiting for user to send a message...');
rpc.exports = {
getResults: function() { return results; }
};