Skip to content

Commit

Permalink
解决内存泄漏问题
Browse files Browse the repository at this point in the history
  • Loading branch information
ljc545w committed Jan 31, 2023
1 parent 6c63780 commit f6d7577
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 77 deletions.
29 changes: 15 additions & 14 deletions CWeChatRobot/DbExecuteSql.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,17 @@ void ClearResultArray()
SQLResultStruct *sr = (SQLResultStruct *)&SQLResult[i][j];
if (sr->ColName)
{
delete sr->ColName;
delete[] sr->ColName;
sr->ColName = NULL;
}
if (sr->content)
{
delete sr->content;
delete[] sr->content;
sr->content = NULL;
}
if (sr->BlobContent)
{
delete sr->BlobContent;
delete[] sr->BlobContent;
sr->BlobContent = NULL;
}
}
Expand All @@ -93,29 +93,30 @@ SAFEARRAY *CreateSQLResultSafeArray()
SQLResultStruct *ptrResult = (SQLResultStruct *)&SQLResult[i][j];
if (i == 0)
{
ATL::CComVariant val(ptrResult->ColName);
Index[0] = 0;
Index[1] = j;
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->ColName);
hr = SafeArrayPutElement(psaValue, Index, &val);
}
Index[0] = i + 1;
Index[1] = j;
if (ptrResult->content)
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->content);
{
ATL::CComVariant val(ptrResult->content);
hr = SafeArrayPutElement(psaValue, Index, &val);
}
else
{
VARIANT varChunk;
SAFEARRAY *bsa;
BYTE *pByte = NULL;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = ptrResult->BlobLength;
rgsabound[0].lLbound = 0;
bsa = SafeArrayCreate(VT_UI1, 1, rgsabound);
SafeArrayAccessData(bsa, (void **)&pByte);
ATL::CComSafeArray<BYTE> bsa(rgsabound);
SafeArrayAccessData(bsa.m_psa, (void **)&pByte);
memcpy(pByte, ptrResult->BlobContent, ptrResult->BlobLength);
SafeArrayUnaccessData(bsa);
varChunk.vt = VT_ARRAY | VT_UI1;
varChunk.parray = bsa;
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)varChunk);
SafeArrayUnaccessData(bsa.m_psa);
ATL::CComVariant val(bsa.m_psa);
hr = SafeArrayPutElement(psaValue, Index, &val);
}
}
}
Expand All @@ -140,7 +141,7 @@ VOID ReadSQLResultFromWeChatProcess(HANDLE hProcess, DWORD dwHandle)
char *ColName = new char[sqlresultAddr.l_ColName + 1];
sqlresult.ColName = new wchar_t[sqlresultAddr.l_ColName + 1];
ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.ColName, ColName, sqlresultAddr.l_ColName + 1, 0);
MultiByteToWideChar(CP_ACP, 0, ColName, -1, sqlresult.ColName, strlen(ColName) + 1);
MultiByteToWideChar(CP_UTF8, 0, ColName, -1, sqlresult.ColName, strlen(ColName) + 1);
char *content = new char[sqlresultAddr.l_content + 1];
if (!sqlresultAddr.isblob)
{
Expand Down
4 changes: 2 additions & 2 deletions CWeChatRobot/DbExecuteSql.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#pragma once
#include<windows.h>
#include <windows.h>

SAFEARRAY* ExecuteSQL(DWORD pid,DWORD DbHandle, BSTR sql);
SAFEARRAY *ExecuteSQL(DWORD pid, DWORD DbHandle, BSTR sql);
53 changes: 32 additions & 21 deletions CWeChatRobot/GetDbHandles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@ struct DbInfoAddrStruct

struct TableInfoStruct
{
char *name;
char *tbl_name;
char *sql;
char *rootpage;
std::string name;
std::string tbl_name;
std::string sql;
std::string rootpage;
};

struct DbInfoStruct
{
DWORD handle;
wchar_t *dbname;
std::wstring dbname;
vector<TableInfoStruct> tables;
DWORD count;
};
Expand Down Expand Up @@ -69,7 +69,7 @@ SAFEARRAY *CreateDbInfoSafeArray()
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"dbname");
ArrayIndex[1] = 0;
ArrayIndex[2] = {1};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].dbname);
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)dbs[i].dbname.c_str());
ArrayIndex[1] = 1;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"Handle");
Expand All @@ -81,25 +81,25 @@ SAFEARRAY *CreateDbInfoSafeArray()
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"name");
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.c_str());
ArrayIndex[1] = 3;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"tbl_name");
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.c_str());
ArrayIndex[1] = 4;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"rootpage");
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.c_str());
ArrayIndex[1] = 5;
ArrayIndex[2] = {0};
hr = SafeArrayPutElement(psaValue, ArrayIndex, &(_variant_t)L"sql");
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.c_str());
index++;
}
}
Expand All @@ -125,22 +125,33 @@ SAFEARRAY *GetDbHandles(DWORD pid)
DbInfoStruct db = {0};
db.handle = dbaddr.handle;
db.count = dbaddr.count;
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);
wchar_t *wbuf = new wchar_t[dbaddr.l_dbname + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)dbaddr.dbname, wbuf, sizeof(wchar_t) * (dbaddr.l_dbname + 1), 0);
db.dbname = std::wstring(wbuf);
delete[] wbuf;
DWORD db_table_start_addr = dbaddr.v_data;
while (db_table_start_addr < dbaddr.v_end1)
{
char *buf = NULL;
TableInfoAddrStruct tbaddr = {0};
TableInfoStruct tb = {0};
TableInfoStruct tb;
ReadProcessMemory(hp.GetHandle(), (LPCVOID)db_table_start_addr, &tbaddr, sizeof(TableInfoAddrStruct), 0);
tb.name = new char[tbaddr.l_name + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.name, tb.name, tbaddr.l_name + 1, 0);
tb.tbl_name = new char[tbaddr.l_tbl_name + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.tbl_name, tb.tbl_name, tbaddr.l_tbl_name + 1, 0);
tb.rootpage = new char[tbaddr.l_rootpage + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.rootpage, tb.rootpage, tbaddr.l_rootpage + 1, 0);
tb.sql = new char[tbaddr.l_sql + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.sql, tb.sql, tbaddr.l_sql + 1, 0);
buf = new char[tbaddr.l_name + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.name, buf, tbaddr.l_name + 1, 0);
tb.name = std::string(buf);
delete[] buf;
buf = new char[tbaddr.l_tbl_name + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.tbl_name, buf, tbaddr.l_tbl_name + 1, 0);
tb.tbl_name = std::string(buf);
delete[] buf;
buf = new char[tbaddr.l_rootpage + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.rootpage, buf, tbaddr.l_rootpage + 1, 0);
tb.rootpage = std::string(buf);
delete[] buf;
buf = new char[tbaddr.l_sql + 1];
ReadProcessMemory(hp.GetHandle(), (LPCVOID)tbaddr.sql, buf, tbaddr.l_sql + 1, 0);
tb.sql = std::string(buf);
delete[] buf;
db.tables.push_back(tb);
db_table_start_addr += sizeof(TableInfoAddrStruct);
}
Expand Down
22 changes: 10 additions & 12 deletions CWeChatRobot/GetQrcodeImage.cpp
Original file line number Diff line number Diff line change
@@ -1,33 +1,31 @@
#include "pch.h"

