feat: publish workphone SDK deployment and API docs
This commit is contained in:
80
sdk/agent/hook/hook_capture_send.js
Normal file
80
sdk/agent/hook/hook_capture_send.js
Normal file
@@ -0,0 +1,80 @@
|
||||
// 微信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; }
|
||||
};
|
||||
Reference in New Issue
Block a user