mirror of
https://github.com/ttttupup/wxhelper.git
synced 2024-11-23 02:39:25 +08:00
commit
41b3b6b18d
186
doc/3.9.5.81.md
186
doc/3.9.5.81.md
@ -1080,3 +1080,189 @@ enableHttp=0时,使用ip,port的tcp服务回传消息。
|
|||||||
"msg": "success"
|
"msg": "success"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### 22.朋友圈首页**
|
||||||
|
###### 接口功能
|
||||||
|
> 朋友圈首页,前置条件需先调用hook消息接口成功,具体内容会在hook消息里返回,格式如下:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"data":[
|
||||||
|
{
|
||||||
|
"content": "",
|
||||||
|
"createTime': 1691125287,
|
||||||
|
"senderId': "",
|
||||||
|
"snsId': 123,
|
||||||
|
"xml':""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/getSNSFirstPage](/api/getSNSFirstPage)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|null|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": null,
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 23.朋友圈下一页**
|
||||||
|
###### 接口功能
|
||||||
|
> 朋友圈下一页
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/getSNSNextPage](/api/getSNSNextPage)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|snsId|number|snsId|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|null|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
|
||||||
|
"snsid":123
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": null,
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 24.收藏消息**
|
||||||
|
###### 接口功能
|
||||||
|
> 收藏消息
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/addFavFromMsg](/api/addFavFromMsg)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|msgId|number|消息id|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|null|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
|
||||||
|
"msgId":123
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": null,
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 24.收藏图片**
|
||||||
|
###### 接口功能
|
||||||
|
> 收藏图片
|
||||||
|
|
||||||
|
###### 接口地址
|
||||||
|
> [/api/addFavFromImage](/api/addFavFromImage)
|
||||||
|
|
||||||
|
###### HTTP请求方式
|
||||||
|
> POST JSON
|
||||||
|
|
||||||
|
###### 请求参数
|
||||||
|
|参数|必选|类型|说明|
|
||||||
|
|---|---|---|---|
|
||||||
|
|wxid|string|wxid|
|
||||||
|
|imagePath|string|图片地址|
|
||||||
|
|
||||||
|
|
||||||
|
###### 返回字段
|
||||||
|
|返回字段|字段类型|说明 |
|
||||||
|
|---|---|---|
|
||||||
|
|code|int|返回状态,1成功, -1失败|
|
||||||
|
|msg|string|成功提示|
|
||||||
|
|data|object|null|
|
||||||
|
|
||||||
|
|
||||||
|
###### 接口示例
|
||||||
|
|
||||||
|
入参:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
|
||||||
|
"wxid":"wxid_12333",
|
||||||
|
"imagePath":"C:\\test\\test.png"
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
响应:
|
||||||
|
``` javascript
|
||||||
|
{
|
||||||
|
"code": 1,
|
||||||
|
"data": null,
|
||||||
|
"msg": "success"
|
||||||
|
}
|
||||||
|
```
|
@ -304,6 +304,63 @@ def forwardMsg():
|
|||||||
response = requests.request("POST", url, headers=headers, data=payload)
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
print(response.text)
|
print(response.text)
|
||||||
|
|
||||||
|
def getSNSFirstPage():
|
||||||
|
url = "127.0.0.1:19088/api/getSNSFirstPage"
|
||||||
|
|
||||||
|
payload = {}
|
||||||
|
headers = {}
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
print(response.text)
|
||||||
|
|
||||||
|
def getSNSNextPage():
|
||||||
|
print("modify snsId ")
|
||||||
|
raise RuntimeError("modify snsId then deleted me")
|
||||||
|
url = "127.0.0.1:19088/api/getSNSNextPage"
|
||||||
|
|
||||||
|
payload = json.dumps({
|
||||||
|
"snsId": ""
|
||||||
|
})
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
|
||||||
|
def addFavFromMsg():
|
||||||
|
print("modify msgId ")
|
||||||
|
raise RuntimeError("modify msgId then deleted me")
|
||||||
|
url = "127.0.0.1:19088/api/addFavFromMsg"
|
||||||
|
|
||||||
|
payload = json.dumps({
|
||||||
|
"msgId": "1222222"
|
||||||
|
})
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
|
||||||
|
def addFavFromImage():
|
||||||
|
print("modify wxid imagePath ")
|
||||||
|
raise RuntimeError("modify wxid imagePath then deleted me")
|
||||||
|
url = "127.0.0.1:19088/api/addFavFromImage"
|
||||||
|
|
||||||
|
payload = json.dumps({
|
||||||
|
"wxid": "",
|
||||||
|
"imagePath": ""
|
||||||
|
})
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.request("POST", url, headers=headers, data=payload)
|
||||||
|
|
||||||
|
print(response.text)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
checkLogin()
|
checkLogin()
|
||||||
|
54
src/hooks.cc
54
src/hooks.cc
@ -18,6 +18,8 @@ static char kServerIp[16] = "127.0.0.1";
|
|||||||
static bool kEnableHttp = false;
|
static bool kEnableHttp = false;
|
||||||
static bool kLogHookFlag = false;
|
static bool kLogHookFlag = false;
|
||||||
|
|
||||||
|
static bool kSnsFinishHookFlag = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static UINT64 (*R_DoAddMsg)(UINT64, UINT64, UINT64) = (UINT64(*)(
|
static UINT64 (*R_DoAddMsg)(UINT64, UINT64, UINT64) = (UINT64(*)(
|
||||||
@ -29,6 +31,10 @@ static UINT64 (*R_Log)(UINT64, UINT64, UINT64, UINT64, UINT64, UINT64, UINT64,
|
|||||||
UINT64, UINT64, UINT64,
|
UINT64, UINT64, UINT64,
|
||||||
UINT64))(Utils::GetWeChatWinBase() + offset::kHookLog);
|
UINT64))(Utils::GetWeChatWinBase() + offset::kHookLog);
|
||||||
|
|
||||||
|
static UINT64 (*R_OnSnsTimeLineSceneFinish)(UINT64, UINT64, UINT64) =
|
||||||
|
(UINT64(*)(UINT64, UINT64, UINT64))(Utils::GetWeChatWinBase() +
|
||||||
|
offset::kOnSnsTimeLineSceneFinish);
|
||||||
|
|
||||||
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
||||||
PTP_WORK Work) {
|
PTP_WORK Work) {
|
||||||
common::InnerMessageStruct *msg = (common::InnerMessageStruct *)context;
|
common::InnerMessageStruct *msg = (common::InnerMessageStruct *)context;
|
||||||
@ -167,6 +173,39 @@ if(p== 0 || p == 1){
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HandleSNSMsg(INT64 param1, INT64 param2, INT64 param3) {
|
||||||
|
nlohmann::json j_sns;
|
||||||
|
INT64 begin_addr = *(INT64 *)(param2 + 0x30);
|
||||||
|
INT64 end_addr = *(INT64 *)(param2 + 0x38);
|
||||||
|
if (begin_addr == 0) {
|
||||||
|
j_sns = {{"data", nlohmann::json::array()}};
|
||||||
|
} else {
|
||||||
|
while (begin_addr < end_addr) {
|
||||||
|
nlohmann::json j_item;
|
||||||
|
j_item["snsId"] = *(UINT64 *)(begin_addr);
|
||||||
|
j_item["createTime"] = *(DWORD *)(begin_addr + 0x38);
|
||||||
|
j_item["senderId"] = Utils::ReadWstringThenConvert(begin_addr + 0x18);
|
||||||
|
j_item["content"] = Utils::ReadWstringThenConvert(begin_addr + 0x48);
|
||||||
|
j_item["xml"] = Utils::ReadWstringThenConvert(begin_addr + 0x580);
|
||||||
|
j_sns["data"].push_back(j_item);
|
||||||
|
begin_addr += 0x11E0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string jstr = j_sns.dump() + '\n';
|
||||||
|
common::InnerMessageStruct *inner_msg = new common::InnerMessageStruct;
|
||||||
|
inner_msg->buffer = new char[jstr.size() + 1];
|
||||||
|
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
||||||
|
inner_msg->length = jstr.size();
|
||||||
|
if (kEnableHttp) {
|
||||||
|
bool add = ThreadPool::GetInstance().AddWork(SendHttpMsgCallback, inner_msg);
|
||||||
|
SPDLOG_INFO("hook sns add http msg work:{}", add);
|
||||||
|
} else {
|
||||||
|
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback, inner_msg);
|
||||||
|
SPDLOG_INFO("hook sns add msg work:{}", add);
|
||||||
|
}
|
||||||
|
R_OnSnsTimeLineSceneFinish(param1, param2, param3);
|
||||||
|
}
|
||||||
|
|
||||||
int HookSyncMsg(std::string client_ip, int port, std::string url,
|
int HookSyncMsg(std::string client_ip, int port, std::string url,
|
||||||
uint64_t timeout, bool enable) {
|
uint64_t timeout, bool enable) {
|
||||||
if (kMsgHookFlag) {
|
if (kMsgHookFlag) {
|
||||||
@ -189,15 +228,23 @@ int HookSyncMsg(std::string client_ip, int port, std::string url,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DetourRestoreAfterWith();
|
// DetourRestoreAfterWith();
|
||||||
DetourTransactionBegin();
|
DetourTransactionBegin();
|
||||||
DetourUpdateThread(GetCurrentThread());
|
DetourUpdateThread(GetCurrentThread());
|
||||||
UINT64 do_add_msg_addr = base + offset::kDoAddMsg;
|
|
||||||
DetourAttach(&(PVOID&)R_DoAddMsg, &HandleSyncMsg);
|
DetourAttach(&(PVOID&)R_DoAddMsg, &HandleSyncMsg);
|
||||||
LONG ret = DetourTransactionCommit();
|
LONG ret = DetourTransactionCommit();
|
||||||
if(ret == NO_ERROR){
|
if(ret == NO_ERROR){
|
||||||
kMsgHookFlag = true;
|
kMsgHookFlag = true;
|
||||||
}
|
}
|
||||||
|
SPDLOG_INFO("hook sync {}",ret);
|
||||||
|
DetourTransactionBegin();
|
||||||
|
DetourUpdateThread(GetCurrentThread());
|
||||||
|
DetourAttach(&(PVOID&)R_OnSnsTimeLineSceneFinish, &HandleSNSMsg);
|
||||||
|
ret = DetourTransactionCommit();
|
||||||
|
if(ret == NO_ERROR){
|
||||||
|
kSnsFinishHookFlag = true;
|
||||||
|
}
|
||||||
|
SPDLOG_INFO("hook sns {}",ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,7 +259,6 @@ int UnHookSyncMsg() {
|
|||||||
UINT64 base = Utils::GetWeChatWinBase();
|
UINT64 base = Utils::GetWeChatWinBase();
|
||||||
DetourTransactionBegin();
|
DetourTransactionBegin();
|
||||||
DetourUpdateThread(GetCurrentThread());
|
DetourUpdateThread(GetCurrentThread());
|
||||||
UINT64 do_add_msg_addr = base + offset::kDoAddMsg;
|
|
||||||
DetourDetach(&(PVOID&)R_DoAddMsg, &HandleSyncMsg);
|
DetourDetach(&(PVOID&)R_DoAddMsg, &HandleSyncMsg);
|
||||||
LONG ret = DetourTransactionCommit();
|
LONG ret = DetourTransactionCommit();
|
||||||
if (ret == NO_ERROR) {
|
if (ret == NO_ERROR) {
|
||||||
@ -235,7 +281,7 @@ int UnHookSyncMsg() {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DetourRestoreAfterWith();
|
// DetourRestoreAfterWith();
|
||||||
DetourTransactionBegin();
|
DetourTransactionBegin();
|
||||||
DetourUpdateThread(GetCurrentThread());
|
DetourUpdateThread(GetCurrentThread());
|
||||||
UINT64 do_add_msg_addr = base + offset::kHookLog;
|
UINT64 do_add_msg_addr = base + offset::kHookLog;
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include "hooks.h"
|
#include "hooks.h"
|
||||||
#include "db.h"
|
#include "db.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define STR2ULL(str) (wxhelper::Utils::IsDigit(str) ? stoull(str) : 0)
|
||||||
#define STR2LL(str) (wxhelper::Utils::IsDigit(str) ? stoll(str) : 0)
|
#define STR2LL(str) (wxhelper::Utils::IsDigit(str) ? stoll(str) : 0)
|
||||||
#define STR2I(str) (wxhelper::Utils::IsDigit(str) ? stoi(str) : 0)
|
#define STR2I(str) (wxhelper::Utils::IsDigit(str) ? stoi(str) : 0)
|
||||||
namespace common = wxhelper::common;
|
namespace common = wxhelper::common;
|
||||||
@ -30,6 +32,16 @@ INT64 GetINT64Param(nlohmann::json data, std::string key) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT64 GetUINT64Param(nlohmann::json data, std::string key) {
|
||||||
|
UINT64 result;
|
||||||
|
try {
|
||||||
|
result = data[key].get<UINT64>();
|
||||||
|
} catch (nlohmann::json::exception) {
|
||||||
|
result = STR2ULL(data[key].get<std::string>());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
std::string GetStringParam(nlohmann::json data, std::string key) {
|
std::string GetStringParam(nlohmann::json data, std::string key) {
|
||||||
return data[key].get<std::string>();
|
return data[key].get<std::string>();
|
||||||
}
|
}
|
||||||
@ -423,6 +435,38 @@ std::string HttpDispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
|||||||
{"code", success}, {"msg", "success"}, {"data", {}}};
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
ret = ret_data.dump();
|
ret = ret_data.dump();
|
||||||
return ret;
|
return ret;
|
||||||
|
} else if (mg_http_match_uri(hm, "/api/getSNSFirstPage")) {
|
||||||
|
INT64 success =
|
||||||
|
wxhelper::GlobalContext::GetInstance().mgr->GetSNSFirstPage();
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
return ret;
|
||||||
|
} else if (mg_http_match_uri(hm, "/api/getSNSNextPage")) {
|
||||||
|
UINT64 snsid = GetUINT64Param(j_param, "snsId");
|
||||||
|
INT64 success =
|
||||||
|
wxhelper::GlobalContext::GetInstance().mgr->GetSNSNextPage(snsid);
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
return ret;
|
||||||
|
} else if (mg_http_match_uri(hm, "/api/addFavFromMsg")) {
|
||||||
|
UINT64 msg_id = GetUINT64Param(j_param, "msgId");
|
||||||
|
INT64 success =
|
||||||
|
wxhelper::GlobalContext::GetInstance().mgr->AddFavFromMsg(msg_id);
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
return ret;
|
||||||
|
} else if (mg_http_match_uri(hm, "/api/addFavFromImage")) {
|
||||||
|
std::wstring wxid = GetWStringParam(j_param, "wxid");
|
||||||
|
std::wstring image_path = GetWStringParam(j_param, "imagePath");
|
||||||
|
INT64 success = wxhelper::GlobalContext::GetInstance().mgr->AddFavFromImage(
|
||||||
|
wxid, image_path);
|
||||||
|
nlohmann::json ret_data = {
|
||||||
|
{"code", success}, {"msg", "success"}, {"data", {}}};
|
||||||
|
ret = ret_data.dump();
|
||||||
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
nlohmann::json ret_data = {
|
nlohmann::json ret_data = {
|
||||||
{"code", 200}, {"data", {}}, {"msg", "not support url"}};
|
{"code", 200}, {"data", {}}, {"msg", "not support url"}};
|
||||||
|
@ -603,4 +603,84 @@ INT64 Manager::ForwardMsg(UINT64 msg_id, const std::wstring &wxid) {
|
|||||||
success = forward_msg(reinterpret_cast<UINT64>(recv), l.QuadPart, 0x4, 0x0);
|
success = forward_msg(reinterpret_cast<UINT64>(recv), l.QuadPart, 0x4, 0x0);
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INT64 Manager::GetSNSFirstPage() {
|
||||||
|
INT64 success = -1;
|
||||||
|
UINT64 sns_data_mgr_addr = base_addr_ + offset::kSNSDataMgr;
|
||||||
|
UINT64 sns_first_page_addr = base_addr_ + offset::kSNSGetFirstPage;
|
||||||
|
func::__GetSNSDataMgr sns_data_mgr = (func::__GetSNSDataMgr)sns_data_mgr_addr;
|
||||||
|
func::__GetSNSFirstPage sns_first_page =
|
||||||
|
(func::__GetSNSFirstPage)sns_first_page_addr;
|
||||||
|
UINT64 mgr = sns_data_mgr();
|
||||||
|
INT64 buff[16] = {0};
|
||||||
|
success = sns_first_page(mgr, reinterpret_cast<UINT64>(&buff), 1);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT64 Manager::GetSNSNextPage(UINT64 sns_id) {
|
||||||
|
INT64 success = -1;
|
||||||
|
UINT64 time_line_mgr_addr = base_addr_ + offset::kSNSTimeLineMgr;
|
||||||
|
UINT64 sns_next_page_addr = base_addr_ + offset::kSNSGetNextPageScene;
|
||||||
|
func::__GetSnsTimeLineMgr time_line_mgr =
|
||||||
|
(func::__GetSnsTimeLineMgr)time_line_mgr_addr;
|
||||||
|
func::__GetSNSNextPageScene sns_next_page =
|
||||||
|
(func::__GetSNSNextPageScene)sns_next_page_addr;
|
||||||
|
UINT64 mgr = time_line_mgr();
|
||||||
|
success = sns_next_page(mgr, sns_id);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT64 Manager::AddFavFromMsg(UINT64 msg_id) {
|
||||||
|
INT64 success = -1;
|
||||||
|
UINT64 get_chat_mgr_addr = base_addr_ + offset::kGetChatMgr;
|
||||||
|
UINT64 get_by_local_id_addr = base_addr_ + offset::kGetMgrByPrefixLocalId;
|
||||||
|
UINT64 add_fav_addr = base_addr_ + offset::kAddFavFromMsg;
|
||||||
|
UINT64 get_favorite_mgr_addr = base_addr_ + offset::kGetFavoriteMgr;
|
||||||
|
UINT64 free_chat_msg_addr = base_addr_ + offset::kFreeChatMsg;
|
||||||
|
func::__GetMgrByPrefixLocalId get_by_local_id = (func::__GetMgrByPrefixLocalId)get_by_local_id_addr;
|
||||||
|
UINT64 new_chat_msg_addr = base_addr_ + offset::kChatMsgInstanceCounter;
|
||||||
|
|
||||||
|
func::__AddFavFromMsg add_fav = (func::__AddFavFromMsg)add_fav_addr;
|
||||||
|
func::__GetChatMgr get_chat_mgr = (func::__GetChatMgr)get_chat_mgr_addr;
|
||||||
|
func::__GetFavoriteMgr get_favorite_mgr = (func::__GetFavoriteMgr)get_favorite_mgr_addr;
|
||||||
|
func::__FreeChatMsg free_chat_msg = (func::__FreeChatMsg)free_chat_msg_addr;
|
||||||
|
func::__NewChatMsg new_chat_msg = (func::__NewChatMsg)new_chat_msg_addr;
|
||||||
|
|
||||||
|
INT64 index = 0;
|
||||||
|
INT64 local_id = DB::GetInstance().GetLocalIdByMsgId(msg_id, index);
|
||||||
|
if (local_id <= 0 || index >> 32 == 0) {
|
||||||
|
success = -2;
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
char chat_msg[0x460]= {0};
|
||||||
|
LARGE_INTEGER l;
|
||||||
|
l.HighPart = index >> 32;
|
||||||
|
l.LowPart = (DWORD)local_id;
|
||||||
|
UINT64 p_chat_msg = new_chat_msg(reinterpret_cast<UINT64>(&chat_msg));
|
||||||
|
|
||||||
|
get_chat_mgr();
|
||||||
|
get_by_local_id(l.QuadPart,p_chat_msg);
|
||||||
|
UINT64 mgr = get_favorite_mgr();
|
||||||
|
success = add_fav(mgr,p_chat_msg);
|
||||||
|
free_chat_msg(p_chat_msg);
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT64 Manager::AddFavFromImage(const std::wstring &wxid,
|
||||||
|
const std::wstring &image_path) {
|
||||||
|
INT64 success = -1;
|
||||||
|
UINT64 get_favorite_mgr_addr = base_addr_ + offset::kGetFavoriteMgr;
|
||||||
|
UINT64 add_fav_from_image_addr = base_addr_ + offset::kAddFavFromImage;
|
||||||
|
prototype::WeChatString *send_id = BuildWechatString(wxid);
|
||||||
|
prototype::WeChatString *path = BuildWechatString(image_path);
|
||||||
|
func::__GetFavoriteMgr get_favorite_mgr =
|
||||||
|
(func::__GetFavoriteMgr)get_favorite_mgr_addr;
|
||||||
|
func::__AddFavFromImage add_fav_from_image =
|
||||||
|
(func::__AddFavFromImage)add_fav_from_image_addr;
|
||||||
|
UINT64 mgr = get_favorite_mgr();
|
||||||
|
success = add_fav_from_image(mgr, reinterpret_cast<UINT64>(path),
|
||||||
|
reinterpret_cast<UINT64>(send_id));
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace wxhelper
|
} // namespace wxhelper
|
@ -32,6 +32,11 @@ class Manager {
|
|||||||
INT64 CreateChatRoom(const std::vector<std::wstring>& wxids);
|
INT64 CreateChatRoom(const std::vector<std::wstring>& wxids);
|
||||||
INT64 QuitChatRoom(const std::wstring& room_id);
|
INT64 QuitChatRoom(const std::wstring& room_id);
|
||||||
INT64 ForwardMsg(UINT64 msg_id, const std::wstring& wxid);
|
INT64 ForwardMsg(UINT64 msg_id, const std::wstring& wxid);
|
||||||
|
INT64 GetSNSFirstPage();
|
||||||
|
INT64 GetSNSNextPage(UINT64 sns_id);
|
||||||
|
INT64 AddFavFromMsg(UINT64 msg_id);
|
||||||
|
INT64 AddFavFromImage(const std::wstring& wxid,
|
||||||
|
const std::wstring& image_path);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
UINT64 base_addr_;
|
UINT64 base_addr_;
|
||||||
|
@ -241,6 +241,17 @@ typedef UINT64 (*__CreateChatRoom)(UINT64,UINT64,UINT64);
|
|||||||
typedef UINT64 (*__QuitChatRoom)(UINT64,UINT64,UINT64);
|
typedef UINT64 (*__QuitChatRoom)(UINT64,UINT64,UINT64);
|
||||||
typedef UINT64 (*__ForwardMsg)(UINT64,UINT64,UINT64,UINT64);
|
typedef UINT64 (*__ForwardMsg)(UINT64,UINT64,UINT64,UINT64);
|
||||||
|
|
||||||
|
typedef UINT64 (*__GetSNSFirstPage)(UINT64,UINT64,UINT64);
|
||||||
|
typedef UINT64 (*__GetSNSNextPageScene)(UINT64,UINT64);
|
||||||
|
|
||||||
|
typedef UINT64 (*__GetSNSDataMgr)();
|
||||||
|
typedef UINT64 (*__GetSnsTimeLineMgr)();
|
||||||
|
typedef UINT64 (*__GetMgrByPrefixLocalId)(UINT64,UINT64);
|
||||||
|
typedef UINT64 (*__AddFavFromMsg)(UINT64,UINT64);
|
||||||
|
typedef UINT64 (*__GetChatMgr)();
|
||||||
|
typedef UINT64 (*__GetFavoriteMgr)();
|
||||||
|
typedef UINT64 (*__AddFavFromImage)(UINT64,UINT64,UINT64);
|
||||||
|
|
||||||
|
|
||||||
} // namespace function
|
} // namespace function
|
||||||
namespace prototype {
|
namespace prototype {
|
||||||
@ -347,6 +358,17 @@ const UINT64 kCreateChatRoom = 0xe63340;
|
|||||||
const UINT64 kQuitChatRoom = 0xe6e3b0;
|
const UINT64 kQuitChatRoom = 0xe6e3b0;
|
||||||
const UINT64 kForwardMsg = 0xfcd0f0;
|
const UINT64 kForwardMsg = 0xfcd0f0;
|
||||||
|
|
||||||
|
const UINT64 kOnSnsTimeLineSceneFinish = 0x1a73150;
|
||||||
|
const UINT64 kSNSGetFirstPage = 0x1a51dd0;
|
||||||
|
const UINT64 kSNSGetNextPageScene = 0x1a77240;
|
||||||
|
const UINT64 kSNSDataMgr = 0xeebda0;
|
||||||
|
const UINT64 kSNSTimeLineMgr = 0x19e83a0;
|
||||||
|
const UINT64 kGetMgrByPrefixLocalId = 0xe4add0;
|
||||||
|
const UINT64 kAddFavFromMsg = 0x1601520;
|
||||||
|
const UINT64 kGetChatMgr = 0x8f0400;
|
||||||
|
const UINT64 kGetFavoriteMgr = 0x8c69b0;
|
||||||
|
const UINT64 kAddFavFromImage = 0x160b920;
|
||||||
|
|
||||||
} // namespace offset
|
} // namespace offset
|
||||||
} // namespace V3_9_5_81
|
} // namespace V3_9_5_81
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user