From 3fd3e589e7a72591010cdd3db4863685513287ec Mon Sep 17 00:00:00 2001 From: Changhua Date: Sun, 21 Aug 2022 08:45:16 +0800 Subject: [PATCH] Impl accept new friend application --- Rpc/rpc.idl | 3 ++- SDK/rpc_client.cpp | 16 +++++++++++ SDK/rpc_client.h | 1 + SDK/sdk.cpp | 2 ++ SDK/sdk.def | 3 ++- SDK/sdk.h | 2 ++ SDKpy/sdkpy.cpp | 5 ++-- Spy/Spy.vcxproj | 2 ++ Spy/Spy.vcxproj.filters | 6 +++++ Spy/accept_new_friend.cpp | 57 +++++++++++++++++++++++++++++++++++++++ Spy/accept_new_friend.h | 6 +++++ Spy/load_calls.cpp | 29 +++++++++++--------- Spy/rpc_server.cpp | 3 +++ Spy/spy_types.h | 8 ++++++ 14 files changed, 126 insertions(+), 17 deletions(-) create mode 100644 Spy/accept_new_friend.cpp create mode 100644 Spy/accept_new_friend.h diff --git a/Rpc/rpc.idl b/Rpc/rpc.idl index f7e77f0..8da455e 100644 --- a/Rpc/rpc.idl +++ b/Rpc/rpc.idl @@ -65,7 +65,8 @@ interface ISpy int GetDbTables([ in, string ] const wchar_t *db, [out] int *pNum, [ out, size_is(, *pNum) ] PPRpcTables *tbls); int ExecDbQuery([ in, string ] const wchar_t *db, [ in, string ] const wchar_t *sql, [out] int *pRow, [out] int *pCol, - [ out, size_is(, *pRow, *pCol) ] PPPRpcSqlResult *ret); + [ out, size_is(, *pRow, *pCol) ] PPPRpcSqlResult *ret); + BOOL AcceptNewFriend([in, string] const wchar_t *v3, [in, string] const wchar_t *v4); void EnableReceiveMsg(); void DisableReceiveMsg(); diff --git a/SDK/rpc_client.cpp b/SDK/rpc_client.cpp index eb802ff..d5aff96 100644 --- a/SDK/rpc_client.cpp +++ b/SDK/rpc_client.cpp @@ -233,6 +233,22 @@ PPPRpcSqlResult RpcExecDbQuery(const wchar_t *db, const wchar_t *sql, int *pRow, return pppRpcSqlResult; } +BOOL AcceptNewFriend(const wchar_t *v3, const wchar_t *v4) +{ + BOOL ret = 0; + unsigned long ulCode = 0; + + RpcTryExcept { ret = client_AcceptNewFriend(v3, v4); } + RpcExcept(1) + { + ulCode = RpcExceptionCode(); + printf("AcceptNewFriend exception 0x%lx = %ld\n", ulCode, ulCode); + } + RpcEndExcept; + + return ret; +} + int server_ReceiveMsg(RpcMessage_t rpcMsg) { WxMessage_t msg; diff --git a/SDK/rpc_client.h b/SDK/rpc_client.h index 1133dfe..af12f04 100644 --- a/SDK/rpc_client.h +++ b/SDK/rpc_client.h @@ -15,3 +15,4 @@ PPRpcContact RpcGetContacts(int *pNum); BSTR *RpcGetDbNames(int *pNum); PPRpcTables RpcGetDbTables(const wchar_t *db, int *pNum); PPPRpcSqlResult RpcExecDbQuery(const wchar_t *db, const wchar_t *sql, int *row, int *col); +BOOL AcceptNewFriend(const wchar_t *v3, const wchar_t *v4); diff --git a/SDK/sdk.cpp b/SDK/sdk.cpp index ef0c302..8dae896 100644 --- a/SDK/sdk.cpp +++ b/SDK/sdk.cpp @@ -262,3 +262,5 @@ SqlRetVector_t WxExecDbQuery(wstring db, wstring sql) return vvResults; } + +BOOL WxAcceptNewFriend(wstring v3, wstring v4) { return AcceptNewFriend(v3.c_str(), v4.c_str()); } diff --git a/SDK/sdk.def b/SDK/sdk.def index 7e215b2..dc1ba55 100644 --- a/SDK/sdk.def +++ b/SDK/sdk.def @@ -9,4 +9,5 @@ WxGetContacts WxGetDbNames WxGetDbTables - WxExecDbQuery + WxExecDbQuery + WxAcceptNewFriend diff --git a/SDK/sdk.h b/SDK/sdk.h index deb3981..a8d0e02 100644 --- a/SDK/sdk.h +++ b/SDK/sdk.h @@ -1,5 +1,6 @@ #pragma once +#include "framework.h" #include #include #include @@ -55,3 +56,4 @@ MsgTypesMap_t WxGetMsgTypes(); vector WxGetDbNames(); DbTableVector_t WxGetDbTables(wstring db); SqlRetVector_t WxExecDbQuery(wstring db, wstring sql); +BOOL WxAcceptNewFriend(wstring v3, wstring v4); diff --git a/SDKpy/sdkpy.cpp b/SDKpy/sdkpy.cpp index a7081ec..a8daffb 100644 --- a/SDKpy/sdkpy.cpp +++ b/SDKpy/sdkpy.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include @@ -80,7 +80,8 @@ PYBIND11_MODULE(wcferry, m) m.def("WxGetDbNames", &WxGetDbNames, py::return_value_policy::reference, "Get DB names."); m.def("WxGetDbTables", &WxGetDbTables, py::return_value_policy::reference, "Get DB tables.", py::arg("db")); m.def("WxExecDbQuery", &WxExecDbQueryPy, py::return_value_policy::reference, "Get DB tables.", py::arg("db"), - py::arg("sql")); + py::arg("sql")); + m.def("WxAcceptNewFriend", &WxAcceptNewFriend, "Accept new friend application.", py::arg("v3"), py::arg("v4")); #ifdef VERSION_INFO m.attr("__version__") = VERSION_INFO; diff --git a/Spy/Spy.vcxproj b/Spy/Spy.vcxproj index d3c1c4d..3567e04 100644 --- a/Spy/Spy.vcxproj +++ b/Spy/Spy.vcxproj @@ -166,6 +166,7 @@ + @@ -180,6 +181,7 @@ + diff --git a/Spy/Spy.vcxproj.filters b/Spy/Spy.vcxproj.filters index f09b380..1772c6d 100644 --- a/Spy/Spy.vcxproj.filters +++ b/Spy/Spy.vcxproj.filters @@ -51,6 +51,9 @@ 头文件 + + 头文件 + @@ -86,6 +89,9 @@ 源文件 + + 源文件 + diff --git a/Spy/accept_new_friend.cpp b/Spy/accept_new_friend.cpp new file mode 100644 index 0000000..97de721 --- /dev/null +++ b/Spy/accept_new_friend.cpp @@ -0,0 +1,57 @@ +#include "accept_new_friend.h" +#include "load_calls.h" + +typedef struct NewFriendParam { + DWORD handle; + DWORD *status; + DWORD statusEnd1; + DWORD statusEnd2; + char buffer[0x3C]; +} NewFriendParam_t; + +extern WxCalls_t g_WxCalls; +extern DWORD g_WeChatWinDllAddr; + +BOOL AcceptNewFriend(std::wstring v3, std::wstring v4) +{ + BOOL isSucceeded = false; + + DWORD acceptNewFriendCall1 = g_WeChatWinDllAddr + g_WxCalls.anf.call1; + DWORD acceptNewFriendCall2 = g_WeChatWinDllAddr + g_WxCalls.anf.call2; + DWORD acceptNewFriendHandle = g_WeChatWinDllAddr + g_WxCalls.anf.handle; + + char buffer[0x94] = { 0 }; + NewFriendParam_t param = { 0 }; + DWORD status[9] = { 0xB2, (DWORD)¶m, 0xB5, (DWORD)¶m, 0xB0, (DWORD)¶m, 0xB1, (DWORD)¶m, 0x00 }; + + param.handle = acceptNewFriendHandle; + param.status = status; + param.statusEnd1 = (DWORD)&status[8]; + param.statusEnd2 = (DWORD)&status[8]; + NewFriendParam_t *pParam = ¶m; + + __asm { + pushad; + pushfd; + push 0x0; + push 0x6; + sub esp, 0x14; + mov ecx, esp; + lea eax, v4; + push eax; + call acceptNewFriendCall1; + sub esp, 0x8; + push 0x0; + lea eax, buffer; + push eax; + lea eax, v3; + push eax; + mov ecx, pParam; + call acceptNewFriendCall2; + mov isSucceeded, eax; + popfd; + popad; + } + + return isSucceeded; +} diff --git a/Spy/accept_new_friend.h b/Spy/accept_new_friend.h new file mode 100644 index 0000000..2ae834a --- /dev/null +++ b/Spy/accept_new_friend.h @@ -0,0 +1,6 @@ +#pragma once + +#include "framework.h" +#include "string" + +BOOL AcceptNewFriend(std::wstring v3, std::wstring v4); diff --git a/Spy/load_calls.cpp b/Spy/load_calls.cpp index e076ad2..dae885b 100644 --- a/Spy/load_calls.cpp +++ b/Spy/load_calls.cpp @@ -4,19 +4,22 @@ #include "load_calls.h" #define SUPPORT_VERSION L"3.7.0.30" -WxCalls_t wxCalls = { 0x2366538, // Login Status - { 0x236607C, 0x23660F4, 0x2366128 }, // User Info: wxid, nickname, mobile - 0x521D30, // Send Message - /* Receive Message: - Hook, call, type, self, id, msgXml, roomId, wxId, content */ - { 0x550F4C, 0xA96350, 0x38, 0x3C, 0x184, 0x1EC, 0x48, 0x170, 0x70 }, - { 0xBD780, 0x771980, 0x521640 }, // Send Image Message - /* Get Contacts: - Base, head, wxId, Code, Name, Gender, Country, Province, City*/ - { 0x23668F4, 0x4C, 0x30, 0x44, 0x8C, 0x184, 0x1D0, 0x1E4, 0x1F8 }, - /* Exec Sql: - Exec, base, start, end, slot, name*/ - { 0x141BDF0, 0x2366934, 0x1428, 0x142C, 0x3C, 0x50 } }; +WxCalls_t wxCalls = { + 0x2366538, // Login Status + { 0x236607C, 0x23660F4, 0x2366128 }, // User Info: wxid, nickname, mobile + 0x521D30, // Send Message + /* Receive Message: + Hook, call, type, self, id, msgXml, roomId, wxId, content */ + { 0x550F4C, 0xA96350, 0x38, 0x3C, 0x184, 0x1EC, 0x48, 0x170, 0x70 }, + { 0xBD780, 0x771980, 0x521640 }, // Send Image Message + /* Get Contacts: + Base, head, wxId, Code, Name, Gender, Country, Province, City*/ + { 0x23668F4, 0x4C, 0x30, 0x44, 0x8C, 0x184, 0x1D0, 0x1E4, 0x1F8 }, + /* Exec Sql: + Exec, base, start, end, slot, name*/ + { 0x141BDF0, 0x2366934, 0x1428, 0x142C, 0x3C, 0x50 }, + { 0x771980, 0x2AE8D0, 0x1EE40E0 } // Accept New Friend application +}; int LoadCalls(const wchar_t *version, WxCalls_t *calls) { diff --git a/Spy/rpc_server.cpp b/Spy/rpc_server.cpp index ed552b5..f39103d 100644 --- a/Spy/rpc_server.cpp +++ b/Spy/rpc_server.cpp @@ -1,6 +1,7 @@ #include #include +#include "accept_new_friend.h" #include "exec_sql.h" #include "get_contacts.h" #include "receive_msg.h" @@ -277,3 +278,5 @@ int server_ExecDbQuery(const wchar_t *db, const wchar_t *sql, int *pRow, int *pC return 0; } + +BOOL server_AcceptNewFriend(const wchar_t *v3, const wchar_t *v4) { return AcceptNewFriend(v3, v4); } diff --git a/Spy/spy_types.h b/Spy/spy_types.h index a56754c..df0ace8 100644 --- a/Spy/spy_types.h +++ b/Spy/spy_types.h @@ -50,6 +50,12 @@ typedef struct Sql { DWORD name; } Sql_t; +typedef struct NewFriend { + DWORD call1; + DWORD call2; + DWORD handle; +} NewFriend_t; + typedef struct WxCalls { DWORD login; // 登录状态 UserInfoCall_t ui; // 用户信息 @@ -58,6 +64,8 @@ typedef struct WxCalls { SendImg_t sendImg; // 发送图片 Contact_t contact; // 获取联系人 Sql_t sql; // 执行 SQL + NewFriend_t anf; // 通过好友申请 + } WxCalls_t; typedef struct TextStruct {