From e563710f80c3a6ed89413f7dca1ca3af59938dea Mon Sep 17 00:00:00 2001 From: hugy <504650082@qq.com> Date: Thu, 9 Feb 2023 15:47:55 +0800 Subject: [PATCH] =?UTF-8?q?3.9.0.28=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 44 ++++++++++++++++++++++++-------------------- src/contact.cc | 4 ++-- src/hook_recv_msg.cc | 11 ++++------- src/pat.cc | 4 ++-- src/self_info.cc | 30 +++++++++++++++--------------- src/send_file.cc | 10 +++++----- src/send_image.cc | 10 +++++----- src/send_text.cc | 27 +++++++++++++++------------ src/sns.cc | 19 +++---------------- 9 files changed, 75 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index cb43363..fb1e9c6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # wxhelper -wechat hook 。PC端微信逆向学习。支持3.8.0.41,3.8.1.26版本。 +wechat hook 。PC端微信逆向学习。支持3.8.0.41,3.8.1.26,3.9.0.28版本。 #### 免责声明: 本仓库发布的内容,仅用于学习研究,请勿用于非法用途和商业用途!如因此产生任何法律纠纷,均与作者无关! @@ -7,13 +7,13 @@ wechat hook 。PC端微信逆向学习。支持3.8.0.41,3.8.1.26版本。 本项目是个人学习学习逆向的项目,主要参考 https://github.com/ljc545w/ComWeChatRobot ,在此基础上实现了微信的的其它版本的部分内容。 #### 使用说明: -支持的版本3.8.0.41,3.8.1.26。 +支持的版本3.8.0.41,3.8.1.26,3.9.0.28。 src:主要的dll代码 tool:简单的注入工具,一个是控制台,一个是图形界面。 python: 简单的服务器,用以接收消息内容。 release:编译好的dll。 -0.首先安装对应的微信版本,主分支是3.8.0.41版本,3.8.1.26分支对应3.8.1.26版本。 +0.首先安装对应的微信版本,主分支是3.8.0.41版本,分支对应相应的微信版本号. 1.通过cmake构建成功后,将wxhelper.dll注入到微信,本地启动tcp server,监听19088端口。 2.通过http协议与dll通信,方便客户端操作。 3.接口的url为http://127.0.0.1:19088,注入成功后,直接进行调用即可。 @@ -21,6 +21,8 @@ release:编译好的dll。 5.相关功能只在win11环境下进行简单测试,其他环境无法保证。 6.注意个别接口在3.8.0.41版本没有实现,具体参考源码。 7.对应分支接口文档都是支持指定版本的,其他版本不支持,请特别注意版本。 +8.相应分支的文档对应相应版本,带有删除线的接口表示该版本的暂未实现,其他版本有实现。后续会继续实现。 + #### 编译环境 @@ -95,7 +97,9 @@ vcpkg 2023-02-06 : 新增确认收款。 -2023-02-08 : 新增朋友圈消息。 +2023-02-08 : 新增朋友圈消息。 + +2023-02-09 : 新增3.9.0.28版本基础功能。 #### 功能预览: 0.检查是否登录 @@ -105,25 +109,25 @@ vcpkg 6.发送文件 9.hook消息 10.取消hook消息 -11.hook图片 -12.取消hook图片 -17.删除好友 -25.获取群成员 -27.删除群成员 -28.增加群成员 -31.修改群昵称 -32.获取数据库句柄 -34.查询数据库 -40.转发消息 +~~11.hook图片~~ +~~12.取消hook图片~~ +~~17.删除好友~~ +~~25.获取群成员~~ +~~27.删除群成员~~ +~~28.增加群成员~~ +~~31.修改群昵称~~ +~~32.获取数据库句柄~~ +~~34.查询数据库~~ +~~40.转发消息~~ 44.退出登录 -45.确认收款 +~~45.确认收款~~ 46.联系人列表 -47.获取群详情 +~~47.获取群详情~~ 48.获取解密图片 -49.图片提取文字ocr -50.拍一拍 -51.群消息置顶消息 -52.群消息取消置顶 +~~49.图片提取文字ocr~~ +~~50.拍一拍~~ +~~51.群消息置顶消息~~ +~~52.群消息取消置顶~~ 53.朋友圈首页 54.朋友圈下一页 ### 接口文档: diff --git a/src/contact.cc b/src/contact.cc index 0a14cd4..f4695d8 100644 --- a/src/contact.cc +++ b/src/contact.cc @@ -4,8 +4,8 @@ #include "common.h" #include "wechat_data.h" using namespace std; -#define WX_CONTACT_MGR_INSTANCE_OFFSET 0x64dc30 -#define WX_CONTACT_GET_LIST_OFFSET 0xa9b000 +#define WX_CONTACT_MGR_INSTANCE_OFFSET 0x6f8990 +#define WX_CONTACT_GET_LIST_OFFSET 0xb97550 #define WX_CONTACT_DEL_OFFSET 0xa9ef40 #define WX_INIT_CHAT_MSG_OFFSET 0xdbf380 #define WX_DB_QUERY_OFFSET 0xa9ec40 diff --git a/src/hook_recv_msg.cc b/src/hook_recv_msg.cc index a4e1ff9..7c1ae43 100644 --- a/src/hook_recv_msg.cc +++ b/src/hook_recv_msg.cc @@ -10,10 +10,10 @@ using namespace nlohmann; using namespace std; -#define WX_RECV_MSG_HOOK_OFFSET 0xb97126 -#define WX_RECV_MSG_HOOK_NEXT_OFFSET 0x6fc850 -#define WX_SNS_HOOK_OFFSET 0x12fb9a5 -#define WX_SNS_HOOK_NEXT_OFFSET 0x12fbc30 +#define WX_RECV_MSG_HOOK_OFFSET 0xca0284 +#define WX_RECV_MSG_HOOK_NEXT_OFFSET 0x7d5030 +#define WX_SNS_HOOK_OFFSET 0x143ef09 +#define WX_SNS_HOOK_NEXT_OFFSET 0x143f1b0 // SyncMgr::addMsgListToDB // #define WX_RECV_MSG_HOOK_OFFSET 0xB9C919 @@ -147,9 +147,6 @@ void __cdecl OnRecvMsg(DWORD msg_addr) { if (content_len > 0) { j_msg["content"] = unicode_to_utf8((wchar_t *)READ_WSTRING(msg_addr, 0x70).c_str()); -#ifdef _DEBUG - printf("%s", j_msg["content"].get().c_str()); -#endif } int sign_len = *(DWORD *)(msg_addr + 0x18C); if (sign_len > 0) { diff --git a/src/pat.cc b/src/pat.cc index 551927c..2fa6ec8 100644 --- a/src/pat.cc +++ b/src/pat.cc @@ -4,9 +4,9 @@ #include "common.h" #include "wechat_data.h" -#define WX_PAT_MGR_OFFSET 0x7e91c0 +#define WX_PAT_MGR_OFFSET 0x8d0c00 #define WX_SEND_PAT_MSG_OFFSET 0x1228510 -#define WX_RET_OFFSET 0x1AE4A45 +#define WX_RET_OFFSET 0x1C94D34 int SendPatMsg(wchar_t* chat_room_id, wchar_t* wxid) { int success = -1; diff --git a/src/self_info.cc b/src/self_info.cc index b527499..e34c7eb 100644 --- a/src/self_info.cc +++ b/src/self_info.cc @@ -6,22 +6,22 @@ #include "wechat_data.h" using namespace std; -#define WX_SELF_NAME_OFFSET 0x2C426E8 -#define WX_SELF_MOBILE_OFFSET 0x2C42658 -#define WX_SELF_CITY_OFFSET 0x2C426B8 -#define WX_SELF_PROVINCE_OFFSET 0x2C426A0 -#define WX_SELF_COUNTRY_OFFSET 0x2C42688 -#define WX_SELF_ACCOUNT_OFFSET 0x2C42640 -#define WX_SELF_ID_OFFSET 0x2C42A38 -#define WX_SELF_SMALL_IMG_OFFSET 0x2C4289C -#define WX_SELF_BIG_IMG_OFFSET 0x2C428B4 -#define WX_LOGIN_STATUS_OFFSET 0x2c42a10 -#define WX_APP_DATA_ROOT_PATH_OFFSET 0x2c84ae0 -#define WX_APP_DATA_SAVE_PATH_OFFSET 0x2c65728 -#define WX_CURRENT_DATA_PATH_OFFSET 0x2c636fc +#define WX_SELF_NAME_OFFSET 0x2E2CE48 +#define WX_SELF_MOBILE_OFFSET 0x2E2CDB8 +#define WX_SELF_CITY_OFFSET 0x2E2CE18 +#define WX_SELF_PROVINCE_OFFSET 0x2E2CE00 +#define WX_SELF_COUNTRY_OFFSET 0x2E2CDE8 +#define WX_SELF_ACCOUNT_OFFSET 0x2e2d1d0 +#define WX_SELF_ID_OFFSET 0x2E2CD3C +#define WX_SELF_SMALL_IMG_OFFSET 0x2E2D014 +#define WX_SELF_BIG_IMG_OFFSET 0x2E2CFFC +#define WX_LOGIN_STATUS_OFFSET 0x2E2D1C0 +#define WX_APP_DATA_ROOT_PATH_OFFSET 0x2E73010 +#define WX_APP_DATA_SAVE_PATH_OFFSET 0x2E52DB0 +#define WX_CURRENT_DATA_PATH_OFFSET 0x2E4F290 -#define WX_LOGOUT_OFFSET 0xccc320 -#define WX_ACCOUT_SERVICE_OFFSET 0x65bcc0 +#define WX_LOGOUT_OFFSET 0xdd5c90 +#define WX_ACCOUT_SERVICE_OFFSET 0x707960 int GetSelfInfo(SelfInfoInner &out) { DWORD base = GetWeChatWinBase(); diff --git a/src/send_file.cc b/src/send_file.cc index 11f12e9..526210a 100644 --- a/src/send_file.cc +++ b/src/send_file.cc @@ -3,16 +3,16 @@ #include "common.h" #include "wechat_data.h" -#define WX_APP_MSG_MGR_OFFSET 0x65df50 -#define WX_SEND_FILE_OFFSET 0xa10190 -#define WX_INIT_CHAT_MSG_OFFSET 0xdbf380 -#define WX_FREE_CHAT_MSG_OFFSET 0x649ac0 +#define WX_APP_MSG_MGR_OFFSET 0x709bb0 +#define WX_SEND_FILE_OFFSET 0xb06240 +#define WX_INIT_CHAT_MSG_OFFSET 0xed3be0 +#define WX_FREE_CHAT_MSG_OFFSET 0x6f4ea0 int SendFile(wchar_t *wxid, wchar_t *file_path){ int success = 0; WeChatString to_user(wxid); WeChatString path(file_path); - char chat_msg[0x2A8] = {0}; + char chat_msg[0x2C4] = {0}; DWORD base = GetWeChatWinBase(); DWORD app_msg_mgr_addr = base + WX_APP_MSG_MGR_OFFSET; DWORD init_chat_msg_addr = base + WX_INIT_CHAT_MSG_OFFSET; diff --git a/src/send_image.cc b/src/send_image.cc index 24f40f1..00b6464 100644 --- a/src/send_image.cc +++ b/src/send_image.cc @@ -3,17 +3,17 @@ #include "common.h" #include "wechat_data.h" -#define WX_SEND_IMAGE_OFFSET 0xb6a3f0 -#define WX_SEND_MESSAGE_MGR_OFFSET 0x65b2a0 -#define WX_INIT_CHAT_MSG_OFFSET 0xdbf380 -#define WX_FREE_CHAT_MSG_OFFSET 0x649ac0 +#define WX_SEND_IMAGE_OFFSET 0xc71500 +#define WX_SEND_MESSAGE_MGR_OFFSET 0x706d30 +#define WX_INIT_CHAT_MSG_OFFSET 0xed3be0 +#define WX_FREE_CHAT_MSG_OFFSET 0x6f4ea0 int SendImage(wchar_t *wxid, wchar_t *image_path){ int success = 0; WeChatString to_user(wxid); WeChatString path(image_path); - char chat_msg[0x2A8] ={0}; + char chat_msg[0x2C4] ={0}; DWORD base = GetWeChatWinBase(); DWORD send_message_mgr_addr = base + WX_SEND_MESSAGE_MGR_OFFSET; DWORD init_chat_msg_addr = base + WX_INIT_CHAT_MSG_OFFSET; diff --git a/src/send_text.cc b/src/send_text.cc index 995fdd8..69bd08e 100644 --- a/src/send_text.cc +++ b/src/send_text.cc @@ -5,40 +5,43 @@ #include "common.h" #include "wechat_data.h" -#define WX_SEND_TEXT_OFFSET 0xb6a930 +#define WX_SEND_TEXT_OFFSET 0xc71a60 -#define WX_SEND_MESSAGE_MGR_OFFSET 0x65b2a0 +#define WX_SEND_MESSAGE_MGR_OFFSET 0x706d30 -#define WX_FREE_CHAT_MSG_OFFSET 0x649ac0 +#define WX_FREE_CHAT_MSG_OFFSET 0x6f4ea0 /// @brief 发生文本消息 /// @param wxid wxid /// @param msg 文本消息 /// @return 成功返回1 -int SendText(wchar_t* wxid, wchar_t* msg) { +int SendText(wchar_t* wxid, wchar_t* msg) { int success = 0; WeChatString to_user(wxid); WeChatString text_msg(msg); wchar_t **msg_pptr = &text_msg.ptr; - char chat_msg[0x2A8] ={0}; + DWORD base = GetWeChatWinBase(); DWORD send_message_mgr_addr = base + WX_SEND_MESSAGE_MGR_OFFSET; DWORD send_text_msg_addr = base + WX_SEND_TEXT_OFFSET; - DWORD free_msg_addr = base + WX_FREE_CHAT_MSG_OFFSET; + DWORD free_chat_msg_addr = base + WX_FREE_CHAT_MSG_OFFSET; + char chat_msg[0x2C4] ={0}; __asm{ PUSHAD + CALL send_message_mgr_addr + PUSH 0x0 PUSH 0x0 PUSH 0x0 PUSH 0x1 PUSH 0x0 - MOV EDI,msg_pptr - PUSH EDI + MOV EAX,msg_pptr + PUSH EAX LEA EDX,to_user LEA ECX,chat_msg - CALL send_text_msg_addr - ADD ESP,0x14 + CALL send_text_msg_addr MOV success,EAX - LEA ECX,chat_msg - CALL free_msg_addr + ADD ESP,0x18 + LEA ECX,chat_msg + CALL free_chat_msg_addr POPAD } return success; diff --git a/src/sns.cc b/src/sns.cc index e46e0cf..8c3ecd9 100644 --- a/src/sns.cc +++ b/src/sns.cc @@ -4,11 +4,9 @@ #include "common.h" #include "wechat_data.h" using namespace std; -#define WX_SNS_DATA_MGR_OFFSET 0xac66a0 -#define WX_SNS_GET_FIRST_PAGE_OFFSET 0x12e46c0 -#define WX_SNS_TIME_LINE_MGR_OFFSET 0x128e6a0 -#define WX_SNS_TRY_GET_FIRST_PAGE_SCENE_OFFSET 0x12ff300 -#define WX_SNS_GET_NEXT_PAGE_OFFSET 0x12e4760 +#define WX_SNS_DATA_MGR_OFFSET 0xbc4100 +#define WX_SNS_GET_FIRST_PAGE_OFFSET 0x1427be0 +#define WX_SNS_GET_NEXT_PAGE_OFFSET 0x1427c80 int GetFirstPage() { int success = -1; @@ -16,8 +14,6 @@ int GetFirstPage() { DWORD sns_data_mgr_addr = base + WX_SNS_DATA_MGR_OFFSET; DWORD get_first_page_addr = base + WX_SNS_GET_FIRST_PAGE_OFFSET; - DWORD time_line_mgr_addr = base + WX_SNS_TIME_LINE_MGR_OFFSET; - DWORD get_first_page_scene_addr = base + WX_SNS_TRY_GET_FIRST_PAGE_SCENE_OFFSET; char buff[0xB44] = {}; __asm { PUSHAD @@ -31,15 +27,6 @@ int GetFirstPage() { POPAD } -// __asm { -// PUSHAD -// CALL time_line_mgr_addr -// PUSH 0x1 -// MOV ECX,EAX -// CALL get_first_page_scene_addr -// MOV success, EAX -// POPAD -// } return success; }