【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。...
接上篇,使用Xposed來hook微信,找到微信進程:https://blog.csdn.net/weixin_42127613/article/details/81839537
既然已經找到了微信進程,那么就可以對微信的數據進行攔截獲取了。
hook到微信的聊天消息,比較簡單,只需要hook住數據庫的插入方法即可。
因為一旦來了新消息,微信就會往本地數據庫插入聊天消息,將聊天消息保存到本地。所以我們只要hook住消息的插入動作,就能實時的獲取到聊天消息。
微信的數據庫操作有很多類和實例,但最終都是調用了com.tencent.wcdb.database.SQLiteDatabase這個類。
插入方法用的是insert,insert內部又調用了insertWithOnConflict方法。我們可以hook住insert方法,也可以hook住insertWithOnConflict方法。
我們采用hook最終方法吧。hook這個insertWithOnConflict方法。
反編譯微信,去查看com.tencent.wcdb.database.SQLiteDatabase這個類的insertWithOnConflict方法,看看都有什么參數,才能編寫hook代碼。如下圖所示,有4個參數。
?
現在編寫hook代碼。在MainXposed中新建一個方法hookDatabaseInsert,進行hook。
//hook數據庫插入操作
private void hookDatabaseInsert(final XC_LoadPackage.LoadPackageParam loadPackageParam) {
Class<?> classDb = XposedHelpers.findClassIfExists(WECHAT_DATABASE_PACKAGE_NAME, loadPackageParam.classLoader);
if (classDb == null) {
XposedBridge.log("hook數據庫insert操作:未找到類" + WECHAT_DATABASE_PACKAGE_NAME);
return;
}
XposedHelpers.findAndHookMethod(classDb,
"insertWithOnConflict",
String.class, String.class, ContentValues.class, int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("HOOK住微信數據庫插入操作。");
}
});
}
在主函數handleLoadPackage方法中加入調用,如下代碼。
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.processName.equals(WECHAT_PROCESS_NAME)) {
return;
}
XposedBridge.log("進入微信進程:" + lpparam.processName);
//調用 hook數據庫插入。
hookDatabaseInsert(lpparam);
}
現在開始執行,測試,查看日志。如下圖所示,發現了很多數據庫操作。
?
為了能清晰的查看消息。我們過濾掉非聊天消息的插入動作,同時將聊天消息的內容解析出來。
微信的新聊天消息,會插入2個表:message和rconversation。
message表:消息內容總表。所有的聊天消息,都會存入到這個表。
rconversation表:當前的會話表。就是進入微信,在主界面看到的列表。這個表保存的是最后一條聊天記錄,每次有新消息,都會更新這個表。
我們hook這2個表中的任意一個都可以,但是rconversation表不僅有insert,還有update操作,所以我們還是只取message表即可。
為了能輸出數據庫的插入數據,我們特意定義一個函數printInsertLog,用于輸出數據庫插入日志。
//輸出插入操作日志
private void printInsertLog(String tableName, String nullColumnHack, ContentValues contentValues, int conflictValue) {
String[] arrayConflicValues =
{"", " OR ROLLBACK ", " OR ABORT ", " OR FAIL ", " OR IGNORE ", " OR REPLACE "};
if (conflictValue < 0 || conflictValue > 5) {
return;
}
XposedBridge.log("Hook數據庫insert。table:" + tableName
+ ";nullColumnHack:" + nullColumnHack
+ ";CONFLICT_VALUES:" + arrayConflicValues[conflictValue]
+ ";contentValues:" + contentValues);
}
改進代碼,去掉之前的日志輸出,過濾掉非聊天消息表,輸出消息日志?,F在hookDatabaseInsert的代碼為:
//hook數據庫插入操作
private void hookDatabaseInsert(final XC_LoadPackage.LoadPackageParam loadPackageParam) {
Class<?> classDb = XposedHelpers.findClassIfExists(WECHAT_DATABASE_PACKAGE_NAME, loadPackageParam.classLoader);
if (classDb == null) {
XposedBridge.log("hook數據庫insert操作:未找到類" + WECHAT_DATABASE_PACKAGE_NAME);
return;
}
XposedHelpers.findAndHookMethod(classDb,
"insertWithOnConflict",
String.class, String.class, ContentValues.class, int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
String tableName = (String) param.args[0];
ContentValues contentValues = (ContentValues) param.args[2];
if (tableName == null || tableName.length() == 0 || contentValues == null) {
return;
}
//過濾掉非聊天消息
if (!tableName.equals("message")){
return;
}
//打印出日志
printInsertLog(tableName, (String) param.args[1], contentValues, (Integer) param.args[3]);
}
});
}
編譯、運行、重啟,查看日志。沒有日志輸出,那么給當前的微信號,發送一條消息試試看。如下圖所示,已經成功的獲取到了聊天消息。
?
查看日志詳情,可以看到插入的contentValues數據內容。
Hook數據庫insert。table:message;nullColumnHack:msgId;CONFLICT_VALUES:;contentValues:bizClientMsgId= msgId=2622 msgSvrId=6403889649528004581 talker=wxid_e77yg22 content=在不在 flag=0 status=3 msgSeq=680182320 createTime=1534678573000 lvbuffer=[B@4428279 isSend=0 type=1 bizChatId=-1 talkerId=378
我們想要什么數據,只需要從contentValues的相應字段中取即可。
好了,現在我們已經成功的hook到微信的實時聊天消息,想怎么處理,就看你了。
代碼已提交:https://github.com/dalu2048/WeChatGenius.git
接下來,下篇文章,測試文本消息自動回復功能:https://blog.csdn.net/weixin_42127613/article/details/81841099
---------------------
from:https://blog.csdn.net/weixin_42127613/article/details/81840536
總結
以上是生活随笔為你收集整理的【转】编写微信聊天机器人4《聊天精灵WeChatGenius》:实时获取到微信聊天消息,hook数据库插入操作。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HanLPTokenizer HanLP
- 下一篇: Redis Sentinel 配置文件