Enable SDK Reentry
This commit is contained in:
parent
30853e5c25
commit
ab93568598
@ -1,9 +1,7 @@
|
|||||||
// dllmain.cpp : 定义 DLL 应用程序的入口点。
|
// dllmain.cpp : 定义 DLL 应用程序的入口点。
|
||||||
#include "framework.h"
|
#include "framework.h"
|
||||||
#include <rpc.h>
|
|
||||||
|
|
||||||
extern RPC_STATUS RpcConnectServer();
|
#include "sdk.h"
|
||||||
extern RPC_STATUS RpcDisconnectServer();
|
|
||||||
|
|
||||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||||
{
|
{
|
||||||
@ -13,7 +11,7 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
|||||||
case DLL_THREAD_DETACH:
|
case DLL_THREAD_DETACH:
|
||||||
break;
|
break;
|
||||||
case DLL_PROCESS_DETACH: {
|
case DLL_PROCESS_DETACH: {
|
||||||
RpcDisconnectServer();
|
WxDestroySDK(); // 默认退出时清理 SDK
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
SDK/sdk.cpp
27
SDK/sdk.cpp
@ -14,27 +14,28 @@
|
|||||||
|
|
||||||
std::function<int(WxMessage_t)> g_cbReceiveTextMsg;
|
std::function<int(WxMessage_t)> g_cbReceiveTextMsg;
|
||||||
|
|
||||||
|
static DWORD WeChatPID = 0;
|
||||||
|
static WCHAR SpyDllPath[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
int WxInitSDK()
|
int WxInitSDK()
|
||||||
{
|
{
|
||||||
unsigned long ulCode = 0;
|
|
||||||
DWORD status = 0;
|
DWORD status = 0;
|
||||||
DWORD pid = 0;
|
unsigned long ulCode = 0;
|
||||||
WCHAR DllPath[MAX_PATH] = { 0 };
|
|
||||||
|
|
||||||
GetModuleFileName(GetModuleHandle(WECHATSDKDLL), DllPath, MAX_PATH);
|
GetModuleFileName(GetModuleHandle(WECHATSDKDLL), SpyDllPath, MAX_PATH);
|
||||||
PathRemoveFileSpec(DllPath);
|
PathRemoveFileSpec(SpyDllPath);
|
||||||
PathAppend(DllPath, WECHATINJECTDLL);
|
PathAppend(SpyDllPath, WECHATINJECTDLL);
|
||||||
|
|
||||||
if (!PathFileExists(DllPath)) {
|
if (!PathFileExists(SpyDllPath)) {
|
||||||
return ERROR_FILE_NOT_FOUND;
|
return ERROR_FILE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
status = OpenWeChat(&pid);
|
status = OpenWeChat(&WeChatPID);
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
Sleep(2000); // 等待微信打开
|
Sleep(2000); // 等待微信打开
|
||||||
if (!InjectDll(pid, DllPath)) {
|
if (!InjectDll(WeChatPID, SpyDllPath)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -47,6 +48,14 @@ int WxInitSDK()
|
|||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int WxDestroySDK()
|
||||||
|
{
|
||||||
|
RpcDisconnectServer();
|
||||||
|
EnjectDll(WeChatPID, SpyDllPath);
|
||||||
|
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg)
|
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg)
|
||||||
{
|
{
|
||||||
if (onMsg) {
|
if (onMsg) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
EXPORTS
|
EXPORTS
|
||||||
WxInitSDK
|
WxInitSDK
|
||||||
|
WxDestroySDK
|
||||||
WxSetTextMsgCb
|
WxSetTextMsgCb
|
||||||
WxSendTextMsg
|
WxSendTextMsg
|
||||||
WxGetMsgTypes
|
WxGetMsgTypes
|
||||||
|
@ -38,6 +38,7 @@ typedef map<wstring, WxContact_t> ContactMap_t;
|
|||||||
typedef vector<WxDbTable_t> DbTableVector_t;
|
typedef vector<WxDbTable_t> DbTableVector_t;
|
||||||
|
|
||||||
int WxInitSDK();
|
int WxInitSDK();
|
||||||
|
int WxDestroySDK();
|
||||||
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg);
|
int WxSetTextMsgCb(const std::function<int(WxMessage_t)> &onMsg);
|
||||||
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);
|
||||||
|
61
SDK/util.cpp
61
SDK/util.cpp
@ -2,6 +2,7 @@
|
|||||||
#include "framework.h"
|
#include "framework.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strsafe.h>
|
#include <strsafe.h>
|
||||||
|
#include <tlhelp32.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
@ -11,12 +12,7 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
int GetWeChatPath(wchar_t *path);
|
static int GetWeChatPath(wchar_t *path)
|
||||||
int GetWeChatWinDLLPath(wchar_t *path);
|
|
||||||
int GetWeChatVersion(wchar_t *version);
|
|
||||||
bool GetFileVersion(const wchar_t *filePath, wchar_t *version);
|
|
||||||
|
|
||||||
int GetWeChatPath(wchar_t *path)
|
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
HKEY hKey = NULL;
|
HKEY hKey = NULL;
|
||||||
@ -45,7 +41,7 @@ __exit:
|
|||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetWeChatWinDLLPath(wchar_t *path)
|
static int GetWeChatWinDLLPath(wchar_t *path)
|
||||||
{
|
{
|
||||||
int ret = GetWeChatPath(path);
|
int ret = GetWeChatPath(path);
|
||||||
if (ret != ERROR_SUCCESS) {
|
if (ret != ERROR_SUCCESS) {
|
||||||
@ -71,21 +67,7 @@ int GetWeChatWinDLLPath(wchar_t *path)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetWeChatVersion(wchar_t *version)
|
static bool GetFileVersion(const wchar_t *filePath, wchar_t *version)
|
||||||
{
|
|
||||||
WCHAR Path[MAX_PATH] = { 0 };
|
|
||||||
|
|
||||||
int ret = GetWeChatWinDLLPath(Path);
|
|
||||||
if (ret != ERROR_SUCCESS) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = GetFileVersion(Path, version);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GetFileVersion(const wchar_t *filePath, wchar_t *version)
|
|
||||||
{
|
{
|
||||||
if (wcslen(filePath) > 0 && PathFileExists(filePath)) {
|
if (wcslen(filePath) > 0 && PathFileExists(filePath)) {
|
||||||
VS_FIXEDFILEINFO *pVerInfo = NULL;
|
VS_FIXEDFILEINFO *pVerInfo = NULL;
|
||||||
@ -129,8 +111,43 @@ bool GetFileVersion(const wchar_t *filePath, wchar_t *version)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetWeChatVersion(wchar_t *version)
|
||||||
|
{
|
||||||
|
WCHAR Path[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
|
int ret = GetWeChatWinDLLPath(Path);
|
||||||
|
if (ret != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = GetFileVersion(Path, version);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD GetWeChatPid()
|
||||||
|
{
|
||||||
|
DWORD pid = 0;
|
||||||
|
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||||
|
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
|
||||||
|
while (Process32Next(hSnapshot, &pe32)) {
|
||||||
|
wstring strProcess = pe32.szExeFile;
|
||||||
|
if (strProcess == WECHAREXE) {
|
||||||
|
pid = pe32.th32ProcessID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CloseHandle(hSnapshot);
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
int OpenWeChat(DWORD *pid)
|
int OpenWeChat(DWORD *pid)
|
||||||
{
|
{
|
||||||
|
*pid = GetWeChatPid();
|
||||||
|
if (*pid) {
|
||||||
|
return ERROR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
STARTUPINFO si = { sizeof(si) };
|
STARTUPINFO si = { sizeof(si) };
|
||||||
WCHAR Path[MAX_PATH] = { 0 };
|
WCHAR Path[MAX_PATH] = { 0 };
|
||||||
|
@ -15,10 +15,7 @@
|
|||||||
#define GET_WSTRING(addr) ((WCHAR *)(*(DWORD *)(addr)))
|
#define GET_WSTRING(addr) ((WCHAR *)(*(DWORD *)(addr)))
|
||||||
|
|
||||||
int OpenWeChat(DWORD *pid);
|
int OpenWeChat(DWORD *pid);
|
||||||
int GetWeChatPath(wchar_t *path);
|
|
||||||
int GetWeChatWinDLLPath(wchar_t *path);
|
|
||||||
int GetWeChatVersion(wchar_t *version);
|
int GetWeChatVersion(wchar_t *version);
|
||||||
bool GetFileVersion(const wchar_t *filePath, wchar_t *version);
|
|
||||||
int GetWstringByAddress(DWORD address, wchar_t *buffer, DWORD buffer_size);
|
int GetWstringByAddress(DWORD address, wchar_t *buffer, DWORD buffer_size);
|
||||||
BSTR GetBstrByAddress(DWORD address);
|
BSTR GetBstrByAddress(DWORD address);
|
||||||
void GetRpcMessage(WxMessage_t *wxMsg, RpcMessage_t rpcMsg);
|
void GetRpcMessage(WxMessage_t *wxMsg, RpcMessage_t rpcMsg);
|
||||||
|
@ -35,6 +35,10 @@ void InitSpy(HMODULE hModule)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DestroySpy() { RpcStopServer(); }
|
void DestroySpy()
|
||||||
|
{
|
||||||
|
RpcStopServer();
|
||||||
|
FreeLibrary((HMODULE)g_WeChatWinDllAddr);
|
||||||
|
}
|
||||||
|
|
||||||
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