From 14edb762023ea8ab3e507d25dddec7cc7e6d8aa4 Mon Sep 17 00:00:00 2001 From: ljc545w Date: Wed, 23 Mar 2022 19:21:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A3=80=E6=B5=8B=E5=A5=BD?= =?UTF-8?q?=E5=8F=8B=E7=8A=B6=E6=80=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CWeChatRobot/CheckFriendStatus.cpp | 53 +++++++ CWeChatRobot/CheckFriendStatus.h | 5 + CWeChatRobot/WeChatRobot.cpp | 27 +++- CWeChatRobot/WeChatRobot.h | 3 + CWeChatRobot/WeChatRobotCOM.idl | 3 + CWeChatRobot/WeChatRobotCOM.vcxproj | 2 + CWeChatRobot/WeChatRobotCOM.vcxproj.filters | 9 ++ CWeChatRobot/WeChatRobotCOM_i.h | 32 +++++ CWeChatRobot/WeChatRobotCOM_p.c | 118 +++++++++++++++- CWeChatRobot/pch.cpp | 13 ++ CWeChatRobot/robotdata.h | 12 +- DWeChatRobot/CheckFriendStatus.cpp | 149 ++++++++++++++++++++ DWeChatRobot/CheckFriendStatus.h | 8 ++ DWeChatRobot/DWeChatRobot.vcxproj | 2 + DWeChatRobot/DWeChatRobot.vcxproj.filters | 9 ++ DWeChatRobot/dllmain.cpp | 3 +- DWeChatRobot/pch.h | 1 + Release/CWeChatRobot.exe | Bin 65536 -> 66560 bytes Release/DWeChatRobot.dll | Bin 27136 -> 28672 bytes wxRobot.py | 53 ++++++- 20 files changed, 488 insertions(+), 14 deletions(-) create mode 100644 CWeChatRobot/CheckFriendStatus.cpp create mode 100644 CWeChatRobot/CheckFriendStatus.h create mode 100644 DWeChatRobot/CheckFriendStatus.cpp create mode 100644 DWeChatRobot/CheckFriendStatus.h diff --git a/CWeChatRobot/CheckFriendStatus.cpp b/CWeChatRobot/CheckFriendStatus.cpp new file mode 100644 index 0000000..2f7f8b5 --- /dev/null +++ b/CWeChatRobot/CheckFriendStatus.cpp @@ -0,0 +1,53 @@ +#include "pch.h" + +BOOL CheckFriendStatusInit() { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD CheckFriendStatusInitRemoteAddr = WeChatRobotBase + CheckFriendStatusInitRemoteOffset; + HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)CheckFriendStatusInitRemoteAddr, NULL, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } + return 0; +} + +BOOL CheckFriendStatusFinish() { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD CheckFriendStatusFinishRemoteAddr = WeChatRobotBase + CheckFriendStatusFinishRemoteOffset; + HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)CheckFriendStatusFinishRemoteAddr, NULL, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + CloseHandle(hThread); + } + return 0; +} + +DWORD CheckFriendStatus(wchar_t* wxid) { + if (!hProcess) + return 1; + DWORD WeChatRobotBase = GetWeChatRobotBase(); + DWORD dwId = 0; + DWORD dwWriteSize = 0; + DWORD dwStatus = 0; + + LPVOID wxidaddr = VirtualAllocEx(hProcess, NULL, 1, MEM_COMMIT, PAGE_READWRITE); + if (!wxidaddr) + return 1; + WriteProcessMemory(hProcess, wxidaddr, wxid, wcslen(wxid) * 2 + 2, &dwWriteSize); + DWORD CheckFriendStatusRemoteAddr = WeChatRobotBase + CheckFriendStatusRemoteOffset; + HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)CheckFriendStatusRemoteAddr, (LPVOID)wxidaddr, 0, &dwId); + if (hThread) { + WaitForSingleObject(hThread, INFINITE); + GetExitCodeThread(hThread, &dwStatus); + CloseHandle(hThread); + } + + VirtualFreeEx(hProcess, wxidaddr, 0, MEM_RELEASE); + return dwStatus; +} \ No newline at end of file diff --git a/CWeChatRobot/CheckFriendStatus.h b/CWeChatRobot/CheckFriendStatus.h new file mode 100644 index 0000000..692a897 --- /dev/null +++ b/CWeChatRobot/CheckFriendStatus.h @@ -0,0 +1,5 @@ +#pragma once +#include +BOOL CheckFriendStatusInit(); +DWORD CheckFriendStatus(wchar_t* wxid); +BOOL CheckFriendStatusFinish(); \ No newline at end of file diff --git a/CWeChatRobot/WeChatRobot.cpp b/CWeChatRobot/WeChatRobot.cpp index 0ff4bf8..a76b929 100644 --- a/CWeChatRobot/WeChatRobot.cpp +++ b/CWeChatRobot/WeChatRobot.cpp @@ -6,7 +6,7 @@ // CWeChatRobot /* -* 参数1:`MyWeChatRobot.dll`所在目录 +* 参数1:`DWeChatRobot.dll`所在目录 * 参数2:预返回的值,调用时无需提供 */ STDMETHODIMP CWeChatRobot::CStartRobotService(BSTR workPath, int* __result) { @@ -101,4 +101,29 @@ STDMETHODIMP CWeChatRobot::CGetSelfInfo(BSTR* __result) { string smessage = _com_util::ConvertBSTRToString((BSTR)(GetSelfInfo().c_str())); *__result = _com_util::ConvertStringToBSTR(smessage.c_str()); return S_OK; +} + +/* +* 参数1:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CCheckFriendStatusInit(int* __result) { + *__result = CheckFriendStatusInit(); + return S_OK; +} + +/* +* 参数1:查询的wxid +* 参数2:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CCheckFriendStatus(BSTR wxid,int* __result) { + *__result = CheckFriendStatus((wchar_t*)wxid); + return S_OK; +} + +/* +* 参数1:预返回的值,调用时无需提供 +*/ +STDMETHODIMP CWeChatRobot::CCheckFriendStatusFinish(int* __result) { + *__result = CheckFriendStatusFinish(); + return S_OK; } \ No newline at end of file diff --git a/CWeChatRobot/WeChatRobot.h b/CWeChatRobot/WeChatRobot.h index 13a3f37..45fe1bb 100644 --- a/CWeChatRobot/WeChatRobot.h +++ b/CWeChatRobot/WeChatRobot.h @@ -61,6 +61,9 @@ public: STDMETHODIMP CGetFriendList(BSTR* __result); STDMETHODIMP CGetWxUserInfo(BSTR wxid, BSTR* __result); STDMETHODIMP CGetSelfInfo(BSTR* __result); + STDMETHODIMP CCheckFriendStatusInit(int* __result); + STDMETHODIMP CCheckFriendStatus(BSTR wxid, int* __result); + STDMETHODIMP CCheckFriendStatusFinish(int* __result); }; OBJECT_ENTRY_AUTO(__uuidof(WeChatRobot), CWeChatRobot) diff --git a/CWeChatRobot/WeChatRobotCOM.idl b/CWeChatRobot/WeChatRobotCOM.idl index bc58389..52d0954 100644 --- a/CWeChatRobot/WeChatRobotCOM.idl +++ b/CWeChatRobot/WeChatRobotCOM.idl @@ -26,6 +26,9 @@ interface IWeChatRobot : IDispatch [id(8)] HRESULT CGetFriendList([out, retval] BSTR* __result); [id(9)] HRESULT CGetWxUserInfo([in] BSTR wxid, [out, retval] BSTR* __result); [id(10)] HRESULT CGetSelfInfo([out, retval] BSTR* __result); + [id(11)] HRESULT CCheckFriendStatusInit([out, retval] int* __result); + [id(12)] HRESULT CCheckFriendStatus([in] BSTR wxid, [out, retval] int* __result); + [id(13)] HRESULT CCheckFriendStatusFinish([out, retval] int* __result); }; [ uuid(721abb35-141a-4aa2-94f2-762e2833fa6c), diff --git a/CWeChatRobot/WeChatRobotCOM.vcxproj b/CWeChatRobot/WeChatRobotCOM.vcxproj index 211ad06..204de8c 100644 --- a/CWeChatRobot/WeChatRobotCOM.vcxproj +++ b/CWeChatRobot/WeChatRobotCOM.vcxproj @@ -211,6 +211,7 @@ + @@ -230,6 +231,7 @@ + diff --git a/CWeChatRobot/WeChatRobotCOM.vcxproj.filters b/CWeChatRobot/WeChatRobotCOM.vcxproj.filters index 019a99f..c2fd2b3 100644 --- a/CWeChatRobot/WeChatRobotCOM.vcxproj.filters +++ b/CWeChatRobot/WeChatRobotCOM.vcxproj.filters @@ -50,6 +50,9 @@ {9d9c2a95-9243-4809-884b-70d6d87a7128} + + {2543fa88-031d-42ca-9dd1-ac564ee2f744} + @@ -103,6 +106,9 @@ 发送消息\发送名片 + + 好友相关\好友状态 + @@ -147,6 +153,9 @@ 发送消息\发送名片 + + 好友相关\好友状态 + diff --git a/CWeChatRobot/WeChatRobotCOM_i.h b/CWeChatRobot/WeChatRobotCOM_i.h index f628aef..808fc0b 100644 --- a/CWeChatRobot/WeChatRobotCOM_i.h +++ b/CWeChatRobot/WeChatRobotCOM_i.h @@ -133,6 +133,16 @@ EXTERN_C const IID IID_IWeChatRobot; virtual /* [id] */ HRESULT STDMETHODCALLTYPE CGetSelfInfo( /* [retval][out] */ BSTR *__result) = 0; + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CCheckFriendStatusInit( + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CCheckFriendStatus( + /* [in] */ BSTR wxid, + /* [retval][out] */ int *__result) = 0; + + virtual /* [id] */ HRESULT STDMETHODCALLTYPE CCheckFriendStatusFinish( + /* [retval][out] */ int *__result) = 0; + }; @@ -246,6 +256,19 @@ EXTERN_C const IID IID_IWeChatRobot; IWeChatRobot * This, /* [retval][out] */ BSTR *__result); + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CCheckFriendStatusInit )( + IWeChatRobot * This, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CCheckFriendStatus )( + IWeChatRobot * This, + /* [in] */ BSTR wxid, + /* [retval][out] */ int *__result); + + /* [id] */ HRESULT ( STDMETHODCALLTYPE *CCheckFriendStatusFinish )( + IWeChatRobot * This, + /* [retval][out] */ int *__result); + END_INTERFACE } IWeChatRobotVtbl; @@ -312,6 +335,15 @@ EXTERN_C const IID IID_IWeChatRobot; #define IWeChatRobot_CGetSelfInfo(This,__result) \ ( (This)->lpVtbl -> CGetSelfInfo(This,__result) ) +#define IWeChatRobot_CCheckFriendStatusInit(This,__result) \ + ( (This)->lpVtbl -> CCheckFriendStatusInit(This,__result) ) + +#define IWeChatRobot_CCheckFriendStatus(This,wxid,__result) \ + ( (This)->lpVtbl -> CCheckFriendStatus(This,wxid,__result) ) + +#define IWeChatRobot_CCheckFriendStatusFinish(This,__result) \ + ( (This)->lpVtbl -> CCheckFriendStatusFinish(This,__result) ) + #endif /* COBJMACROS */ diff --git a/CWeChatRobot/WeChatRobotCOM_p.c b/CWeChatRobot/WeChatRobotCOM_p.c index 5d05562..aca66de 100644 --- a/CWeChatRobot/WeChatRobotCOM_p.c +++ b/CWeChatRobot/WeChatRobotCOM_p.c @@ -49,7 +49,7 @@ #include "WeChatRobotCOM_i.h" #define TYPE_FORMAT_STRING_SIZE 71 -#define PROC_FORMAT_STRING_SIZE 451 +#define PROC_FORMAT_STRING_SIZE 565 #define EXPR_FORMAT_STRING_SIZE 1 #define TRANSMIT_AS_TABLE_SIZE 0 #define WIRE_MARSHAL_TABLE_SIZE 1 @@ -504,6 +504,105 @@ static const WeChatRobotCOM_MIDL_PROC_FORMAT_STRING WeChatRobotCOM__MIDL_ProcFor /* 448 */ 0x8, /* FC_LONG */ 0x0, /* 0 */ + /* Procedure CCheckFriendStatusInit */ + +/* 450 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 452 */ NdrFcLong( 0x0 ), /* 0 */ +/* 456 */ NdrFcShort( 0x11 ), /* 17 */ +/* 458 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 460 */ NdrFcShort( 0x0 ), /* 0 */ +/* 462 */ NdrFcShort( 0x24 ), /* 36 */ +/* 464 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 466 */ 0x8, /* 8 */ + 0x41, /* Ext Flags: new corr desc, has range on conformance */ +/* 468 */ NdrFcShort( 0x0 ), /* 0 */ +/* 470 */ NdrFcShort( 0x0 ), /* 0 */ +/* 472 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter __result */ + +/* 474 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 476 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 478 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 480 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 482 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 484 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CCheckFriendStatus */ + +/* 486 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 488 */ NdrFcLong( 0x0 ), /* 0 */ +/* 492 */ NdrFcShort( 0x12 ), /* 18 */ +/* 494 */ NdrFcShort( 0x10 ), /* x86 Stack size/offset = 16 */ +/* 496 */ NdrFcShort( 0x0 ), /* 0 */ +/* 498 */ NdrFcShort( 0x24 ), /* 36 */ +/* 500 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */ + 0x3, /* 3 */ +/* 502 */ 0x8, /* 8 */ + 0x45, /* Ext Flags: new corr desc, srv corr check, has range on conformance */ +/* 504 */ NdrFcShort( 0x0 ), /* 0 */ +/* 506 */ NdrFcShort( 0x1 ), /* 1 */ +/* 508 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter wxid */ + +/* 510 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */ +/* 512 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 514 */ NdrFcShort( 0x26 ), /* Type Offset=38 */ + + /* Parameter __result */ + +/* 516 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 518 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 520 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 522 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 524 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 526 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Procedure CCheckFriendStatusFinish */ + +/* 528 */ 0x33, /* FC_AUTO_HANDLE */ + 0x6c, /* Old Flags: object, Oi2 */ +/* 530 */ NdrFcLong( 0x0 ), /* 0 */ +/* 534 */ NdrFcShort( 0x13 ), /* 19 */ +/* 536 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */ +/* 538 */ NdrFcShort( 0x0 ), /* 0 */ +/* 540 */ NdrFcShort( 0x24 ), /* 36 */ +/* 542 */ 0x44, /* Oi2 Flags: has return, has ext, */ + 0x2, /* 2 */ +/* 544 */ 0x8, /* 8 */ + 0x41, /* Ext Flags: new corr desc, has range on conformance */ +/* 546 */ NdrFcShort( 0x0 ), /* 0 */ +/* 548 */ NdrFcShort( 0x0 ), /* 0 */ +/* 550 */ NdrFcShort( 0x0 ), /* 0 */ + + /* Parameter __result */ + +/* 552 */ NdrFcShort( 0x2150 ), /* Flags: out, base type, simple ref, srv alloc size=8 */ +/* 554 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */ +/* 556 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + + /* Return value */ + +/* 558 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */ +/* 560 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */ +/* 562 */ 0x8, /* FC_LONG */ + 0x0, /* 0 */ + 0x0 } }; @@ -607,7 +706,10 @@ static const unsigned short IWeChatRobot_FormatStringOffsetTable[] = 282, 336, 372, - 414 + 414, + 450, + 486, + 528 }; static const MIDL_STUBLESS_PROXY_INFO IWeChatRobot_ProxyInfo = @@ -631,7 +733,7 @@ static const MIDL_SERVER_INFO IWeChatRobot_ServerInfo = 0, 0, 0}; -CINTERFACE_PROXY_VTABLE(17) _IWeChatRobotProxyVtbl = +CINTERFACE_PROXY_VTABLE(20) _IWeChatRobotProxyVtbl = { &IWeChatRobot_ProxyInfo, &IID_IWeChatRobot, @@ -651,7 +753,10 @@ CINTERFACE_PROXY_VTABLE(17) _IWeChatRobotProxyVtbl = (void *) (INT_PTR) -1 /* IWeChatRobot::CSendCard */ , (void *) (INT_PTR) -1 /* IWeChatRobot::CGetFriendList */ , (void *) (INT_PTR) -1 /* IWeChatRobot::CGetWxUserInfo */ , - (void *) (INT_PTR) -1 /* IWeChatRobot::CGetSelfInfo */ + (void *) (INT_PTR) -1 /* IWeChatRobot::CGetSelfInfo */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CCheckFriendStatusInit */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CCheckFriendStatus */ , + (void *) (INT_PTR) -1 /* IWeChatRobot::CCheckFriendStatusFinish */ }; @@ -670,6 +775,9 @@ static const PRPC_STUB_FUNCTION IWeChatRobot_table[] = NdrStubCall2, NdrStubCall2, NdrStubCall2, + NdrStubCall2, + NdrStubCall2, + NdrStubCall2, NdrStubCall2 }; @@ -677,7 +785,7 @@ CInterfaceStubVtbl _IWeChatRobotStubVtbl = { &IID_IWeChatRobot, &IWeChatRobot_ServerInfo, - 17, + 20, &IWeChatRobot_table[-3], CStdStubBuffer_DELEGATING_METHODS }; diff --git a/CWeChatRobot/pch.cpp b/CWeChatRobot/pch.cpp index da45a2d..f4c8498 100644 --- a/CWeChatRobot/pch.cpp +++ b/CWeChatRobot/pch.cpp @@ -18,6 +18,11 @@ DWORD DeleteUserInfoCacheOffset = 0x0; DWORD GetSelfInfoOffset = 0x0; DWORD DeleteSelfInfoCacheOffset = 0x0; + +DWORD CheckFriendStatusInitRemoteOffset = 0x0; +DWORD CheckFriendStatusRemoteOffset = 0x0; +DWORD CheckFriendStatusFinishRemoteOffset = 0x0; + wstring SelfInfoString = L""; HANDLE hProcess = NULL; @@ -105,6 +110,13 @@ void GetProcOffset(wchar_t* workPath) { DWORD DeleteSelfInfoCacheProcAddr = (DWORD)GetProcAddress(hd, DeleteSelfInfoCacheRemote); DeleteSelfInfoCacheOffset = DeleteSelfInfoCacheProcAddr - WeChatBase; + DWORD CheckFriendStatusInitRemoteAddr = (DWORD)GetProcAddress(hd, CheckFriendStatusInitRemote); + CheckFriendStatusInitRemoteOffset = CheckFriendStatusInitRemoteAddr - WeChatBase; + DWORD CheckFriendStatusRemoteAddr = (DWORD)GetProcAddress(hd, CheckFriendStatusRemote); + CheckFriendStatusRemoteOffset = CheckFriendStatusRemoteAddr - WeChatBase; + DWORD CheckFriendStatusFinishRemoteAddr = (DWORD)GetProcAddress(hd, CheckFriendStatusFinishRemote); + CheckFriendStatusFinishRemoteOffset = CheckFriendStatusFinishRemoteAddr - WeChatBase; + FreeLibrary(hd); delete[] dllpath; dllpath = NULL; @@ -142,6 +154,7 @@ DWORD StopRobotService() { if (!hProcess) return 1; DWORD wxPid = GetWeChatPid(); + CheckFriendStatusFinish(); RemoveDll(wxPid); ZeroMemory((wchar_t*)SelfInfoString.c_str(), SelfInfoString.length() * 2 + 2); CloseHandle(hProcess); diff --git a/CWeChatRobot/robotdata.h b/CWeChatRobot/robotdata.h index de8791b..b539da3 100644 --- a/CWeChatRobot/robotdata.h +++ b/CWeChatRobot/robotdata.h @@ -8,6 +8,7 @@ #include "FriendList.h" #include "UserInfo.h" #include "SelfInfo.h" +#include "CheckFriendStatus.h" extern HANDLE hProcess; extern DWORD SendImageOffset; @@ -27,6 +28,11 @@ extern DWORD GetSelfInfoOffset; extern DWORD DeleteSelfInfoCacheOffset; extern wstring SelfInfoString; +extern DWORD CheckFriendStatusInitRemoteOffset; +extern DWORD CheckFriendStatusRemoteOffset; +extern DWORD CheckFriendStatusFinishRemoteOffset; + + #define dllname L"DWeChatRobot.dll" #define SendTextRemote "SendTextRemote" @@ -43,4 +49,8 @@ extern wstring SelfInfoString; #define DeleteUserInfoCacheRemote "DeleteUserInfoCacheRemote" #define GetSelfInfoRemote "GetSelfInfoRemote" -#define DeleteSelfInfoCacheRemote "DeleteSelfInfoCacheRemote" \ No newline at end of file +#define DeleteSelfInfoCacheRemote "DeleteSelfInfoCacheRemote" + +#define CheckFriendStatusInitRemote "CheckFriendStatusInitRemote" +#define CheckFriendStatusRemote "CheckFriendStatusRemote" +#define CheckFriendStatusFinishRemote "CheckFriendStatusFinishRemote" \ No newline at end of file diff --git a/DWeChatRobot/CheckFriendStatus.cpp b/DWeChatRobot/CheckFriendStatus.cpp new file mode 100644 index 0000000..08c7778 --- /dev/null +++ b/DWeChatRobot/CheckFriendStatus.cpp @@ -0,0 +1,149 @@ +#include "pch.h" + +#define CheckFriendStatusCall1Offset 0x78861210 - 0x787A0000 +#define CheckFriendStatusCall2Offset 0x03521CD0 - 0x02E20000 +#define CheckFriendStatusCall3Offset 0x03521DC0 - 0x02E20000 +#define CheckFriendStatusCall4Offset 0x0321FB90 - 0x02E20000 + +#define CheckFriendStatusParamOffset 0x0504F3BC - 0x02E20000 + +#define CheckFriendStatusHookOffset 0x5E0830B3 - 0x5DB60000 +#define CheckFriendStatusNextCallOffset 0x5E083150 - 0x5DB60000 +#define CheckFriendStatusHookJmpBackOffset 0x5E0830B8 - 0x5DB60000 + +DWORD CheckFriendStatusNextCallAddress = GetWeChatWinBase() + CheckFriendStatusNextCallOffset; +DWORD CheckFriendStatusHookJmpBackAddress = GetWeChatWinBase() + CheckFriendStatusHookJmpBackOffset; + +char OldAsmCode[5] = { 0 }; +BOOL CheckFriendStatusHooked = false; +BOOL LocalFriendStatus = 0x0; + +struct FriendStatusParamStruct { + DWORD fill0 = 0x0; + DWORD fill1 = 0x0; + DWORD fill2 = -0x1; + DWORD fill3 = 0x0; + DWORD fill4 = 0x0; + DWORD fill5 = 0xF; + char nullbuffer[0xC] = { 0 }; +}; + +void dealVerifyUserResult(DWORD result) { + if (result < 0xB0 || result > 0xB5) + return; + LocalFriendStatus = result; +} + +__declspec(naked) void doHookVerifyUserResult() { + __asm { + pushfd; + pushad; + mov eax, [esi]; + push eax; + call dealVerifyUserResult; + add esp, 0x4; + popad; + popfd; + call CheckFriendStatusNextCallAddress; + jmp CheckFriendStatusHookJmpBackAddress; + } +} + +VOID HookFriendStatusCode(){ + if (CheckFriendStatusHooked) + return; + DWORD WeChatWinBase = GetWeChatWinBase(); + DWORD dwHookAddress = WeChatWinBase + CheckFriendStatusHookOffset; + HookAnyAddress(dwHookAddress, doHookVerifyUserResult, OldAsmCode); + CheckFriendStatusHooked = true; +} + +VOID UnHookFriendStatusCode() { + if (!CheckFriendStatusHooked) + return; + DWORD WeChatWinBase = GetWeChatWinBase(); + DWORD dwHookAddress = WeChatWinBase + CheckFriendStatusHookOffset; + UnHookAnyAddress(dwHookAddress,OldAsmCode); + CheckFriendStatusHooked = false; +} + +VOID CheckFriendStatusInitRemote() { + HookFriendStatusCode(); +} + +DWORD CheckFriendStatusRemote(LPVOID lparameter) { + CheckFriendStatus((wchar_t*)lparameter); + return LocalFriendStatus; +} + +VOID CheckFriendStatusFinishRemote() { + UnHookFriendStatusCode(); +} + +VOID __stdcall CheckFriendStatus(wchar_t* wxid) { + LocalFriendStatus = 0x0; + DWORD WeChatWinBase = GetWeChatWinBase(); + DWORD CheckFriendStatusCall1 = WeChatWinBase + CheckFriendStatusCall1Offset; + DWORD CheckFriendStatusCall2 = WeChatWinBase + CheckFriendStatusCall2Offset; + DWORD CheckFriendStatusCall3 = WeChatWinBase + CheckFriendStatusCall3Offset; + DWORD CheckFriendStatusCall4 = WeChatWinBase + CheckFriendStatusCall4Offset; + DWORD CheckFriendStatusParam = WeChatWinBase + CheckFriendStatusParamOffset; + + WxBaseStruct pwxid(wxid); + FriendStatusParamStruct FriendStatusParam; + + char* swxid = new char[wcslen(wxid) + 1]; + ZeroMemory(swxid, wcslen(wxid) + 1); + WideCharToMultiByte(CP_ACP, 0, wxid, -1, swxid, wcslen(wxid), NULL, NULL); + pwxid.fill1 = (DWORD)swxid; + pwxid.fill2 = wcslen(wxid); + + wchar_t* message = (WCHAR*)L""; + + __asm { + pushad; + pushfd; + mov edi, 0x6; + mov esi, 0x0; + sub esp, 0x18; + mov eax, esp; + mov dword ptr[eax], 0x0; + mov dword ptr[eax + 0x14], 0xF; + mov dword ptr[eax + 0x10], 0x0; + sub esp, 0x18; + lea eax, FriendStatusParam; + mov ecx, esp; + push eax; + call CheckFriendStatusCall1; + push esi; + push edi; + mov edi, message; + sub esp, 0x14; + mov ecx, esp; + push -0x1; + mov eax, edi; + push eax; + call CheckFriendStatusCall2; + push 0x1; + lea eax, pwxid; + sub esp, 0x14; + mov ecx, esp; + push eax; + call CheckFriendStatusCall3; + mov eax, [CheckFriendStatusParam]; + mov eax, [eax]; + mov ecx, eax; + call CheckFriendStatusCall4; + popfd; + popad; + } + while (!LocalFriendStatus && CheckFriendStatusHooked) { + Sleep(10); + } +#ifdef _DEBUG + printf("wxid:%ws,status:0x%02X\n", wxid,LocalFriendStatus); +#endif + delete[] swxid; + swxid = NULL; + return; +} \ No newline at end of file diff --git a/DWeChatRobot/CheckFriendStatus.h b/DWeChatRobot/CheckFriendStatus.h new file mode 100644 index 0000000..aff0916 --- /dev/null +++ b/DWeChatRobot/CheckFriendStatus.h @@ -0,0 +1,8 @@ +#pragma once +#include + +extern "C" __declspec(dllexport) VOID CheckFriendStatusInitRemote(); +extern "C" __declspec(dllexport) DWORD CheckFriendStatusRemote(LPVOID lparameter); +extern "C" __declspec(dllexport) VOID CheckFriendStatusFinishRemote(); + +VOID __stdcall CheckFriendStatus(wchar_t* wxid); \ No newline at end of file diff --git a/DWeChatRobot/DWeChatRobot.vcxproj b/DWeChatRobot/DWeChatRobot.vcxproj index 8749926..3f0fdbf 100644 --- a/DWeChatRobot/DWeChatRobot.vcxproj +++ b/DWeChatRobot/DWeChatRobot.vcxproj @@ -154,6 +154,7 @@ + @@ -166,6 +167,7 @@ + diff --git a/DWeChatRobot/DWeChatRobot.vcxproj.filters b/DWeChatRobot/DWeChatRobot.vcxproj.filters index c9d0875..0c7daea 100644 --- a/DWeChatRobot/DWeChatRobot.vcxproj.filters +++ b/DWeChatRobot/DWeChatRobot.vcxproj.filters @@ -46,6 +46,9 @@ {fc747a68-6314-4f23-92de-a1e55275a01e} + + {5a6d7d8b-a126-4da1-b540-09c79886ffef} + @@ -78,6 +81,9 @@ 发送消息\发送名片 + + 好友相关\好友状态 + @@ -110,5 +116,8 @@ 发送消息\发送名片 + + 好友相关\好友状态 + \ No newline at end of file diff --git a/DWeChatRobot/dllmain.cpp b/DWeChatRobot/dllmain.cpp index 7c60eab..bb59639 100644 --- a/DWeChatRobot/dllmain.cpp +++ b/DWeChatRobot/dllmain.cpp @@ -25,6 +25,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, printf("GetUserInfoByWxId 0x%08X\n", (DWORD)GetUserInfoByWxId); printf("SendArticle 0x%08X\n", (DWORD)SendArticle); printf("SendCard 0x%08X\n", (DWORD)SendCard); + printf("CheckFriendStatus 0x%08X\n", (DWORD)CheckFriendStatus); #endif break; } @@ -34,7 +35,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, #ifdef _DEBUG detach_count++; if (detach_count != 1) { - // FreeConsole(); + FreeConsole(); // UnHookAll(); } #endif diff --git a/DWeChatRobot/pch.h b/DWeChatRobot/pch.h index 5a42585..102887c 100644 --- a/DWeChatRobot/pch.h +++ b/DWeChatRobot/pch.h @@ -19,6 +19,7 @@ #include "UserInfo.h" #include "SelfInfo.h" #include "SendCard.h" +#include "CheckFriendStatus.h" #endif //PCH_H using namespace std; diff --git a/Release/CWeChatRobot.exe b/Release/CWeChatRobot.exe index 2ac25bd42b00d0db68bdf14cab3ac36444b819ce..8ce4da7d29e6fe82846d240337020b1e01ba3ee2 100644 GIT binary patch delta 27999 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 E0+&Ia(EtDd delta 26944 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 diff --git a/Release/DWeChatRobot.dll b/Release/DWeChatRobot.dll index ed404b4b5ba51194bf0815f16d81354d152e9860..c16fb47ddf43075f55f1e3964b988f9f9530c217 100644 GIT binary patch delta 10637 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 delta 9332 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