VARIANT GetQrcodeImage(DWORD pid)
ATL::CComVariant GetQrcodeImage(DWORD pid)
{
VARIANT vsa;
vsa.vt = VT_ARRAY | VT_UI1;
V_ARRAY(&vsa) = NULL;
WeChatProcess hp(pid);
if (!hp.m_init)
return vsa;
return NULL;
DWORD GetQrcodeImageAddr = hp.GetProcAddr(GetQrcodeImageRemote);
DWORD ret = CallRemoteFunction(hp.GetHandle(), GetQrcodeImageAddr, NULL);
if (ret == 0)
return vsa;
return NULL;
DWORD ret_info[2] = {0};
ReadProcessMemory(hp.GetHandle(), (LPCVOID)ret, &ret_info, sizeof(ret_info), 0);
DWORD buf_addr = ret_info[0];
int size = ret_info[1];
if (size == 0 || buf_addr == 0)
return vsa;
return NULL;
unique_ptr<BYTE[]> image(new BYTE[size + 1]());
ReadProcessMemory(hp.GetHandle(), (LPCVOID)buf_addr, image.get(), size, 0);
SAFEARRAYBOUND rgsaBound = {(ULONG)size, 0};
SAFEARRAY *psaValue = SafeArrayCreate(VT_UI1, 1, &rgsaBound);
ATL::CComSafeArray<BYTE> cpsa(rgsaBound);
BYTE *buf = NULL;
::SafeArrayAccessData(psaValue, (void **)&buf);
::SafeArrayAccessData(cpsa.m_psa, (void **)&buf);
memcpy(buf, image.get(), size);
::SafeArrayUnaccessData(psaValue);
V_ARRAY(&vsa) = psaValue;
return vsa;
::SafeArrayUnaccessData(cpsa.m_psa);
ATL::CComVariant cva(cpsa.m_psa);
cpsa.Destroy();
return cva;
}

