提交 2369f900 编写于 作者: L ljc545w

修复COM只能获取一个数据库句柄

上级 042327af
#include "pch.h" #include "pch.h"
struct WxFriendAddrStruct { struct WxFriendAddrStruct
DWORD wxIdAddr; {
DWORD wxNumberAddr; DWORD wxIdAddr;
DWORD wxNickNameAddr; DWORD wxNumberAddr;
DWORD wxRemarkAddr; DWORD wxNickNameAddr;
DWORD wxRemarkAddr;
DWORD wxTypeAddr;
DWORD wxVerifyFlagAddr;
}; };
struct WxFriendStruct { struct WxFriendStruct
wchar_t* wxId; {
wchar_t* wxNumber; wchar_t *wxId;
wchar_t* wxNickName; wchar_t *wxNumber;
wchar_t* wxRemark; wchar_t *wxNickName;
wchar_t *wxRemark;
DWORD wxType;
DWORD wxVerifyFlag;
}; };
WxFriendStruct* WxFriendList; WxFriendStruct *WxFriendList;
void ReadFriendMessageByAddress(HANDLE hProcess,WxFriendAddrStruct* lpWxFriendAddr, WxFriendStruct* lpWxFriend) { void ReadFriendMessageByAddress(HANDLE hProcess, WxFriendAddrStruct *lpWxFriendAddr, WxFriendStruct *lpWxFriend)
DWORD length = 0; {
DWORD bufferaddr = 0; DWORD length = 0;
DWORD bufferaddr = 0;
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxIdAddr + 0x4), &length, sizeof(DWORD), 0); ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxIdAddr + 0x4), &length, sizeof(DWORD), 0);
if (length) { if (length)
lpWxFriend->wxId = new wchar_t[length + 1];//(wchar_t*)malloc(sizeof(wchar_t) * (length + 1)); {
if (lpWxFriend->wxId) lpWxFriend->wxId = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1));
{ if (lpWxFriend->wxId)
ZeroMemory(lpWxFriend->wxId, sizeof(wchar_t) * (length + 1)); {
ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxIdAddr, &bufferaddr, sizeof(DWORD), 0); ZeroMemory(lpWxFriend->wxId, sizeof(wchar_t) * (length + 1));
ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxId, length * sizeof(wchar_t), 0); ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxIdAddr, &bufferaddr, sizeof(DWORD), 0);
} ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxId, length * sizeof(wchar_t), 0);
} }
else { }
lpWxFriend->wxId = L"null"; else
} {
lpWxFriend->wxId = L"null";
}
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxNumberAddr + 0x4), &length, sizeof(DWORD), 0); ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxNumberAddr + 0x4), &length, sizeof(DWORD), 0);
if (length) { if (length)
lpWxFriend->wxNumber = new wchar_t[length + 1];//(wchar_t*)malloc(sizeof(wchar_t) * (length + 1)); {
if (lpWxFriend->wxNumber) lpWxFriend->wxNumber = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1));
{ if (lpWxFriend->wxNumber)
ZeroMemory(lpWxFriend->wxNumber, sizeof(wchar_t) * (length + 1)); {
ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxNumberAddr, &bufferaddr, sizeof(DWORD), 0); ZeroMemory(lpWxFriend->wxNumber, sizeof(wchar_t) * (length + 1));
ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxNumber, length * sizeof(wchar_t), 0); ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxNumberAddr, &bufferaddr, sizeof(DWORD), 0);
} ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxNumber, length * sizeof(wchar_t), 0);
} }
else { }
lpWxFriend->wxNumber = L"null"; else
} {
lpWxFriend->wxNumber = L"null";
}
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxNickNameAddr + 0x4), &length, sizeof(DWORD), 0); ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxNickNameAddr + 0x4), &length, sizeof(DWORD), 0);
if (length) { if (length)
lpWxFriend->wxNickName = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1)); {
if (lpWxFriend->wxNickName) lpWxFriend->wxNickName = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1));
{ if (lpWxFriend->wxNickName)
ZeroMemory(lpWxFriend->wxNickName, sizeof(wchar_t) * (length + 1)); {
ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxNickNameAddr, &bufferaddr, sizeof(DWORD), 0); ZeroMemory(lpWxFriend->wxNickName, sizeof(wchar_t) * (length + 1));
ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxNickName, length * sizeof(wchar_t), 0); ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxNickNameAddr, &bufferaddr, sizeof(DWORD), 0);
} ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxNickName, length * sizeof(wchar_t), 0);
} }
else { }
lpWxFriend->wxNickName = L"null"; else
} {
lpWxFriend->wxNickName = L"null";
}
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxRemarkAddr + 0x4), &length, sizeof(DWORD), 0); ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxRemarkAddr + 0x4), &length, sizeof(DWORD), 0);
if (length) { if (length)
lpWxFriend->wxRemark = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1)); {
if (lpWxFriend->wxRemark) lpWxFriend->wxRemark = new wchar_t[length + 1]; //(wchar_t*)malloc(sizeof(wchar_t) * (length + 1));
{ if (lpWxFriend->wxRemark)
ZeroMemory(lpWxFriend->wxRemark, sizeof(wchar_t) * (length + 1)); {
ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxRemarkAddr, &bufferaddr, sizeof(DWORD), 0); ZeroMemory(lpWxFriend->wxRemark, sizeof(wchar_t) * (length + 1));
ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxRemark, length * sizeof(wchar_t), 0); ReadProcessMemory(hProcess, (LPCVOID)lpWxFriendAddr->wxRemarkAddr, &bufferaddr, sizeof(DWORD), 0);
} ReadProcessMemory(hProcess, (LPCVOID)bufferaddr, lpWxFriend->wxRemark, length * sizeof(wchar_t), 0);
} }
else { }
lpWxFriend->wxRemark = L"null"; else
} {
lpWxFriend->wxRemark = L"null";
}
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxTypeAddr), &lpWxFriend->wxType, sizeof(DWORD), 0);
ReadProcessMemory(hProcess, (LPCVOID)(lpWxFriendAddr->wxVerifyFlagAddr), &lpWxFriend->wxVerifyFlag, sizeof(DWORD), 0);
} }
void FreeWxFriend(int index) { void FreeWxFriend(int index)
delete[] WxFriendList[index].wxId; {
WxFriendList[index].wxId = NULL; delete[] WxFriendList[index].wxId;
if (StrCmpW(WxFriendList[index].wxNumber, L"null") != 0) { WxFriendList[index].wxId = NULL;
delete[] WxFriendList[index].wxNumber; if (StrCmpW(WxFriendList[index].wxNumber, L"null") != 0)
WxFriendList[index].wxNumber = NULL; {
}; delete[] WxFriendList[index].wxNumber;
if (StrCmpW(WxFriendList[index].wxNickName, L"null") != 0) { WxFriendList[index].wxNumber = NULL;
delete[] WxFriendList[index].wxNickName; };
WxFriendList[index].wxNickName = NULL; if (StrCmpW(WxFriendList[index].wxNickName, L"null") != 0)
}; {
if (StrCmpW(WxFriendList[index].wxRemark, L"null") != 0) { delete[] WxFriendList[index].wxNickName;
delete[] WxFriendList[index].wxRemark; WxFriendList[index].wxNickName = NULL;
WxFriendList[index].wxRemark = NULL; };
}; if (StrCmpW(WxFriendList[index].wxRemark, L"null") != 0)
{
delete[] WxFriendList[index].wxRemark;
WxFriendList[index].wxRemark = NULL;
};
} }
SAFEARRAY* CreateFriendArray(int FriendCount) { SAFEARRAY *CreateFriendArray(int FriendCount)
HRESULT hr = S_OK; {
SAFEARRAY* psaValue; HRESULT hr = S_OK;
vector<wstring> FriendInfoKey = { SAFEARRAY *psaValue;
L"wxid", vector<wstring> FriendInfoKey = {
L"wxNumber", L"wxid",
L"wxNickName", L"wxNumber",
L"wxRemark", L"wxNickName",
}; L"wxRemark",
SAFEARRAYBOUND rgsaBound[3] = { {(ULONG)FriendCount,0},{FriendInfoKey.size(),0},{2,0} }; L"wxType",
psaValue = SafeArrayCreate(VT_VARIANT, 3, rgsaBound); L"wxVerifyFlag",
for (long x = 0; x < FriendCount; x++) { };
vector<wstring> FriendInfoValue = { WxFriendList[x].wxId,WxFriendList[x].wxNumber,WxFriendList[x].wxNickName,WxFriendList[x].wxRemark }; SAFEARRAYBOUND rgsaBound[3] = {{(ULONG)FriendCount, 0}, {FriendInfoKey.size(), 0}, {2, 0}};
for (unsigned long i = 0; i < FriendInfoKey.size(); i++) psaValue = SafeArrayCreate(VT_VARIANT, 3, rgsaBound);
{ for (long x = 0; x < FriendCount; x++)
long keyIndex[3] = { x,(long)i,0 }; {
hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)FriendInfoKey[i].c_str()); long keyIndex[3] = {x, 0, 0}, valueIndex[3] = {x, 0, 1};
long valueIndex[3] = { x,(long)i,1 }; vector<wstring> FriendInfoValue = {WxFriendList[x].wxId, WxFriendList[x].wxNumber, WxFriendList[x].wxNickName, WxFriendList[x].wxRemark};
hr = SafeArrayPutElement(psaValue, valueIndex, &(_variant_t)FriendInfoValue[i].c_str()); for (unsigned long i = 0; i < FriendInfoValue.size(); i++)
} {
FriendInfoValue.clear(); keyIndex[1] = i;
} valueIndex[1] = i;
return psaValue; hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)FriendInfoKey[i].c_str());
hr = SafeArrayPutElement(psaValue, valueIndex, &(_variant_t)FriendInfoValue[i].c_str());
}
keyIndex[1] = 4;
valueIndex[1] = 4;
hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)FriendInfoKey[4].c_str());
hr = SafeArrayPutElement(psaValue, valueIndex, &(_variant_t)WxFriendList[x].wxType);
keyIndex[1] = 5;
valueIndex[1] = 5;
hr = SafeArrayPutElement(psaValue, keyIndex, &(_variant_t)FriendInfoKey[5].c_str());
hr = SafeArrayPutElement(psaValue, valueIndex, &(_variant_t)WxFriendList[x].wxVerifyFlag);
FriendInfoValue.clear();
}
return psaValue;
} }
SAFEARRAY* GetFriendList(DWORD pid) { SAFEARRAY *GetFriendList(DWORD pid)
WeChatProcess hp(pid); {
if (!hp.m_init) return NULL; WeChatProcess hp(pid);
DWORD GetFriendListInitAddr = hp.GetProcAddr(GetFriendListInit); if (!hp.m_init)
DWORD GetFriendListRemoteAddr = hp.GetProcAddr(GetFriendListRemote); return NULL;
DWORD GetFriendListFinishAddr = hp.GetProcAddr(GetFriendListFinish); DWORD GetFriendListInitAddr = hp.GetProcAddr(GetFriendListInit);
if (GetFriendListInitAddr == 0 || GetFriendListRemoteAddr == 0 || GetFriendListFinishAddr == 0) DWORD GetFriendListRemoteAddr = hp.GetProcAddr(GetFriendListRemote);
return NULL; DWORD GetFriendListFinishAddr = hp.GetProcAddr(GetFriendListFinish);
DWORD FriendCount = 0; if (GetFriendListInitAddr == 0 || GetFriendListRemoteAddr == 0 || GetFriendListFinishAddr == 0)
DWORD dwHandle = 0; return NULL;
// 获取好友列表的长度 DWORD FriendCount = 0;
FriendCount = CallRemoteFunction(hp.GetHandle(), GetFriendListInitAddr, NULL); DWORD dwHandle = 0;
// 获取保存第一个好友的数据指针的结构体首地址 // 获取好友列表的长度
dwHandle = CallRemoteFunction(hp.GetHandle(), GetFriendListRemoteAddr, NULL); FriendCount = CallRemoteFunction(hp.GetHandle(), GetFriendListInitAddr, NULL);
// 获取保存第一个好友的数据指针的结构体首地址
dwHandle = CallRemoteFunction(hp.GetHandle(), GetFriendListRemoteAddr, NULL);
WxFriendAddrStruct WxFriendAddr = { 0 }; WxFriendAddrStruct WxFriendAddr = {0};
// 根据好友数量初始化全局变量 // 根据好友数量初始化全局变量
WxFriendList = new WxFriendStruct[FriendCount]; WxFriendList = new WxFriendStruct[FriendCount];
if (dwHandle == 0) if (dwHandle == 0)
return NULL; return NULL;
for (unsigned int i = 0; i < FriendCount; i++) { for (unsigned int i = 0; i < FriendCount; i++)
WxFriendList[i] = { 0 }; {
ZeroMemory(&WxFriendAddr, sizeof(WxFriendAddrStruct)); WxFriendList[i] = {0};
ReadProcessMemory(hp.GetHandle(), (LPCVOID)dwHandle, &WxFriendAddr, sizeof(WxFriendAddrStruct), 0); ZeroMemory(&WxFriendAddr, sizeof(WxFriendAddrStruct));
ReadFriendMessageByAddress(hp.GetHandle(),&WxFriendAddr, &WxFriendList[i]); ReadProcessMemory(hp.GetHandle(), (LPCVOID)dwHandle, &WxFriendAddr, sizeof(WxFriendAddrStruct), 0);
// 保存下一个好友数据的结构体 ReadFriendMessageByAddress(hp.GetHandle(), &WxFriendAddr, &WxFriendList[i]);
dwHandle += sizeof(WxFriendAddrStruct); // 保存下一个好友数据的结构体
} dwHandle += sizeof(WxFriendAddrStruct);
// 清除微信进程空间中的缓存 }
CallRemoteFunction(hp.GetHandle(), GetFriendListFinishAddr, NULL); // 清除微信进程空间中的缓存
SAFEARRAY* psaValue = CreateFriendArray(FriendCount); CallRemoteFunction(hp.GetHandle(), GetFriendListFinishAddr, NULL);
for (unsigned int i = 0; i < FriendCount; i++) { SAFEARRAY *psaValue = CreateFriendArray(FriendCount);
FreeWxFriend(i); for (unsigned int i = 0; i < FriendCount; i++)
} {
delete[] WxFriendList; FreeWxFriend(i);
WxFriendList = NULL; }
return psaValue; delete[] WxFriendList;
WxFriendList = NULL;
return psaValue;
} }
std::wstring GetFriendListString(DWORD pid) { std::wstring GetFriendListString(DWORD pid)
WeChatProcess hp(pid); {
if (!hp.m_init) return L"[]"; WeChatProcess hp(pid);
DWORD GetFriendListInitAddr = hp.GetProcAddr(GetFriendListInit); if (!hp.m_init)
DWORD GetFriendListRemoteAddr = hp.GetProcAddr(GetFriendListRemote); return L"[]";
DWORD GetFriendListFinishAddr = hp.GetProcAddr(GetFriendListFinish); DWORD GetFriendListInitAddr = hp.GetProcAddr(GetFriendListInit);
DWORD FriendCount = 0; DWORD GetFriendListRemoteAddr = hp.GetProcAddr(GetFriendListRemote);
DWORD dwHandle = 0; DWORD GetFriendListFinishAddr = hp.GetProcAddr(GetFriendListFinish);
// 获取好友列表的长度 DWORD FriendCount = 0;
FriendCount = CallRemoteFunction(hp.GetHandle(), GetFriendListInitAddr, NULL); DWORD dwHandle = 0;
// 获取保存第一个好友的数据指针的结构体首地址 // 获取好友列表的长度
dwHandle = CallRemoteFunction(hp.GetHandle(), GetFriendListRemoteAddr, NULL); FriendCount = CallRemoteFunction(hp.GetHandle(), GetFriendListInitAddr, NULL);
// 获取保存第一个好友的数据指针的结构体首地址
WxFriendAddrStruct WxFriendAddr = { 0 }; dwHandle = CallRemoteFunction(hp.GetHandle(), GetFriendListRemoteAddr, NULL);
// 根据好友数量初始化全局变量
WxFriendList = new WxFriendStruct[FriendCount]; WxFriendAddrStruct WxFriendAddr = {0};
if (dwHandle == 0) // 根据好友数量初始化全局变量
return L"[]"; WxFriendList = new WxFriendStruct[FriendCount];
for (unsigned int i = 0; i < FriendCount; i++) { if (dwHandle == 0)
WxFriendList[i] = { 0 }; return L"[]";
ZeroMemory(&WxFriendAddr, sizeof(WxFriendAddrStruct)); for (unsigned int i = 0; i < FriendCount; i++)
ReadProcessMemory(hp.GetHandle(), (LPCVOID)dwHandle, &WxFriendAddr, sizeof(WxFriendAddrStruct), 0); {
ReadFriendMessageByAddress(hp.GetHandle(),&WxFriendAddr, &WxFriendList[i]); WxFriendList[i] = {0};
// 保存下一个好友数据的结构体 ZeroMemory(&WxFriendAddr, sizeof(WxFriendAddrStruct));
dwHandle += sizeof(WxFriendAddrStruct); ReadProcessMemory(hp.GetHandle(), (LPCVOID)dwHandle, &WxFriendAddr, sizeof(WxFriendAddrStruct), 0);
} ReadFriendMessageByAddress(hp.GetHandle(), &WxFriendAddr, &WxFriendList[i]);
// 清除微信进程空间中的缓存 // 保存下一个好友数据的结构体
CallRemoteFunction(hp.GetHandle(), GetFriendListFinishAddr, NULL); dwHandle += sizeof(WxFriendAddrStruct);
}
wstring message = L"["; // 清除微信进程空间中的缓存
// 构造结构化的数据 CallRemoteFunction(hp.GetHandle(), GetFriendListFinishAddr, NULL);
for (unsigned int i = 0; i < FriendCount; i++) {
message = message + L"{\"wxid\":\"" + WxFriendList[i].wxId + L"\","; wstring message = L"[";
message = message + L"\"wxNumber\":\"" + WxFriendList[i].wxNumber + L"\","; // 构造结构化的数据
message = message + L"\"wxNickName\":\"" + WxFriendList[i].wxNickName + L"\","; for (unsigned int i = 0; i < FriendCount; i++)
message = message + L"\"wxRemark\":\"" + WxFriendList[i].wxRemark + L"\"}"; {
if(i != FriendCount - 1) message = message + L"{\"wxid\":\"" + WxFriendList[i].wxId + L"\",";
message = message + L","; message = message + L"\"wxNumber\":\"" + WxFriendList[i].wxNumber + L"\",";
FreeWxFriend(i); message = message + L"\"wxNickName\":\"" + WxFriendList[i].wxNickName + L"\",";
} message = message + L"\"wxRemark\":\"" + WxFriendList[i].wxRemark + L"\"}";
message = message + L"]"; if (i != FriendCount - 1)
// 释放全局变量 message = message + L",";
delete[] WxFriendList; FreeWxFriend(i);
WxFriendList = NULL; }
return message; message = message + L"]";
} // 释放全局变量
\ No newline at end of file delete[] WxFriendList;
WxFriendList = NULL;
return message;
}
#include "pch.h" #include "pch.h"
struct TableInfoAddrStruct { struct TableInfoAddrStruct
{
DWORD name; DWORD name;
DWORD l_name; DWORD l_name;
DWORD tbl_name; DWORD tbl_name;
...@@ -11,7 +12,8 @@ struct TableInfoAddrStruct { ...@@ -11,7 +12,8 @@ struct TableInfoAddrStruct {
DWORD l_rootpage; DWORD l_rootpage;
}; };
struct DbInfoAddrStruct { struct DbInfoAddrStruct
{
DWORD handle; DWORD handle;
DWORD dbname; DWORD dbname;
DWORD l_dbname; DWORD l_dbname;
...@@ -24,60 +26,79 @@ struct DbInfoAddrStruct { ...@@ -24,60 +26,79 @@ struct DbInfoAddrStruct {
DWORD v_end2; DWORD v_end2;
// //
DWORD count; DWORD count;
DWORD extrainfo;
}; };
struct TableInfoStruct { struct TableInfoStruct
char* name; {
char* tbl_name; char *name;
char* sql; char *tbl_name;
char* rootpage; char *sql;
char *rootpage;
}; };
struct DbInfoStruct { struct DbInfoStruct
{
DWORD handle; DWORD handle;
wchar_t* dbname; wchar_t *dbname;
vector<TableInfoStruct> tables; vector<TableInfoStruct> tables;
DWORD count; DWORD count;
}; };
vector<DbInfoStruct> dbs; vector<DbInfoStruct> dbs;
SAFEARRAY* CreateDbInfoSafeArray() { SAFEARRAY *CreateDbInfoSafeArray()
SAFEARRAY* psaValue; {
SAFEARRAY *psaValue;
ULONG count = 0; ULONG count = 0;
HRESULT hr = S_OK; HRESULT hr = S_OK;
for (unsigned int i = 0; i < dbs.size(); i++) { for (unsigned int i = 0; i < dbs.size(); i++)
{
count += dbs[i].count; count += dbs[i].count;
} }
SAFEARRAYBOUND rgsaBound[3] = { {count,0},{6,0},{2,0} }; SAFEARRAYBOUND rgsaBound[3] = {{count, 0}, {6, 0}, {2, 0}};
psaValue = SafeArrayCreate(VT_VARIANT, 3, rgsaBound); psaValue = SafeArrayCreate(VT_VARIANT, 3, rgsaBound);
long index = 0; long index = 0;
for (unsigned int i = 0; i < dbs.size(); i++) { for (unsigned int i = 0; i < dbs.size(); i++)
for (unsigned int j = 0; j < dbs[i].tables.size(); j++) { {
LONG ArrayIndex[3] = { index,0,0 }; for (unsigned int j = 0; j < dbs[i].tables.size(); j++)
ArrayIndex[1] = 0; ArrayIndex[2] = { 0 }; {
LONG ArrayIndex[3] = {index, 0, 0};
ArrayIndex[1] = 0;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"dbname"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"dbname");
ArrayIndex[1] = 0; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 0;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].dbname); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].dbname);
ArrayIndex[1] = 1; ArrayIndex[2] = { 0 }; ArrayIndex[1] = 1;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"Handle"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"Handle");
ArrayIndex[1] = 1; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 1;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].handle); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].handle);
ArrayIndex[1] = 2; ArrayIndex[2] = { 0 }; ArrayIndex[1] = 2;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"name"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"name");
ArrayIndex[1] = 2; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 2;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].name); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].name);
ArrayIndex[1] = 3; ArrayIndex[2] = { 0 }; ArrayIndex[1] = 3;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"tbl_name"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"tbl_name");
ArrayIndex[1] = 3; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 3;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].tbl_name); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].tbl_name);
ArrayIndex[1] = 4; ArrayIndex[2] = { 0 }; ArrayIndex[1] = 4;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"rootpage"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"rootpage");
ArrayIndex[1] = 4; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 4;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].rootpage); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].rootpage);
ArrayIndex[1] = 5; ArrayIndex[2] = { 0 }; ArrayIndex[1] = 5;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"sql"); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"sql");
ArrayIndex[1] = 5; ArrayIndex[2] = { 1 }; ArrayIndex[1] = 5;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].sql); hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].tables[j].sql);
index++; index++;
} }
...@@ -85,28 +106,32 @@ SAFEARRAY* CreateDbInfoSafeArray() { ...@@ -85,28 +106,32 @@ SAFEARRAY* CreateDbInfoSafeArray() {
return psaValue; return psaValue;
} }
SAFEARRAY* GetDbHandles(DWORD pid) { SAFEARRAY *GetDbHandles(DWORD pid)
{
dbs.clear(); dbs.clear();
WeChatProcess hp(pid); WeChatProcess hp(pid);
if (!hp.m_init) return NULL; if (!hp.m_init)
return NULL;
DWORD GetDbHandlesRemoteAddr = hp.GetProcAddr(GetDbHandlesRemote); DWORD GetDbHandlesRemoteAddr = hp.GetProcAddr(GetDbHandlesRemote);
if (GetDbHandlesRemoteAddr == 0) if (GetDbHandlesRemoteAddr == 0)
return NULL; return NULL;
DWORD ret = CallRemoteFunction(hp.GetHandle(), GetDbHandlesRemoteAddr, NULL); DWORD ret = CallRemoteFunction(hp.GetHandle(), GetDbHandlesRemoteAddr, NULL);
while (1) { while (1)
DbInfoAddrStruct dbaddr = { 0 }; {
DbInfoAddrStruct dbaddr = {0};
ReadProcessMemory(hp.GetHandle(), (LPCVOID)ret, &dbaddr, sizeof(DbInfoAddrStruct), 0); ReadProcessMemory(hp.GetHandle(), (LPCVOID)ret, &dbaddr, sizeof(DbInfoAddrStruct), 0);
if (dbaddr.handle == 0) if (dbaddr.handle == 0)
break; break;
DbInfoStruct db = { 0 }; DbInfoStruct db = {0};
db.handle = dbaddr.handle; db.handle = dbaddr.handle;
db.count = dbaddr.count; db.count = dbaddr.count;
db.dbname = new wchar_t[dbaddr.l_dbname + 1]; db.dbname = new wchar_t[dbaddr.l_dbname + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)dbaddr.dbname, db.dbname, sizeof(wchar_t) * (dbaddr.l_dbname + 1), 0); ReadProcessMemory(hp.GetHandle(), (LPCVOID)dbaddr.dbname, db.dbname, sizeof(wchar_t) * (dbaddr.l_dbname + 1), 0);
DWORD db_table_start_addr = dbaddr.v_data; DWORD db_table_start_addr = dbaddr.v_data;
while (db_table_start_addr < dbaddr.v_end1) { while (db_table_start_addr < dbaddr.v_end1)
TableInfoAddrStruct tbaddr = { 0 }; {
TableInfoStruct tb = { 0 }; TableInfoAddrStruct tbaddr = {0};
TableInfoStruct tb = {0};
ReadProcessMemory(hp.GetHandle(), (LPCVOID)db_table_start_addr, &tbaddr, sizeof(TableInfoAddrStruct), 0); ReadProcessMemory(hp.GetHandle(), (LPCVOID)db_table_start_addr, &tbaddr, sizeof(TableInfoAddrStruct), 0);
tb.name = new char[tbaddr.l_name + 1]; tb.name = new char[tbaddr.l_name + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.name, tb.name, tbaddr.l_name + 1, 0); ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.name, tb.name, tbaddr.l_name + 1, 0);
...@@ -122,6 +147,6 @@ SAFEARRAY* GetDbHandles(DWORD pid) { ...@@ -122,6 +147,6 @@ SAFEARRAY* GetDbHandles(DWORD pid) {
dbs.push_back(db); dbs.push_back(db);
ret += sizeof(DbInfoAddrStruct); ret += sizeof(DbInfoAddrStruct);
} }
SAFEARRAY* psaValue = CreateDbInfoSafeArray(); SAFEARRAY *psaValue = CreateDbInfoSafeArray();
return psaValue; return psaValue;
} }
\ No newline at end of file
...@@ -9,9 +9,9 @@ vector<WxFriendStruct> WxFriendList; ...@@ -9,9 +9,9 @@ vector<WxFriendStruct> WxFriendList;
#ifndef USE_SOCKET #ifndef USE_SOCKET
/* /*
* 供外部调用的获取好友列表接口1 * 供外部调用的获取好友列表接口1
* return:int,联系人数量 * return:int,联系人数量
*/ */
int GetFriendListInit() int GetFriendListInit()
{ {
GetFriendList(); GetFriendList();
...@@ -22,9 +22,9 @@ int GetFriendListInit() ...@@ -22,9 +22,9 @@ int GetFriendListInit()
} }
/* /*
* 供外部调用的获取好友列表接口2 * 供外部调用的获取好友列表接口2
* return:DWORD,WxFriendList第一个成员地址 * return:DWORD,WxFriendList第一个成员地址
*/ */
DWORD GetFriendListRemote() DWORD GetFriendListRemote()
{ {
if (WxFriendList.size() == 0 || WxFriendList.size() - 1 == 0) if (WxFriendList.size() == 0 || WxFriendList.size() - 1 == 0)
...@@ -37,9 +37,9 @@ DWORD GetFriendListRemote() ...@@ -37,9 +37,9 @@ DWORD GetFriendListRemote()
} }
/* /*
* 供外部调用的获取好友列表接口3,清空缓存 * 供外部调用的获取好友列表接口3,清空缓存
* return:void * return:void
*/ */
void GetFriendListFinish() void GetFriendListFinish()
{ {
WxFriendList.clear(); WxFriendList.clear();
...@@ -54,9 +54,9 @@ vector<WxFriendStruct> GetWxContact() ...@@ -54,9 +54,9 @@ vector<WxFriendStruct> GetWxContact()
} }
#endif #endif
/* /*
* 获取好友列表的具体实现 * 获取好友列表的具体实现
* return:void * return:void
*/ */
WxFriendStruct *__stdcall GetFriendList() WxFriendStruct *__stdcall GetFriendList()
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -86,6 +86,8 @@ WxFriendStruct *__stdcall GetFriendList() ...@@ -86,6 +86,8 @@ WxFriendStruct *__stdcall GetFriendList()
DWORD wxNumberAddr = 0; DWORD wxNumberAddr = 0;
DWORD wxNickNameAddr = 0; DWORD wxNickNameAddr = 0;
DWORD wxRemarkAddr = 0; DWORD wxRemarkAddr = 0;
DWORD wxTypeAddr = 0;
DWORD wxVerifyFlagAddr = 0;
__asm { __asm {
pushad; pushad;
...@@ -102,11 +104,17 @@ WxFriendStruct *__stdcall GetFriendList() ...@@ -102,11 +104,17 @@ WxFriendStruct *__stdcall GetFriendList()
mov ecx, eax; mov ecx, eax;
add ecx, 0x78; add ecx, 0x78;
mov wxRemarkAddr, ecx; mov wxRemarkAddr, ecx;
mov ecx, eax;
add ecx, 0x70;
mov wxTypeAddr,ecx;
mov ecx, eax;
add ecx, 0x74;
mov wxVerifyFlagAddr,ecx;
mov ecx, dword ptr [eax]; mov ecx, dword ptr [eax];
mov LeftTreeAddr, ecx; mov LeftTreeAddr, ecx;
popad; popad;
} }
WxFriendStruct p(wxIdAddr, wxNumberAddr, wxNickNameAddr, wxRemarkAddr); WxFriendStruct p(wxIdAddr, wxNumberAddr, wxNickNameAddr, wxRemarkAddr, wxTypeAddr, wxVerifyFlagAddr);
WxFriendList.push_back(p); WxFriendList.push_back(p);
#ifdef _DEBUG #ifdef _DEBUG
wcout << (wchar_t *)(*(DWORD *)p.wxIdAddr) << endl; wcout << (wchar_t *)(*(DWORD *)p.wxIdAddr) << endl;
...@@ -116,7 +124,7 @@ WxFriendStruct *__stdcall GetFriendList() ...@@ -116,7 +124,7 @@ WxFriendStruct *__stdcall GetFriendList()
break; break;
} }
} }
WxFriendStruct nullp(NULL, NULL, NULL, NULL); WxFriendStruct nullp(NULL, NULL, NULL, NULL, NULL, NULL);
WxFriendList.push_back(nullp); WxFriendList.push_back(nullp);
return WxFriendList.data(); return WxFriendList.data();
} }
...@@ -121,10 +121,8 @@ BOOL __stdcall SendFile(wchar_t *receiver, wchar_t *FilePath) ...@@ -121,10 +121,8 @@ BOOL __stdcall SendFile(wchar_t *receiver, wchar_t *FilePath)
mov al,byte ptr [eax + 0x38]; mov al,byte ptr [eax + 0x38];
movzx eax,al; movzx eax,al;
mov isSuccess,eax; mov isSuccess,eax;
// push 200; lea ecx, buffer;
// call Sleep; call DeleteSendFileCacheCall;
// lea ecx, buffer;
// call DeleteSendFileCacheCall;
popfd; popfd;
popad; popad;
} }
......
...@@ -169,12 +169,18 @@ struct WxFriendStruct ...@@ -169,12 +169,18 @@ struct WxFriendStruct
DWORD wxNumberAddr; DWORD wxNumberAddr;
DWORD wxNickNameAddr; DWORD wxNickNameAddr;
DWORD wxRemarkAddr; DWORD wxRemarkAddr;
WxFriendStruct(DWORD wxIdAddr, DWORD wxNumberAddr, DWORD wxNickNameAddr, DWORD wxRemarkAddr) DWORD wxTypeAddr;
DWORD wxVerifyFlagAddr;
WxFriendStruct(DWORD wxIdAddr, DWORD wxNumberAddr,
DWORD wxNickNameAddr, DWORD wxRemarkAddr,
DWORD wxTypeAddr, DWORD wxVerfifyFlagAddr)
{ {
this->wxIdAddr = wxIdAddr; this->wxIdAddr = wxIdAddr;
this->wxNumberAddr = wxNumberAddr; this->wxNumberAddr = wxNumberAddr;
this->wxNickNameAddr = wxNickNameAddr; this->wxNickNameAddr = wxNickNameAddr;
this->wxRemarkAddr = wxRemarkAddr; this->wxRemarkAddr = wxRemarkAddr;
this->wxTypeAddr = wxTypeAddr;
this->wxVerifyFlagAddr = wxVerfifyFlagAddr;
} }
}; };
......
...@@ -321,6 +321,8 @@ void request_event(mg_http_message *hm, string &ret, struct mg_connection *c) ...@@ -321,6 +321,8 @@ void request_event(mg_http_message *hm, string &ret, struct mg_connection *c)
f_j["wxNumber"] = unicode_to_utf8(WS2LW(wxNumber)); f_j["wxNumber"] = unicode_to_utf8(WS2LW(wxNumber));
f_j["wxNickName"] = unicode_to_utf8(WS2LW(wxNickName)); f_j["wxNickName"] = unicode_to_utf8(WS2LW(wxNickName));
f_j["wxRemark"] = unicode_to_utf8(WS2LW(wxRemark)); f_j["wxRemark"] = unicode_to_utf8(WS2LW(wxRemark));
f_j["wxType"] = *(DWORD *)f.wxTypeAddr;
f_j["wxVerifyFlag"] = *(DWORD *)f.wxVerifyFlagAddr;
ret_data["data"].push_back(f_j); ret_data["data"].push_back(f_j);
} }
ret = ret_data.dump(); ret = ret_data.dump();
......
...@@ -351,10 +351,8 @@ class WeChatRobot: ...@@ -351,10 +351,8 @@ class WeChatRobot:
""" """
if not self.AddressBook: if not self.AddressBook:
self.GetAddressBook() self.GetAddressBook()
friend_list = [] friend_list = [item for item in self.AddressBook \
for item in self.AddressBook: if (item['wxType'] == 3 and item['wxid'][0:3] != 'gh_')]
if 'wxid_' == item['wxid'][0:5]:
friend_list.append(item)
return friend_list return friend_list
def GetChatRoomList(self) -> list: def GetChatRoomList(self) -> list:
...@@ -369,10 +367,8 @@ class WeChatRobot: ...@@ -369,10 +367,8 @@ class WeChatRobot:
""" """
if not self.AddressBook: if not self.AddressBook:
self.GetAddressBook() self.GetAddressBook()
chatroom_list = [] chatroom_list = [item for item in self.AddressBook \
for item in self.AddressBook: if item['wxType'] == 2]
if '@chatroom' in item['wxid']:
chatroom_list.append(item)
return chatroom_list return chatroom_list
def GetOfficialAccountList(self) -> list: def GetOfficialAccountList(self) -> list:
...@@ -387,10 +383,9 @@ class WeChatRobot: ...@@ -387,10 +383,9 @@ class WeChatRobot:
""" """
if not self.AddressBook: if not self.AddressBook:
self.GetAddressBook() self.GetAddressBook()
official_account_list = [] official_account_list = [item for item in self.AddressBook \
for item in self.AddressBook: if (item['wxType'] == 3 and \
if 'wxid_' != item['wxid'][0:5] and '@chatroom' not in item['wxid']: item['wxid'][0:3] == 'gh_')]
official_account_list.append(item)
return official_account_list return official_account_list
def GetFriendByWxRemark(self, remark: str) -> dict or None: def GetFriendByWxRemark(self, remark: str) -> dict or None:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册