From 885064f658fb39a1fd3035ae385ff9b5b2788a04 Mon Sep 17 00:00:00 2001 From: ljc545w Date: Fri, 10 Jun 2022 19:32:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Ehook=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E3=80=81=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CWeChatRobot/HookImageMessage.cpp | 35 ++++ CWeChatRobot/HookVoiceMessage.cpp | 35 ++++ CWeChatRobot/ReceiveMessage.h | 7 +- CWeChatRobot/WeChatRobot.cpp | 45 +++++ CWeChatRobot/WeChatRobot.h | 5 + CWeChatRobot/WeChatRobotCOM.idl | 5 + CWeChatRobot/WeChatRobotCOM.vcxproj | 4 + CWeChatRobot/WeChatRobotCOM.vcxproj.filters | 15 ++ CWeChatRobot/WeChatRobotCOM_i.h | 56 ++++++ CWeChatRobot/WeChatRobotCOM_p.c | 198 +++++++++++++++++++- CWeChatRobot/pch.cpp | 19 ++ CWeChatRobot/robotdata.h | 17 +- CWeChatRobot/wechatver.cpp | 23 +++ CWeChatRobot/wechatver.h | 3 + DWeChatRobot/DWeChatRobot.vcxproj | 4 + DWeChatRobot/DWeChatRobot.vcxproj.filters | 15 ++ DWeChatRobot/HookImageMessage.cpp | 98 ++++++++++ DWeChatRobot/HookVoiceMessage.cpp | 70 +++++++ DWeChatRobot/ReceiveMessage.h | 10 +- DWeChatRobot/pch.cpp | 58 ++---- DWeChatRobot/pch.h | 4 +- DWeChatRobot/wechatver.cpp | 78 ++++++++ DWeChatRobot/wechatver.h | 7 + Python/test.py | 1 + Python/wxRobot.py | 20 +- README.md | 18 +- Release/CWeChatRobot.exe | Bin 95232 -> 98304 bytes Release/DWeChatRobot.dll | Bin 53248 -> 60416 bytes 28 files changed, 788 insertions(+), 62 deletions(-) create mode 100644 CWeChatRobot/HookImageMessage.cpp create mode 100644 CWeChatRobot/HookVoiceMessage.cpp create mode 100644 CWeChatRobot/wechatver.cpp create mode 100644 CWeChatRobot/wechatver.h create mode 100644 DWeChatRobot/HookImageMessage.cpp create mode 100644 DWeChatRobot/HookVoiceMessage.cpp create mode 100644 DWeChatRobot/wechatver.cpp create mode 100644 DWeChatRobot/wechatver.h diff --git a/CWeChatRobot/HookImageMessage.cpp b/CWeChatRobot/HookImageMessage.cpp new file mode 100644 index 0000000..f85b28c --- /dev/null +++ b/CWeChatRobot/HookImageMessage.cpp @@ -0,0 +1,35 @@ +#include "pch.h" + +BOOL HookImageMsg(wchar_t* savepath) { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD dwRet = 0x0; + LPVOID savepathaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE); + DWORD dwWriteSize = 0; + if (!savepathaddr) + return 1; + WriteProcessMemory(hProcess, savepathaddr, savepath, wcslen(savepath) * 2 + 2, &dwWriteSize); + DWORD HookImageMsgRemoteAddr = WeChatRobotBase + HookImageMsgRemoteOffset; + HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)HookImageMsgRemoteAddr, savepathaddr, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + GetExitCodeThread(hThread, &dwRet); + CloseHandle(hThread); + } + VirtualFreeEx(hProcess, savepathaddr, 0, MEM_RELEASE); + return dwRet == 0; +} + +void UnHookImageMsg() { + if (!hProcess) + return; + DWORD dwId = 0x0; + DWORD UnHookImageMsgRemoteAddr = GetWeChatRobotBase() + UnHookImageMsgRemoteOffset; + HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)UnHookImageMsgRemoteAddr, NULL, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } +} \ No newline at end of file diff --git a/CWeChatRobot/HookVoiceMessage.cpp b/CWeChatRobot/HookVoiceMessage.cpp new file mode 100644 index 0000000..b0ae623 --- /dev/null +++ b/CWeChatRobot/HookVoiceMessage.cpp @@ -0,0 +1,35 @@ +#include "pch.h" + +BOOL HookVoiceMsg(wchar_t* savepath) { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD dwRet = 0x0; + LPVOID savepathaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE); + DWORD dwWriteSize = 0; + if (!savepathaddr) + return 1; + WriteProcessMemory(hProcess, savepathaddr, savepath, wcslen(savepath) * 2 + 2, &dwWriteSize); + DWORD HookVoiceMsgRemoteAddr = WeChatRobotBase + HookVoiceMsgRemoteOffset; + HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)HookVoiceMsgRemoteAddr, savepathaddr, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + GetExitCodeThread(hThread, &dwRet); + CloseHandle(hThread); + } + VirtualFreeEx(hProcess, savepathaddr, 0, MEM_RELEASE); + return dwRet == 0; +} + +void UnHookVoiceMsg() { + if (!hProcess) + return; + DWORD dwId = 0x0; + DWORD UnHookVoiceMsgRemoteAddr = GetWeChatRobotBase() + UnHookVoiceMsgRemoteOffset; + HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)UnHookVoiceMsgRemoteAddr, NULL, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } +} \ No newline at end of file diff --git a/CWeChatRobot/ReceiveMessage.h b/CWeChatRobot/ReceiveMessage.h index 8df94ee..423a656 100644 --- a/CWeChatRobot/ReceiveMessage.h +++ b/CWeChatRobot/ReceiveMessage.h @@ -2,4 +2,9 @@ #include BOOL StartReceiveMessage(); SAFEARRAY* ReceiveMessage(); -BOOL StopReceiveMessage(); \ No newline at end of file +BOOL StopReceiveMessage(); + +BOOL HookImageMsg(wchar_t* savepath); +BOOL HookVoiceMsg(wchar_t* savepath); +void UnHookImageMsg(); +void UnHookVoiceMsg(); \ No newline at end of file diff --git a/CWeChatRobot/WeChatRobot.cpp b/CWeChatRobot/WeChatRobot.cpp index 0adb26d..c1c5399 100644 --- a/CWeChatRobot/WeChatRobot.cpp +++ b/CWeChatRobot/WeChatRobot.cpp @@ -309,4 +309,49 @@ STDMETHODIMP CWeChatRobot::CSearchContactByNet(BSTR keyword, VARIANT* __result) STDMETHODIMP CWeChatRobot::CAddBrandContact(BSTR PublicId, int* __result) { *__result = AddBrandContact(PublicId); return S_OK; +} + +/* +* 参数1:保存路径 +* 参数2:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CHookVoiceMsg(BSTR savepath, int* __result) { + *__result = HookVoiceMsg(savepath); + return S_OK; +} + +/* +* 参数1:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CUnHookVoiceMsg(int* __result) { + UnHookVoiceMsg(); + *__result = 0; + return S_OK; +} + +/* +* 参数1:保存路径 +* 参数2:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CHookImageMsg(BSTR savepath, int* __result) { + *__result = HookImageMsg(savepath); + return S_OK; +} + +/* +* 参数1:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CUnHookImageMsg(int* __result) { + UnHookImageMsg(); + *__result = 0; + return S_OK; +} + +/* +* 参数1:版本号 +* 参数2:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CChangeWeChatVer(BSTR verStr, int* __result) { + *__result = ChangeWeChatVer(verStr); + return S_OK; } \ No newline at end of file diff --git a/CWeChatRobot/WeChatRobot.h b/CWeChatRobot/WeChatRobot.h index 83d9244..9c049ec 100644 --- a/CWeChatRobot/WeChatRobot.h +++ b/CWeChatRobot/WeChatRobot.h @@ -81,6 +81,11 @@ public: STDMETHODIMP CStartWeChat(int* __result); STDMETHODIMP CSearchContactByNet(BSTR keyword, VARIANT* __result); STDMETHODIMP CAddBrandContact(BSTR PublicId, int* __result); + STDMETHODIMP CHookVoiceMsg(BSTR savepath, int* __result); + STDMETHODIMP CUnHookVoiceMsg(int* __result); + STDMETHODIMP CHookImageMsg(BSTR savepath, int* __result); + STDMETHODIMP CUnHookImageMsg(int* __result); + STDMETHODIMP CChangeWeChatVer(BSTR verStr, int* __result); }; OBJECT_ENTRY_AUTO(__uuidof(WeChatRobot), CWeChatRobot) diff --git a/CWeChatRobot/WeChatRobotCOM.idl b/CWeChatRobot/WeChatRobotCOM.idl index c95bc11..2f82156 100644 --- a/CWeChatRobot/WeChatRobotCOM.idl +++ b/CWeChatRobot/WeChatRobotCOM.idl @@ -46,6 +46,11 @@ interface IWeChatRobot : IDispatch [id(28)] HRESULT CStartWeChat([out, retval] int* __result); [id(29)] HRESULT CSearchContactByNet([in] BSTR keyword, [out, retval] VARIANT* __result); [id(30)] HRESULT CAddBrandContact([in] BSTR PublicId, [out, retval] int* __result); + [id(31)] HRESULT CHookVoiceMsg([in] BSTR savepath, [out, retval] int* __result); + [id(32)] HRESULT CUnHookVoiceMsg([out, retval] int* __result); + [id(33)] HRESULT CHookImageMsg([in] BSTR savepath, [out, retval] int* __result); + [id(34)] HRESULT CUnHookImageMsg([out, retval] int* __result); + [id(35)] HRESULT CChangeWeChatVer([in] BSTR verStr, [out, retval] int* __result); }; [ uuid(721abb35-141a-4aa2-94f2-762e2833fa6c), diff --git a/CWeChatRobot/WeChatRobotCOM.vcxproj b/CWeChatRobot/WeChatRobotCOM.vcxproj index b5147d5..b979bff 100644 --- a/CWeChatRobot/WeChatRobotCOM.vcxproj +++ b/CWeChatRobot/WeChatRobotCOM.vcxproj @@ -236,6 +236,7 @@ + @@ -248,6 +249,8 @@ + + Create @@ -282,6 +285,7 @@ + diff --git a/CWeChatRobot/WeChatRobotCOM.vcxproj.filters b/CWeChatRobot/WeChatRobotCOM.vcxproj.filters index e16145c..3d4162d 100644 --- a/CWeChatRobot/WeChatRobotCOM.vcxproj.filters +++ b/CWeChatRobot/WeChatRobotCOM.vcxproj.filters @@ -83,6 +83,9 @@ {cdd9e8b4-4576-499c-b20e-60e05911f6d6} + + {4214a216-3efc-48db-8fda-8a33066b2db2} + @@ -163,6 +166,9 @@ 好友相关\添加好友 + + 微信版本 + @@ -243,6 +249,15 @@ 好友相关\添加好友 + + 接收消息 + + + 接收消息 + + + 微信版本 + diff --git a/CWeChatRobot/WeChatRobotCOM_i.h b/CWeChatRobot/WeChatRobotCOM_i.h index bb0ccdf..ce40564 100644 --- a/CWeChatRobot/WeChatRobotCOM_i.h +++ b/CWeChatRobot/WeChatRobotCOM_i.h @@ -210,6 +210,24 @@ EXTERN_C const IID IID_IWeChatRobot; /* [in] */ BSTR PublicId, /* [retval][out] */ int *__result) = 0; + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CHookVoiceMsg( + /* [in] */ BSTR savepath, + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CUnHookVoiceMsg( + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CHookImageMsg( + /* [in] */ BSTR savepath, + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CUnHookImageMsg( + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CChangeWeChatVer( + /* [in] */ BSTR verStr, + /* [retval][out] */ int *__result) = 0; + }; @@ -420,6 +438,29 @@ EXTERN_C const IID IID_IWeChatRobot; /* [in] */ BSTR PublicId, /* [retval][out] */ int *__result); + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CHookVoiceMsg )( + IWeChatRobot * This, + /* [in] */ BSTR savepath, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CUnHookVoiceMsg )( + IWeChatRobot * This, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CHookImageMsg )( + IWeChatRobot * This, + /* [in] */ BSTR savepath, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CUnHookImageMsg )( + IWeChatRobot * This, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CChangeWeChatVer )( + IWeChatRobot * This, + /* [in] */ BSTR verStr, + /* [retval][out] */ int *__result); + END_INTERFACE } IWeChatRobotVtbl; @@ -546,6 +587,21 @@ EXTERN_C const IID IID_IWeChatRobot; #define IWeChatRobot_CAddBrandContact(This,PublicId,__result) \ ( (This)->lpVtbl -> CAddBrandContact(This,PublicId,__result) ) +#define IWeChatRobot_CHookVoiceMsg(This,savepath,__result) \ + ( (This)->lpVtbl -> CHookVoiceMsg(This,savepath,__result) ) + +#define IWeChatRobot_CUnHookVoiceMsg(This,__result) \ + ( (This)->lpVtbl -> CUnHookVoiceMsg(This,__result) ) + +#define IWeChatRobot_CHookImageMsg(This,savepath,__result) \ + ( (This)->lpVtbl -> CHookImageMsg(This,savepath,__result) ) + +#define IWeChatRobot_CUnHookImageMsg(This,__result) \ + ( (This)->lpVtbl -> CUnHookImageMsg(This,__result) ) + +#define IWeChatRobot_CChangeWeChatVer(This,verStr,__result) \ + ( (This)->lpVtbl -> CChangeWeChatVer(This,verStr,__result) ) + #endif /* COBJMACROS */ diff --git a/CWeChatRobot/WeChatRobotCOM_p.c b/CWeChatRobot/WeChatRobotCOM_p.c index ba6a5b5..e27f235 100644 --- a/CWeChatRobot/WeChatRobotCOM_p.c +++ b/CWeChatRobot/WeChatRobotCOM_p.c @@ -49,7 +49,7 @@ #include "WeChatRobotCOM_i.h" #define TYPE_FORMAT_STRING_SIZE 1239 -#define PROC_FORMAT_STRING_SIZE 1273 +#define PROC_FORMAT_STRING_SIZE 1471 #define EXPR_FORMAT_STRING_SIZE 1 #define TRANSMIT_AS_TABLE_SIZE 0 #define WIRE_MARSHAL_TABLE_SIZE 2 @@ -1221,6 +1221,179 @@ static const WeChatRobotCOM_MIDL_PROC_FORMAT_STRING WeChatRobotCOM__MIDL_ProcFor /* 1270 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ + /* Procedure CHookVoiceMsg */ + +/* 1272 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1274 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1278 */ NdrFcShort( 0x25 ), /* 37 */ +/* 1280 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ +/* 1282 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1284 */ NdrFcShort( 0x24 ), /* 36 */ +/* 1286 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1288 */ 0x8, /* 8 */ + 0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */ +/* 1290 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1292 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1294 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter savepath */ + +/* 1296 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1298 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 1300 */ NdrFcShort( 0x2a ), /* Type Offset=42 */ + + /* Parameter __result */ + +/* 1302 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1304 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 1306 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1308 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1310 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 1312 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CUnHookVoiceMsg */ + +/* 1314 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1316 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1320 */ NdrFcShort( 0x26 ), /* 38 */ +/* 1322 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 1324 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1326 */ NdrFcShort( 0x24 ), /* 36 */ +/* 1328 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1330 */ 0x8, /* 8 */ + 0x41, /* Ext Flags: new corr desc, has range on conformance */ +/* 1332 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1334 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1336 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter __result */ + +/* 1338 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1340 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 1342 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1344 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1346 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 1348 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CHookImageMsg */ + +/* 1350 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1352 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1356 */ NdrFcShort( 0x27 ), /* 39 */ +/* 1358 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ +/* 1360 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1362 */ NdrFcShort( 0x24 ), /* 36 */ +/* 1364 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1366 */ 0x8, /* 8 */ + 0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */ +/* 1368 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1370 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1372 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter savepath */ + +/* 1374 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1376 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 1378 */ NdrFcShort( 0x2a ), /* Type Offset=42 */ + + /* Parameter __result */ + +/* 1380 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1382 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 1384 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1386 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1388 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 1390 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CUnHookImageMsg */ + +/* 1392 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1394 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1398 */ NdrFcShort( 0x28 ), /* 40 */ +/* 1400 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 1402 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1404 */ NdrFcShort( 0x24 ), /* 36 */ +/* 1406 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 1408 */ 0x8, /* 8 */ + 0x41, /* Ext Flags: new corr desc, has range on conformance */ +/* 1410 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1412 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1414 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter __result */ + +/* 1416 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1418 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 1420 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1422 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1424 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 1426 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CChangeWeChatVer */ + +/* 1428 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 1430 */ NdrFcLong( 0x0 ), /* 0 */ +/* 1434 */ NdrFcShort( 0x29 ), /* 41 */ +/* 1436 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ +/* 1438 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1440 */ NdrFcShort( 0x24 ), /* 36 */ +/* 1442 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 1444 */ 0x8, /* 8 */ + 0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */ +/* 1446 */ NdrFcShort( 0x0 ), /* 0 */ +/* 1448 */ NdrFcShort( 0x1 ), /* 1 */ +/* 1450 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter verStr */ + +/* 1452 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 1454 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 1456 */ NdrFcShort( 0x2a ), /* Type Offset=42 */ + + /* Parameter __result */ + +/* 1458 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 1460 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 1462 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 1464 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 1466 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 1468 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + 0x0 } }; @@ -2095,7 +2268,12 @@ static const unsigned short IWeChatRobot_FormatStringOffsetTable[] = 1116, 1152, 1188, - 1230 + 1230, + 1272, + 1314, + 1350, + 1392, + 1428 }; static const MIDL_STUBLESS_PROXY_INFO IWeChatRobot_ProxyInfo = @@ -2119,7 +2297,7 @@ static const MIDL_SERVER_INFO IWeChatRobot_ServerInfo = 0, 0, 0}; -CINTERFACE_PROXY_VTABLE(37) _IWeChatRobotProxyVtbl = +CINTERFACE_PROXY_VTABLE(42) _IWeChatRobotProxyVtbl = { &IWeChatRobot_ProxyInfo, &IID_IWeChatRobot, @@ -2159,7 +2337,12 @@ CINTERFACE_PROXY_VTABLE(37) _IWeChatRobotProxyVtbl = (void *) (INT_PTR) -1 /* IWeChatRobot::CGetWeChatVer */ , (void *) (INT_PTR) -1 /* IWeChatRobot::CStartWeChat */ , (void *) (INT_PTR) -1 /* IWeChatRobot::CSearchContactByNet */ , - (void *) (INT_PTR) -1 /* IWeChatRobot::CAddBrandContact */ + (void *) (INT_PTR) -1 /* IWeChatRobot::CAddBrandContact */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CHookVoiceMsg */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CUnHookVoiceMsg */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CHookImageMsg */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CUnHookImageMsg */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CChangeWeChatVer */ }; @@ -2198,6 +2381,11 @@ static const PRPC_STUB_FUNCTION IWeChatRobot_table[] = NdrStubCall2, NdrStubCall2, NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, NdrStubCall2 }; @@ -2205,7 +2393,7 @@ CInterfaceStubVtbl _IWeChatRobotStubVtbl = { &IID_IWeChatRobot, &IWeChatRobot_ServerInfo, - 37, + 42, &IWeChatRobot_table[-3], CStdStubBuffer_DELEGATING_METHODS }; diff --git a/CWeChatRobot/pch.cpp b/CWeChatRobot/pch.cpp index 1774ac1..4b59492 100644 --- a/CWeChatRobot/pch.cpp +++ b/CWeChatRobot/pch.cpp @@ -43,6 +43,13 @@ DWORD AddFriendByWxidRemoteOffset = 0x0; DWORD AddFriendByV3RemoteOffset = 0x0; DWORD AddBrandContactRemoteOffset = 0x0; +DWORD HookImageMsgRemoteOffset = 0x0; +DWORD UnHookImageMsgRemoteOffset = 0x0; +DWORD HookVoiceMsgRemoteOffset = 0x0; +DWORD UnHookVoiceMsgRemoteOffset = 0x0; + +DWORD ChangeWeChatVerRemoteOffset = 0x0; + wstring SelfInfoString = L""; HANDLE hProcess = NULL; @@ -173,6 +180,18 @@ BOOL GetProcOffset(wchar_t* workPath) { DWORD AddBrandContactRemoteAddr = (DWORD)GetProcAddress(hd, AddBrandContactRemote); AddBrandContactRemoteOffset = AddBrandContactRemoteAddr - WeChatBase; + DWORD HookImageMsgRemoteAddr = (DWORD)GetProcAddress(hd, HookImageMsgRemote); + HookImageMsgRemoteOffset = HookImageMsgRemoteAddr - WeChatBase; + DWORD UnHookImageMsgAddr = (DWORD)GetProcAddress(hd, UnHookImageMsgRemote); + UnHookImageMsgRemoteOffset = UnHookImageMsgAddr - WeChatBase; + DWORD HookVoiceMsgRemoteAddr = (DWORD)GetProcAddress(hd, HookVoiceMsgRemote); + HookVoiceMsgRemoteOffset = HookVoiceMsgRemoteAddr - WeChatBase; + DWORD UnHookVoiceMsgAddr = (DWORD)GetProcAddress(hd, UnHookVoiceMsgRemote); + UnHookVoiceMsgRemoteOffset = UnHookVoiceMsgAddr - WeChatBase; + + DWORD ChangeWeChatVerRemoteAddr = (DWORD)GetProcAddress(hd, ChangeWeChatVerRemote); + ChangeWeChatVerRemoteOffset = ChangeWeChatVerRemoteAddr - WeChatBase; + FreeLibrary(hd); delete[] dllpath; dllpath = NULL; diff --git a/CWeChatRobot/robotdata.h b/CWeChatRobot/robotdata.h index 90a6643..e70d0a4 100644 --- a/CWeChatRobot/robotdata.h +++ b/CWeChatRobot/robotdata.h @@ -17,6 +17,7 @@ #include "DbBackup.h" #include "VerifyFriendApply.h" #include "AddFriend.h" +#include "wechatver.h" extern HANDLE hProcess; extern DWORD SendImageOffset; @@ -60,6 +61,13 @@ extern DWORD AddFriendByWxidRemoteOffset; extern DWORD AddFriendByV3RemoteOffset; extern DWORD AddBrandContactRemoteOffset; +extern DWORD HookImageMsgRemoteOffset; +extern DWORD UnHookImageMsgRemoteOffset; +extern DWORD HookVoiceMsgRemoteOffset; +extern DWORD UnHookVoiceMsgRemoteOffset; + +extern DWORD ChangeWeChatVerRemoteOffset; + #define dllname L"DWeChatRobot.dll" @@ -101,4 +109,11 @@ extern DWORD AddBrandContactRemoteOffset; #define AddFriendByWxidRemote "AddFriendByWxidRemote" #define AddFriendByV3Remote "AddFriendByV3Remote" -#define AddBrandContactRemote "AddBrandContactRemote" \ No newline at end of file +#define AddBrandContactRemote "AddBrandContactRemote" + +#define HookImageMsgRemote "HookImageMsgRemote" +#define UnHookImageMsgRemote "UnHookImageMsg" +#define HookVoiceMsgRemote "HookVoiceMsgRemote" +#define UnHookVoiceMsgRemote "UnHookVoiceMsg" + +#define ChangeWeChatVerRemote "ChangeWeChatVerRemote" \ No newline at end of file diff --git a/CWeChatRobot/wechatver.cpp b/CWeChatRobot/wechatver.cpp new file mode 100644 index 0000000..8288a4a --- /dev/null +++ b/CWeChatRobot/wechatver.cpp @@ -0,0 +1,23 @@ +#include "pch.h" + +BOOL ChangeWeChatVer(wchar_t* verStr) { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD dwRet = 0x0; + LPVOID verStraddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE); + DWORD dwWriteSize = 0; + if (!verStraddr) + return 1; + WriteProcessMemory(hProcess, verStraddr, verStr, wcslen(verStr) * 2 + 2, &dwWriteSize); + DWORD ChangeWeChatVerRemoteAddr = WeChatRobotBase + ChangeWeChatVerRemoteOffset; + HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)ChangeWeChatVerRemoteAddr, verStraddr, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + GetExitCodeThread(hThread, &dwRet); + CloseHandle(hThread); + } + VirtualFreeEx(hProcess, verStraddr, 0, MEM_RELEASE); + return dwRet == 0; +} \ No newline at end of file diff --git a/CWeChatRobot/wechatver.h b/CWeChatRobot/wechatver.h new file mode 100644 index 0000000..b5e0894 --- /dev/null +++ b/CWeChatRobot/wechatver.h @@ -0,0 +1,3 @@ +#pragma once +#include +BOOL ChangeWeChatVer(wchar_t* verStr); \ No newline at end of file diff --git a/DWeChatRobot/DWeChatRobot.vcxproj b/DWeChatRobot/DWeChatRobot.vcxproj index 419fc6e..83be836 100644 --- a/DWeChatRobot/DWeChatRobot.vcxproj +++ b/DWeChatRobot/DWeChatRobot.vcxproj @@ -175,6 +175,7 @@ + @@ -187,6 +188,8 @@ + + Create Create @@ -205,6 +208,7 @@ + diff --git a/DWeChatRobot/DWeChatRobot.vcxproj.filters b/DWeChatRobot/DWeChatRobot.vcxproj.filters index 39fbcbe..45b3d80 100644 --- a/DWeChatRobot/DWeChatRobot.vcxproj.filters +++ b/DWeChatRobot/DWeChatRobot.vcxproj.filters @@ -82,6 +82,9 @@ {564cc9ef-a939-4bfd-a420-a08b3072d198} + + {820d8228-ee6c-43ad-87ec-4e349d7a549a} + @@ -147,6 +150,9 @@ 通用标头 + + 微信版本 + @@ -218,5 +224,14 @@ 好友相关\添加好友 + + 接收消息 + + + 接收消息 + + + 微信版本 + \ No newline at end of file diff --git a/DWeChatRobot/HookImageMessage.cpp b/DWeChatRobot/HookImageMessage.cpp new file mode 100644 index 0000000..71ce3e5 --- /dev/null +++ b/DWeChatRobot/HookImageMessage.cpp @@ -0,0 +1,98 @@ +#include "pch.h" + +#define HookImageMsgAddrOffset 0x61211FF6 - 0x60AE0000 +#define HookImageMsgNextCallOffset 0x61211430 - 0x60AE0000 + +BOOL ImageMsgHooked = false; +static DWORD WeChatWinBase = GetWeChatWinBase(); +static DWORD HookImageMsgAddr = WeChatWinBase + HookImageMsgAddrOffset; +static DWORD HookImageMsgNextCall = WeChatWinBase + HookImageMsgNextCallOffset; +static DWORD HookImageMsgJmpBackAddr = HookImageMsgAddr + 0x5; +static char ImageMsgOldAsm[5] = { 0 }; +static wstring savepath = L""; + +void SaveImageMsg(unsigned char* buffer, int length, DWORD msgHandle) { + int l_datpath = *(int*)(msgHandle + 0x4) + 1; + wchar_t* datpath = new wchar_t[l_datpath]; + memcpy(datpath, (void*)(*(DWORD*)msgHandle), l_datpath * 2); + wstring wdatpath(datpath); + delete[] datpath; + datpath = NULL; + if (wdatpath.find(L"_t.dat") != wstring::npos) { + return; + } + int pos_begin = wdatpath.find_last_of(L"\\") + 1; + int pos_end = wdatpath.find_last_of(L"."); + wstring filename = wdatpath.substr(pos_begin, pos_end - pos_begin); + + unsigned char magic_head[4] = { 0 }; + wchar_t postfix[5] = { 0 }; + memcpy(magic_head, buffer, 3); + if (magic_head[0] == 137 && magic_head[1] == 80 && magic_head[2] == 78) + { + lstrcpy(postfix,L".png"); + } + else if (magic_head[0] == 71 && magic_head[1] == 73 && magic_head[2] == 70) + { + lstrcpy(postfix, L".gif"); + } + else if (magic_head[0] == 255 && magic_head[1] == 216 && magic_head[2] == 255) + { + lstrcpy(postfix, L".jpg"); + } + else { + lstrcpy(postfix, L""); + } + wstring filepath = savepath + filename + postfix; + HANDLE hFile = CreateFile(filepath.c_str(), GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + return; + } + DWORD dwWrite = 0; + WriteFile(hFile, (LPCVOID)buffer, length, &dwWrite, 0); + CloseHandle(hFile); +} + +__declspec(naked) void dealImageMsg() { + __asm { + pushad; + pushfd; + push esi; + push dword ptr [ebp - 0x20]; + push edi; + call SaveImageMsg; + add esp, 0xC; + popfd; + popad; + call HookImageMsgNextCall; + jmp HookImageMsgJmpBackAddr; + } +} + +void __stdcall HookImageMsg() { + if (ImageMsgHooked) + return; + HookAnyAddress(HookImageMsgAddr, dealImageMsg, ImageMsgOldAsm); + ImageMsgHooked = true; +} + +void UnHookImageMsg() { + if (!ImageMsgHooked) + return; + UnHookAnyAddress(HookImageMsgAddr, ImageMsgOldAsm); + ImageMsgHooked = false; +} + +BOOL HookImageMsgRemote(LPVOID lpParameter) { + savepath = (wstring)(wchar_t*)lpParameter; + if (savepath.back() != '\\') { + savepath += L"\\"; + } + wstring createpath = savepath.substr(0, savepath.length() - 1); + if (!FindOrCreateDirectory(createpath.c_str())) { + return false; + } + HookImageMsg(); + return true; +} \ No newline at end of file diff --git a/DWeChatRobot/HookVoiceMessage.cpp b/DWeChatRobot/HookVoiceMessage.cpp new file mode 100644 index 0000000..54d665a --- /dev/null +++ b/DWeChatRobot/HookVoiceMessage.cpp @@ -0,0 +1,70 @@ +#include "pch.h" + +#define HookVoiceMsgAddrOffset 0x610528DA - 0x60AE0000 +#define HookVoiceMsgNextCallOffset 0x620F1040 - 0x60AE0000 + +BOOL VoiceMsgHooked = false; +static DWORD WeChatWinBase = GetWeChatWinBase(); +static DWORD HookVoiceMsgAddr = WeChatWinBase + HookVoiceMsgAddrOffset; +static DWORD HookVoiceMsgNextCall = WeChatWinBase + HookVoiceMsgNextCallOffset; +static DWORD HookVoiceMsgJmpBackAddr = HookVoiceMsgAddr + 0x5; +static char VoiceMsgOldAsm[5] = { 0 }; +static wstring savepath = L""; + +void SaveVoiceMsg(unsigned char* buffer, int length, DWORD msgHandle) { + time_t curtime = time(0); + wchar_t timestamp[32] = { 0 }; + _itow_s((int)curtime, timestamp, 10); + wstring filename = savepath + timestamp + L".amr"; + HANDLE hFile = CreateFile(filename.c_str(), GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) + { + return; + } + DWORD dwWrite = 0; + WriteFile(hFile, (LPCVOID)buffer, length, &dwWrite, 0); + CloseHandle(hFile); +} + +__declspec(naked) void dealVoiceMsg() { + __asm { + pushad; + pushfd; + push edi; + push esi; + push eax; + call SaveVoiceMsg; + add esp, 0xC; + popfd; + popad; + call HookVoiceMsgNextCall; + jmp HookVoiceMsgJmpBackAddr; + } +} + +void __stdcall HookVoiceMsg() { + if (VoiceMsgHooked) + return; + HookAnyAddress(HookVoiceMsgAddr, dealVoiceMsg, VoiceMsgOldAsm); + VoiceMsgHooked = true; +} + +void UnHookVoiceMsg() { + if (!VoiceMsgHooked) + return; + UnHookAnyAddress(HookVoiceMsgAddr, VoiceMsgOldAsm); + VoiceMsgHooked = false; +} + +BOOL HookVoiceMsgRemote(LPVOID lpParameter) { + savepath = (wstring)(wchar_t*)lpParameter; + if (savepath.back() != '\\') { + savepath += L"\\"; + } + wstring createpath = savepath.substr(0, savepath.length() - 1); + if (!FindOrCreateDirectory(createpath.c_str())) { + return false; + } + HookVoiceMsg(); + return true; +} \ No newline at end of file diff --git a/DWeChatRobot/ReceiveMessage.h b/DWeChatRobot/ReceiveMessage.h index 8d1ac39..f9a3aaa 100644 --- a/DWeChatRobot/ReceiveMessage.h +++ b/DWeChatRobot/ReceiveMessage.h @@ -4,4 +4,12 @@ extern "C" __declspec(dllexport) DWORD GetHeadMessage(); extern "C" __declspec(dllexport) VOID PopHeadMessage(); extern "C" __declspec(dllexport) VOID HookReceiveMessage(); -extern "C" __declspec(dllexport) VOID UnHookReceiveMessage(); \ No newline at end of file +extern "C" __declspec(dllexport) VOID UnHookReceiveMessage(); + +void __stdcall HookVoiceMsg(); +extern "C" __declspec(dllexport) void UnHookVoiceMsg(); +extern "C" __declspec(dllexport) BOOL HookVoiceMsgRemote(LPVOID lpParameter); + +void __stdcall HookImageMsg(); +extern "C" __declspec(dllexport) void UnHookImageMsg(); +extern "C" __declspec(dllexport) BOOL HookImageMsgRemote(LPVOID lpParameter); \ No newline at end of file diff --git a/DWeChatRobot/pch.cpp b/DWeChatRobot/pch.cpp index 65c05ed..41dd69c 100644 --- a/DWeChatRobot/pch.cpp +++ b/DWeChatRobot/pch.cpp @@ -29,6 +29,23 @@ DWORD GetWeChatWinBase() { return (DWORD)GetModuleHandleA("WeChatWin.dll"); } +BOOL FindOrCreateDirectory(const wchar_t* pszPath) +{ + WIN32_FIND_DATA fd; + HANDLE hFind = ::FindFirstFile(pszPath, &fd); + if (hFind != INVALID_HANDLE_VALUE) + { + FindClose(hFind); + return true; + } + + if (!::CreateDirectory(pszPath, NULL)) + { + return false; + } + return true; +} + /* * 将宽字节字符串转换成`std::string` */ @@ -116,6 +133,8 @@ void UnHookAll() { UnHookLogMsgInfo(); UnHookReceiveMessage(); StopSearchContactHook(); + UnHookVoiceMsg(); + UnHookImageMsg(); return; } @@ -206,45 +225,6 @@ BOOL ProcessIsWeChat() } } -DWORD GetWeChatVerInt() -{ - WCHAR VersionFilePath[MAX_PATH]; - BYTE WeChatVersion[4] = { 0 }; - if (GetModuleFileName((HMODULE)GetWeChatWinBase(), VersionFilePath, MAX_PATH) == 0) - { - return 0; - } - - VS_FIXEDFILEINFO* pVsInfo; - unsigned int iFileInfoSize = sizeof(VS_FIXEDFILEINFO); - int iVerInfoSize = GetFileVersionInfoSize(VersionFilePath, NULL); - if (iVerInfoSize != 0) { - char* pBuf = new char[iVerInfoSize]; - if (GetFileVersionInfo(VersionFilePath, 0, iVerInfoSize, pBuf)) { - if (VerQueryValue(pBuf, TEXT("\\"), (void**)&pVsInfo, &iFileInfoSize)) { - WeChatVersion[3] = (BYTE)(0x60 + (pVsInfo->dwFileVersionMS >> 16) & 0x0000FFFF); - WeChatVersion[2] = (BYTE)(pVsInfo->dwFileVersionMS & 0x0000FFFF); - WeChatVersion[1] = (BYTE)((pVsInfo->dwFileVersionLS >> 16) & 0x0000FFFF); - WeChatVersion[0] = (BYTE)(pVsInfo->dwFileVersionLS & 0x0000FFFF); - } - } - delete[] pBuf; - } - return *(DWORD*)WeChatVersion; -} - -string GetWeChatVerStr() { - DWORD WeChatVersion = GetWeChatVerInt(); - if (WeChatVersion == 0) - return "null"; - string wxver = ""; - BYTE* pWxVer = (BYTE*)&WeChatVersion; - strstream wxVer; - wxVer << (int)pWxVer[3] - 0x60 << "." << (int)pWxVer[2] << "." << (int)pWxVer[1] << "." << (int)pWxVer[0]; - wxVer >> wxver; - return wxver; -} - DWORD OffsetFromIdaAddr(DWORD idaAddr) { return idaAddr - IDA_BASE; } \ No newline at end of file diff --git a/DWeChatRobot/pch.h b/DWeChatRobot/pch.h index acfceae..48de2cc 100644 --- a/DWeChatRobot/pch.h +++ b/DWeChatRobot/pch.h @@ -30,6 +30,7 @@ #include "VerifyFriendApply.h" #include "AddFriend.h" #include "sqlite3.h" +#include "wechatver.h" #include #include #endif //PCH_H @@ -89,5 +90,4 @@ wstring wreplace(wstring source, wchar_t replaced, wstring replaceto); void PrintProcAddr(); wchar_t* GetTimeW(); BOOL ProcessIsWeChat(); -DWORD GetWeChatVerInt(); -string GetWeChatVerStr(); \ No newline at end of file +BOOL FindOrCreateDirectory(const wchar_t* pszPath); \ No newline at end of file diff --git a/DWeChatRobot/wechatver.cpp b/DWeChatRobot/wechatver.cpp new file mode 100644 index 0000000..80486e8 --- /dev/null +++ b/DWeChatRobot/wechatver.cpp @@ -0,0 +1,78 @@ +#include "pch.h" + +#define WeChatVersionOffset 0x2382AF0 + +DWORD GetWeChatVerInt() +{ + WCHAR VersionFilePath[MAX_PATH]; + BYTE WeChatVersion[4] = { 0 }; + if (GetModuleFileName((HMODULE)GetWeChatWinBase(), VersionFilePath, MAX_PATH) == 0) + { + return 0; + } + + VS_FIXEDFILEINFO* pVsInfo; + unsigned int iFileInfoSize = sizeof(VS_FIXEDFILEINFO); + int iVerInfoSize = GetFileVersionInfoSize(VersionFilePath, NULL); + if (iVerInfoSize != 0) { + char* pBuf = new char[iVerInfoSize]; + if (GetFileVersionInfo(VersionFilePath, 0, iVerInfoSize, pBuf)) { + if (VerQueryValue(pBuf, TEXT("\\"), (void**)&pVsInfo, &iFileInfoSize)) { + WeChatVersion[3] = (BYTE)(0x60 + (pVsInfo->dwFileVersionMS >> 16) & 0x0000FFFF); + WeChatVersion[2] = (BYTE)(pVsInfo->dwFileVersionMS & 0x0000FFFF); + WeChatVersion[1] = (BYTE)((pVsInfo->dwFileVersionLS >> 16) & 0x0000FFFF); + WeChatVersion[0] = (BYTE)(pVsInfo->dwFileVersionLS & 0x0000FFFF); + } + } + delete[] pBuf; + } + return *(DWORD*)WeChatVersion; +} + +string GetWeChatVerStr() { + DWORD WeChatVersion = GetWeChatVerInt(); + if (WeChatVersion == 0) + return "null"; + string wxver = ""; + BYTE* pWxVer = (BYTE*)&WeChatVersion; + strstream wxVer; + wxVer << (int)pWxVer[3] - 0x60 << "." << (int)pWxVer[2] << "." << (int)pWxVer[1] << "." << (int)pWxVer[0]; + wxVer >> wxver; + return wxver; +} + +vector split(const wstring& str, const wstring& delim) { + vector res; + if (L"" == str) + return res; + wchar_t* strs = new wchar_t[str.length() + 1]; + lstrcpy(strs, str.c_str()); + wchar_t* buffer = NULL; + wchar_t* d = new wchar_t[delim.length() + 1]; + lstrcpy(d, delim.c_str()); + wchar_t* p = wcstok_s(strs, d, &buffer); + while (p) { + wstring s = p; + res.push_back(s); + p = wcstok_s(NULL, d, &buffer); + } + delete[] strs; + delete[] d; + return res; +} + +BOOL ChangeWeChatVerRemote(wchar_t* verStr) { + wstring wverStr(verStr); + vector v_split = split(wverStr, L"."); + BYTE bVer[4] = { 0 }; + bVer[3] = (BYTE)0x60; + for (unsigned int i = 0; i < v_split.size(); i++) { + bVer[3 - i] += (BYTE)_wtoi(v_split[i].c_str()); + } + DWORD version = *(DWORD*)bVer; + if (version < 0x60000000) + return false; + DWORD WeChatVersionAddr = GetWeChatWinBase() + WeChatVersionOffset; + *(DWORD*)WeChatVersionAddr = version; + return true; +} \ No newline at end of file diff --git a/DWeChatRobot/wechatver.h b/DWeChatRobot/wechatver.h new file mode 100644 index 0000000..5bf62c5 --- /dev/null +++ b/DWeChatRobot/wechatver.h @@ -0,0 +1,7 @@ +#pragma once +#include +#include +using namespace std; +DWORD GetWeChatVerInt(); +string GetWeChatVerStr(); +extern "C" __declspec(dllexport) BOOL ChangeWeChatVerRemote(wchar_t* verStr); \ No newline at end of file diff --git a/Python/test.py b/Python/test.py index 6110fb0..9476379 100644 --- a/Python/test.py +++ b/Python/test.py @@ -102,5 +102,6 @@ def test_BackupDb(): if __name__ == '__main__': wx = WeChatRobot() + print([i for i in dir(wx.robot) if '_' not in i and i[0] == 'C']) print(wx.GetWeChatVer()) wx.StopService() \ No newline at end of file diff --git a/Python/wxRobot.py b/Python/wxRobot.py index 2ce1cf6..e75deb2 100644 --- a/Python/wxRobot.py +++ b/Python/wxRobot.py @@ -268,4 +268,22 @@ class WeChatRobot(): return userinfo def AddBrandContact(self,PublicId): - return self.robot.CAddBrandContact(PublicId) \ No newline at end of file + return self.robot.CAddBrandContact(PublicId) + + def ChangeWeChatVer(self,version:str): + """ + version: like `3.7.0.26` + """ + return self.robot.CChangeWeChatVer(version) + + def HookImageMsg(self,savepath): + return self.robot.CHookImageMsg(savepath) + + def UnHookImageMsg(self): + return self.robot.CUnHookImageMsg() + + def HookVoiceMsg(self,savepath): + return self.robot.CHookVoiceMsg(savepath) + + def UnHookVoiceMsg(self): + return self.robot.CUnHookVoiceMsg() \ No newline at end of file diff --git a/README.md b/README.md index 55d2c18..d13bf31 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,7 @@ PC微信机器人,实现以下功能: 微信电脑版**3.6.0.18** 微信电脑版**3.7.0.26** 主分支对应微信3.7.0.26版本,其他版本请查看对应分支。 - -## 祝大家端午安康 -今天微信更新了3.7.0.29,人已经麻了,新加的添加好友功能甚至还没做COM接口。看来更新太快也不行。 -有想继续使用3.7.0.26的,可以去找一下原来的安装包,然后修改hosts文件禁用自动更新即可。 -过段时间再适配3.7.0.29吧,以上~ + # 编译环境 **Visual Studio 2019**(平台配置:win32(x86)) # 原理 @@ -53,13 +49,8 @@ CWeChatRobot.exe /unregserver 参考[Program.cs](/wxRobot/Program.cs) # 更多功能 后续计划功能: -1. HOOK未加密图片数据 -2. HOOK语音消息(SILK_V3格式) -3. 自定义微信版本号(无法屏蔽微信启动时的检查更新,启动后可以) -4. 手机号、微信号查询信息及加好友 -5. 好友相关操作,删除好友、修改备注等 -6. 群相关操作,拉群、踢人、退群等 -7. 数据库xml消息主体解压缩 +1. 好友相关操作,删除好友、修改备注等 +2. 分享小程序接口 有空的时候会按照上述顺序进行开发,不过嘛,计划只是计划,如果未实现也请见谅 **也欢迎您提交PR** @@ -94,6 +85,9 @@ CWeChatRobot.exe /unregserver ## 2022.06.07 1. 添加获取当前微信版本(读注册表)和启动微信的接口 2. 优化数据库查询接口,现在可以正常查询BLOB类型 +## 2022.06.10 +1. 新增关注公众号、网络查询用户信息、Hook语音、未加密图片、自定义微信版本号接口 +2. Hook语音和图片的接口暂时还有瑕疵,图片收到后有可能不会自动下载;语音消息的文件名暂时是时间戳,计划替换为该条消息id。有空再做优化。 # 打赏作者 请给作者一个star,感谢感谢 # 免责声明 diff --git a/Release/CWeChatRobot.exe b/Release/CWeChatRobot.exe index e6d54ef3b588db8e696770b22545bae0b7138638..986a7e8353e149ff8467cea8bd9c425ca66f68ed 100644 GIT binary patch delta 41195 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 AXaE2J delta 39687 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 diff --git a/Release/DWeChatRobot.dll b/Release/DWeChatRobot.dll index ead797405aa3b5b239b66c76659d4efe6ea15b26..cb4657b6aaec83d5095a1a03f3a80cbd2f5800d7 100644 GIT binary patch delta 28411 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 -- GitLab