BOOL isWxLogin(DWORD pid)
Expand Down
4 changes: 3 additions & 1 deletion CWeChatRobot/GetQrcodeImage.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#pragma once
#include <windows.h>
VARIANT GetQrcodeImage(DWORD pid);
#include <atlcomcli.h>
#include <atlsafe.h>
ATL::CComVariant GetQrcodeImage(DWORD pid);
BOOL isWxLogin(DWORD pid);
70 changes: 43 additions & 27 deletions CWeChatRobot/WeChatRobot.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,13 @@ STDMETHODIMP CWeChatRobot::CSendCard(DWORD pid, BSTR receiver, BSTR sharedwxid,
*/
STDMETHODIMP CWeChatRobot::CGetFriendList(DWORD pid, VARIANT *__result)
{
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
V_ARRAY(&vsaValue) = GetFriendList(pid);
*__result = vsaValue;
VariantInit(__result);
SAFEARRAY *psaValue = GetFriendList(pid);
ATL::CComSafeArray<VARIANT> cpsa;
cpsa.Attach(psaValue);
ATL::CComVariant cva = cpsa.m_psa;
cva.Detach(__result);
cpsa.Destroy();
return S_OK;
}

Expand Down Expand Up @@ -207,10 +210,13 @@ STDMETHODIMP CWeChatRobot::CStopReceiveMessage(DWORD pid, int *__result)
*/
STDMETHODIMP CWeChatRobot::CGetChatRoomMembers(DWORD pid, BSTR chatroomid, VARIANT *__result)
{
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
V_ARRAY(&vsaValue) = GetChatRoomMembers(pid, chatroomid);
*__result = vsaValue;
VariantInit(__result);
SAFEARRAY *psaValue = GetChatRoomMembers(pid, chatroomid);
ATL::CComSafeArray<VARIANT> cpsa;
cpsa.Attach(psaValue);
ATL::CComVariant cva = cpsa.m_psa;
cva.Detach(__result);
cpsa.Destroy();
return S_OK;
}

Expand All @@ -220,10 +226,13 @@ STDMETHODIMP CWeChatRobot::CGetChatRoomMembers(DWORD pid, BSTR chatroomid, VARIA
*/
STDMETHODIMP CWeChatRobot::CGetDbHandles(DWORD pid, VARIANT *__result)
{
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
V_ARRAY(&vsaValue) = GetDbHandles(pid);
*__result = vsaValue;
VariantInit(__result);
SAFEARRAY *psaValue = GetDbHandles(pid);
ATL::CComSafeArray<VARIANT> cpsa;
cpsa.Attach(psaValue);
ATL::CComVariant cva = cpsa.m_psa;
cva.Detach(__result);
cpsa.Destroy();
return S_OK;
}

Expand All @@ -235,10 +244,13 @@ STDMETHODIMP CWeChatRobot::CGetDbHandles(DWORD pid, VARIANT *__result)
*/
STDMETHODIMP CWeChatRobot::CExecuteSQL(DWORD pid, DWORD DbHandle, BSTR sql, VARIANT *__result)
{
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
V_ARRAY(&vsaValue) = ExecuteSQL(pid, DbHandle, sql);
*__result = vsaValue;
VariantInit(__result);
SAFEARRAY *psaValue = ExecuteSQL(pid, DbHandle, sql);
ATL::CComSafeArray<VARIANT> cpsa;
cpsa.Attach(psaValue);
ATL::CComVariant cva = cpsa.m_psa;
cva.Detach(__result);
cpsa.Destroy();
return S_OK;
}

Expand Down Expand Up @@ -318,10 +330,13 @@ STDMETHODIMP CWeChatRobot::CStartWeChat(int *__result)
*/
STDMETHODIMP CWeChatRobot::CSearchContactByNet(DWORD pid, BSTR keyword, VARIANT *__result)
{
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
V_ARRAY(&vsaValue) = SearchContactByNet(pid, keyword);
*__result = vsaValue;
VariantInit(__result);
SAFEARRAY *psaValue = SearchContactByNet(pid, keyword);
ATL::CComSafeArray<VARIANT> cpsa;
cpsa.Attach(psaValue);
ATL::CComVariant cva = cpsa.m_psa;
cva.Detach(__result);
cpsa.Destroy();
return S_OK;
}

Expand Down Expand Up @@ -545,16 +560,15 @@ STDMETHODIMP CWeChatRobot::COpenBrowser(DWORD pid, BSTR url, int *__result)
STDMETHODIMP CWeChatRobot::CGetHistoryPublicMsg(DWORD pid, BSTR PublicId, BSTR Offset, VARIANT *__result)
{
HRESULT hr = S_OK;
VariantInit(__result);
wstring result = GetHistoryPublicMsg(pid, PublicId, Offset);
VARIANT vsaValue;
vsaValue.vt = VT_ARRAY | VT_VARIANT;
SAFEARRAYBOUND rgsaBound = {1, 0};
SAFEARRAY *psaValue = SafeArrayCreate(VT_VARIANT, 1, &rgsaBound);
ATL::CComSafeArray<VARIANT> cpsa(rgsaBound);
long index = 0;
// 数据大小超过16382个字符,客户端调用可能出现异常,因此将数据放入安全数组中传递
hr = SafeArrayPutElement(psaValue, &index, &(_variant_t)result.c_str());
V_ARRAY(&vsaValue) = psaValue;
*__result = vsaValue;
hr = SafeArrayPutElement(cpsa.m_psa, &index, &(_variant_t)result.c_str());
ATL::CComVariant vsa(cpsa.m_psa);
vsa.Detach(__result);
return S_OK;
}

Expand All @@ -576,7 +590,9 @@ STDMETHODIMP CWeChatRobot::CForwardMessage(DWORD pid, BSTR wxid, ULONG64 msgid,
*/
STDMETHODIMP CWeChatRobot::CGetQrcodeImage(DWORD pid, VARIANT *__result)
{
*__result = GetQrcodeImage(pid);
ATL::CComVariant cva = GetQrcodeImage(pid);
VariantInit(__result);
cva.Detach(__result);
return S_OK;
}

Expand Down

0 comments on commit f6d7577

Please sign in to comment.