Impl DisableReceiveMsg
This commit is contained in:
parent
bdcf71cc37
commit
e2e148c73f
@ -71,7 +71,7 @@ int main()
|
|||||||
Sleep(1000); // 等待1秒
|
Sleep(1000); // 等待1秒
|
||||||
|
|
||||||
wprintf(L"Message: 接收通知中......\n");
|
wprintf(L"Message: 接收通知中......\n");
|
||||||
WxSetTextMsgCb(onTextMsg);
|
WxEnableRecvMsg(onTextMsg);
|
||||||
Sleep(1000); // 等待1秒
|
Sleep(1000); // 等待1秒
|
||||||
|
|
||||||
// 测试发送消息
|
// 测试发送消息
|
||||||
|
@ -7,11 +7,9 @@ import wcferry as sdk
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
print(dir(sdk)) # 查看SDK支持的方法和属性
|
print(dir(sdk)) # 查看SDK支持的方法和属性
|
||||||
help(sdk.WxSetTextMsgCb) # 查看某方法的情况
|
help(sdk.WxEnableRecvMsg) # 查看某方法的情况
|
||||||
help(sdk.WxMessage) # 查看消息结构
|
help(sdk.WxMessage) # 查看消息结构
|
||||||
help(sdk.WxContact) # 查看通讯录结构
|
help(sdk.WxContact) # 查看通讯录结构
|
||||||
WxMsgTypes = sdk.WxGetMsgTypes() # 获取消息类型
|
|
||||||
print(WxMsgTypes) # 查看消息类型
|
|
||||||
|
|
||||||
# 初始化SDK,如果成功,返回0;否则失败
|
# 初始化SDK,如果成功,返回0;否则失败
|
||||||
status = sdk.WxInitSDK()
|
status = sdk.WxInitSDK()
|
||||||
@ -20,6 +18,8 @@ def main():
|
|||||||
exit(-1)
|
exit(-1)
|
||||||
|
|
||||||
print("初始化成功")
|
print("初始化成功")
|
||||||
|
WxMsgTypes = sdk.WxGetMsgTypes() # 获取消息类型
|
||||||
|
print(WxMsgTypes) # 查看消息类型
|
||||||
|
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
print("打印通讯录......")
|
print("打印通讯录......")
|
||||||
@ -61,7 +61,7 @@ def main():
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
print("Message: 接收通知中......")
|
print("Message: 接收通知中......")
|
||||||
sdk.WxSetTextMsgCb(OnTextMsg) # 设置回调,接收消息
|
sdk.WxEnableRecvMsg(OnTextMsg) # 设置回调,接收消息
|
||||||
while True:
|
while True:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
|
@ -56,5 +56,6 @@ interface ISpy
|
|||||||
int GetDbTables([ in, string ] const wchar_t *db, [out] int *pNum, [ out, size_is(, *pNum) ] PPRpcTables *tbls);
|
int GetDbTables([ in, string ] const wchar_t *db, [out] int *pNum, [ out, size_is(, *pNum) ] PPRpcTables *tbls);
|
||||||
|
|
||||||
void EnableReceiveMsg();
|
void EnableReceiveMsg();
|
||||||
|
void DisableReceiveMsg();
|
||||||
[callback] int ReceiveMsg([in] RpcMessage_t rpcMsg);
|
[callback] int ReceiveMsg([in] RpcMessage_t rpcMsg);
|
||||||
};
|
};
|
||||||
|
@ -33,8 +33,6 @@ RPC_STATUS RpcDisconnectServer()
|
|||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
// Free the memory allocated by a string
|
// Free the memory allocated by a string
|
||||||
status = RpcStringFree(&pszStringBinding);
|
status = RpcStringFree(&pszStringBinding);
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
// Releases binding handle resources and disconnects from the server
|
// Releases binding handle resources and disconnects from the server
|
||||||
status = RpcBindingFree(&hSpyBinding);
|
status = RpcBindingFree(&hSpyBinding);
|
||||||
@ -42,7 +40,7 @@ RPC_STATUS RpcDisconnectServer()
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int __stdcall RpcSetTextMsgCb(void *p)
|
int RpcEnableReceiveMsg()
|
||||||
{
|
{
|
||||||
unsigned long ulCode = 0;
|
unsigned long ulCode = 0;
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
@ -53,7 +51,25 @@ unsigned int __stdcall RpcSetTextMsgCb(void *p)
|
|||||||
RpcExcept(1)
|
RpcExcept(1)
|
||||||
{
|
{
|
||||||
ulCode = RpcExceptionCode();
|
ulCode = RpcExceptionCode();
|
||||||
printf("rpcWxSetTextMsgCb exception 0x%lx = %ld\n", ulCode, ulCode);
|
printf("RpcEnableReceiveMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
||||||
|
}
|
||||||
|
RpcEndExcept;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RpcDisableReceiveMsg()
|
||||||
|
{
|
||||||
|
unsigned long ulCode = 0;
|
||||||
|
RpcTryExcept
|
||||||
|
{
|
||||||
|
// UnHook Message receiving
|
||||||
|
client_DisableReceiveMsg();
|
||||||
|
}
|
||||||
|
RpcExcept(1)
|
||||||
|
{
|
||||||
|
ulCode = RpcExceptionCode();
|
||||||
|
printf("RpcDisableReceiveMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
||||||
}
|
}
|
||||||
RpcEndExcept;
|
RpcEndExcept;
|
||||||
|
|
||||||
@ -72,7 +88,8 @@ int RpcIsLogin()
|
|||||||
RpcExcept(1)
|
RpcExcept(1)
|
||||||
{
|
{
|
||||||
ulCode = RpcExceptionCode();
|
ulCode = RpcExceptionCode();
|
||||||
printf("rpcIsLogin exception 0x%lx = %ld\n", ulCode, ulCode);
|
printf("RpcIsLogin exception 0x%lx = %ld\n", ulCode, ulCode);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
RpcEndExcept;
|
RpcEndExcept;
|
||||||
|
|
||||||
@ -88,7 +105,7 @@ int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *m
|
|||||||
RpcExcept(1)
|
RpcExcept(1)
|
||||||
{
|
{
|
||||||
ulCode = RpcExceptionCode();
|
ulCode = RpcExceptionCode();
|
||||||
printf("rpcWxSendTextMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
printf("RpcSendTextMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
||||||
}
|
}
|
||||||
RpcEndExcept;
|
RpcEndExcept;
|
||||||
|
|
||||||
@ -104,7 +121,7 @@ int RpcSendImageMsg(const wchar_t *wxid, const wchar_t *path)
|
|||||||
RpcExcept(1)
|
RpcExcept(1)
|
||||||
{
|
{
|
||||||
ulCode = RpcExceptionCode();
|
ulCode = RpcExceptionCode();
|
||||||
printf("rpcWxSendImageMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
printf("RpcSendImageMsg exception 0x%lx = %ld\n", ulCode, ulCode);
|
||||||
}
|
}
|
||||||
RpcEndExcept;
|
RpcEndExcept;
|
||||||
|
|
||||||
|
@ -5,7 +5,8 @@
|
|||||||
RPC_STATUS RpcConnectServer();
|
RPC_STATUS RpcConnectServer();
|
||||||
RPC_STATUS RpcDisconnectServer();
|
RPC_STATUS RpcDisconnectServer();
|
||||||
|
|
||||||
unsigned int __stdcall RpcSetTextMsgCb(void *p);
|
int RpcEnableReceiveMsg();
|
||||||
|
int RpcDisableReceiveMsg();
|
||||||
int RpcIsLogin();
|
int RpcIsLogin();
|
||||||
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg);
|
int RpcSendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg);
|
||||||
int RpcSendImageMsg(const wchar_t *wxid, const wchar_t *path);
|
int RpcSendImageMsg(const wchar_t *wxid, const wchar_t *path);
|
||||||
|
38
SDK/sdk.cpp
38
SDK/sdk.cpp
@ -19,7 +19,7 @@ static WCHAR SpyDllPath[MAX_PATH] = { 0 };
|
|||||||
|
|
||||||
int WxInitSDK()
|
int WxInitSDK()
|
||||||
{
|
{
|
||||||
DWORD status = 0;
|
int status = 0;
|
||||||
unsigned long ulCode = 0;
|
unsigned long ulCode = 0;
|
||||||
|
|
||||||
GetModuleFileName(GetModuleHandle(WECHATSDKDLL), SpyDllPath, MAX_PATH);
|
GetModuleFileName(GetModuleHandle(WECHATSDKDLL), SpyDllPath, MAX_PATH);
|
||||||
@ -34,35 +34,49 @@ int WxInitSDK()
|
|||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sleep(2000); // 等待微信打开
|
Sleep(2000); // 等待微信打开
|
||||||
if (InjectDll(WeChatPID, SpyDllPath)) {
|
if (InjectDll(WeChatPID, SpyDllPath)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
RpcConnectServer();
|
Sleep(1000); // 等待SPY就绪
|
||||||
|
status = RpcConnectServer();
|
||||||
while (!RpcIsLogin()) {
|
if (status != 0) {
|
||||||
Sleep(1000);
|
printf("RpcConnectServer: %d\n", status);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
status = RpcIsLogin();
|
||||||
|
if (status == -1) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
else if (status == 1) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Sleep(1000);
|
||||||
|
} while (1);
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WxDestroySDK()
|
int WxDestroySDK()
|
||||||
{
|
{
|
||||||
|
WxDisableRecvMsg();
|
||||||
RpcDisconnectServer();
|
RpcDisconnectServer();
|
||||||
EjectDll(WeChatPID, SpyDllPath);
|
// 关闭 RPC,但不卸载 DLL,方便下次使用。
|
||||||
|
//EjectDll(WeChatPID, SpyDllPath);
|
||||||
|
|
||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg)
|
int WxEnableRecvMsg(const std::function<int(WxMessage_t)> &onMsg)
|
||||||
{
|
{
|
||||||
if (onMsg) {
|
if (onMsg) {
|
||||||
HANDLE msgThread;
|
HANDLE msgThread;
|
||||||
g_cbReceiveTextMsg = onMsg;
|
g_cbReceiveTextMsg = onMsg;
|
||||||
|
msgThread = (HANDLE)CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcEnableReceiveMsg, NULL, 0, NULL);
|
||||||
msgThread = (HANDLE)_beginthreadex(NULL, 0, RpcSetTextMsgCb, NULL, 0, NULL);
|
|
||||||
if (msgThread == NULL) {
|
if (msgThread == NULL) {
|
||||||
printf("Failed to create innerWxRecvTextMsg.\n");
|
printf("Failed to create innerWxRecvTextMsg.\n");
|
||||||
return -2;
|
return -2;
|
||||||
@ -76,6 +90,12 @@ int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WxDisableRecvMsg()
|
||||||
|
{
|
||||||
|
RpcDisableReceiveMsg();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg)
|
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg)
|
||||||
{
|
{
|
||||||
return RpcSendTextMsg(wxid.c_str(), at_wxid.c_str(), msg.c_str());
|
return RpcSendTextMsg(wxid.c_str(), at_wxid.c_str(), msg.c_str());
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
EXPORTS
|
EXPORTS
|
||||||
WxInitSDK
|
WxInitSDK
|
||||||
WxDestroySDK
|
WxDestroySDK
|
||||||
WxSetTextMsgCb
|
WxEnableRecvMsg
|
||||||
|
WxDisableRecvMsg
|
||||||
WxSendTextMsg
|
WxSendTextMsg
|
||||||
WxGetMsgTypes
|
WxGetMsgTypes
|
||||||
WxSendImageMsg
|
WxSendImageMsg
|
||||||
|
@ -39,7 +39,8 @@ typedef vector<WxDbTable_t> DbTableVector_t;
|
|||||||
|
|
||||||
int WxInitSDK();
|
int WxInitSDK();
|
||||||
int WxDestroySDK();
|
int WxDestroySDK();
|
||||||
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg);
|
int WxEnableRecvMsg(const std::function<int(WxMessage_t)> &onMsg);
|
||||||
|
int WxDisableRecvMsg();
|
||||||
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg);
|
int WxSendTextMsg(wstring wxid, wstring at_wxid, wstring msg);
|
||||||
int WxSendImageMsg(wstring wxid, wstring path);
|
int WxSendImageMsg(wstring wxid, wstring path);
|
||||||
ContactMap_t WxGetContacts();
|
ContactMap_t WxGetContacts();
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace py = pybind11;
|
namespace py = pybind11;
|
||||||
|
|
||||||
int WxSetTextMsgCbPy(const std::function<int(WxMessage_t)> &onMsg) { return WxSetTextMsgCb(onMsg); }
|
int WxEnableRecvMsgPy(const std::function<int(WxMessage_t)> &onMsg) { return WxEnableRecvMsg(onMsg); }
|
||||||
|
|
||||||
PYBIND11_MODULE(wcferry, m)
|
PYBIND11_MODULE(wcferry, m)
|
||||||
{
|
{
|
||||||
@ -32,7 +32,8 @@ PYBIND11_MODULE(wcferry, m)
|
|||||||
.def_readonly("wxGender", &WxContact::wxGender);
|
.def_readonly("wxGender", &WxContact::wxGender);
|
||||||
|
|
||||||
m.def("WxInitSDK", &WxInitSDK);
|
m.def("WxInitSDK", &WxInitSDK);
|
||||||
m.def("WxSetTextMsgCb", &WxSetTextMsgCbPy);
|
m.def("WxEnableRecvMsg", &WxEnableRecvMsgPy);
|
||||||
|
m.def("WxDisableRecvMsg", &WxDisableRecvMsg);
|
||||||
m.def("WxSendTextMsg", &WxSendTextMsg);
|
m.def("WxSendTextMsg", &WxSendTextMsg);
|
||||||
m.def("WxSendImageMsg", &WxSendImageMsg);
|
m.def("WxSendImageMsg", &WxSendImageMsg);
|
||||||
m.def("WxGetContacts", &WxGetContacts, py::return_value_policy::reference);
|
m.def("WxGetContacts", &WxGetContacts, py::return_value_policy::reference);
|
||||||
|
@ -7,7 +7,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
|||||||
switch (ul_reason_for_call) {
|
switch (ul_reason_for_call) {
|
||||||
case DLL_PROCESS_ATTACH: {
|
case DLL_PROCESS_ATTACH: {
|
||||||
//MessageBox(NULL, L"InitSpy", L"DllMain", 0);
|
//MessageBox(NULL, L"InitSpy", L"DllMain", 0);
|
||||||
InitSpy(hModule);
|
InitSpy();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DLL_THREAD_ATTACH:
|
case DLL_THREAD_ATTACH:
|
||||||
@ -15,7 +15,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
|||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH: {
|
case DLL_PROCESS_DETACH: {
|
||||||
//MessageBox(NULL, L"DestroySpy", L"DllMain", 0);
|
//MessageBox(NULL, L"DestroySpy", L"DllMain", 0);
|
||||||
DestroySpy();
|
DestroySpy(hModule);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,7 @@ void server_EnableReceiveMsg()
|
|||||||
{
|
{
|
||||||
unsigned long ulCode = 0;
|
unsigned long ulCode = 0;
|
||||||
ListenMessage();
|
ListenMessage();
|
||||||
|
listenMsgFlag = true;
|
||||||
RpcTryExcept
|
RpcTryExcept
|
||||||
{
|
{
|
||||||
// 调用客户端的回调函数
|
// 调用客户端的回调函数
|
||||||
@ -49,6 +50,12 @@ void server_EnableReceiveMsg()
|
|||||||
RpcEndExcept
|
RpcEndExcept
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void server_DisableReceiveMsg()
|
||||||
|
{
|
||||||
|
UnListenMessage();
|
||||||
|
listenMsgFlag = false;
|
||||||
|
}
|
||||||
|
|
||||||
int server_SendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg)
|
int server_SendTextMsg(const wchar_t *wxid, const wchar_t *at_wxid, const wchar_t *msg)
|
||||||
{
|
{
|
||||||
SendTextMessage(wxid, at_wxid, msg);
|
SendTextMessage(wxid, at_wxid, msg);
|
||||||
@ -177,7 +184,7 @@ RPC_STATUS CALLBACK SecurityCallback(RPC_IF_HANDLE /*hInterface*/, void * /*pBin
|
|||||||
return RPC_S_OK; // Always allow anyone.
|
return RPC_S_OK; // Always allow anyone.
|
||||||
}
|
}
|
||||||
|
|
||||||
int RpcStartServer(HMODULE hModule)
|
int RpcStartServer()
|
||||||
{
|
{
|
||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
// Uses the protocol combined with the endpoint for receiving
|
// Uses the protocol combined with the endpoint for receiving
|
||||||
@ -201,7 +208,6 @@ int RpcStartServer(HMODULE hModule)
|
|||||||
(unsigned)-1, // Infinite max size of incoming data blocks.
|
(unsigned)-1, // Infinite max size of incoming data blocks.
|
||||||
SecurityCallback); // Naive security callback.
|
SecurityCallback); // Naive security callback.
|
||||||
|
|
||||||
listenMsgFlag = true;
|
|
||||||
while (g_rpcKeepAlive) {
|
while (g_rpcKeepAlive) {
|
||||||
Sleep(1000); // 休眠,释放CPU
|
Sleep(1000); // 休眠,释放CPU
|
||||||
}
|
}
|
||||||
@ -209,17 +215,18 @@ int RpcStartServer(HMODULE hModule)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RpcStopServer(void)
|
int RpcStopServer()
|
||||||
{
|
{
|
||||||
RPC_STATUS status;
|
RPC_STATUS status;
|
||||||
|
|
||||||
UnListenMessage();
|
UnListenMessage();
|
||||||
|
|
||||||
listenMsgFlag = false;
|
listenMsgFlag = false;
|
||||||
|
g_rpcKeepAlive = false;
|
||||||
status = RpcMgmtStopServerListening(NULL);
|
status = RpcMgmtStopServerListening(NULL);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
status = RpcServerUnregisterIf(NULL, NULL, FALSE);
|
status = RpcServerUnregisterIf(server_ISpy_v1_0_s_ifspec, NULL, 0);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "framework.h"
|
|
||||||
|
|
||||||
int RpcStartServer(HMODULE hModule);
|
int RpcStartServer();
|
||||||
int RpcStopServer(void);
|
int RpcStopServer();
|
||||||
|
16
Spy/spy.cpp
16
Spy/spy.cpp
@ -8,37 +8,37 @@ BOOL g_rpcKeepAlive = false;
|
|||||||
WxCalls_t g_WxCalls = { 0 };
|
WxCalls_t g_WxCalls = { 0 };
|
||||||
DWORD g_WeChatWinDllAddr = 0;
|
DWORD g_WeChatWinDllAddr = 0;
|
||||||
|
|
||||||
void InitSpy(HMODULE hModule)
|
void InitSpy()
|
||||||
{
|
{
|
||||||
wchar_t version[16] = { 0 };
|
wchar_t version[16] = { 0 };
|
||||||
|
|
||||||
g_WeChatWinDllAddr = (DWORD)LoadLibrary(L"WeChatWin.dll"); //获取wechatWin模块地址
|
g_WeChatWinDllAddr = (DWORD)GetModuleHandle(L"WeChatWin.dll"); //获取wechatWin模块地址
|
||||||
if (g_WeChatWinDllAddr == 0) {
|
if (g_WeChatWinDllAddr == 0) {
|
||||||
MessageBox(NULL, L"获取wechatWin.dll模块地址失败", L"错误", 0);
|
MessageBox(NULL, L"获取wechatWin.dll模块地址失败", L"错误", 0);
|
||||||
FreeLibraryAndExitThread(hModule, 0);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GetWeChatVersion(version)) { //获取微信版本
|
if (!GetWeChatVersion(version)) { //获取微信版本
|
||||||
MessageBox(NULL, L"获取微信版本失败", L"错误", 0);
|
MessageBox(NULL, L"获取微信版本失败", L"错误", 0);
|
||||||
FreeLibraryAndExitThread(hModule, 0);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LoadCalls(version, &g_WxCalls) != 0) { //加载微信版本对应的Call地址
|
if (LoadCalls(version, &g_WxCalls) != 0) { //加载微信版本对应的Call地址
|
||||||
MessageBox(NULL, L"不支持当前版本", L"错误", 0);
|
MessageBox(NULL, L"不支持当前版本", L"错误", 0);
|
||||||
FreeLibraryAndExitThread(hModule, 0);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
HANDLE rpcThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcStartServer, hModule, NULL, 0);
|
HANDLE rpcThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RpcStartServer, NULL, NULL, 0);
|
||||||
if (rpcThread != 0) {
|
if (rpcThread != 0) {
|
||||||
CloseHandle(rpcThread);
|
CloseHandle(rpcThread);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DestroySpy()
|
void DestroySpy(HMODULE hModule)
|
||||||
{
|
{
|
||||||
RpcStopServer();
|
RpcStopServer();
|
||||||
FreeLibrary((HMODULE)g_WeChatWinDllAddr);
|
FreeLibraryAndExitThread(hModule, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int IsLogin(void) { return (int)GET_DWORD(g_WeChatWinDllAddr + g_WxCalls.login); }
|
int IsLogin(void) { return (int)GET_DWORD(g_WeChatWinDllAddr + g_WxCalls.login); }
|
||||||
|
Loading…
Reference in New Issue
Block a user