提交 4c8bcd03 编写于 作者: L ljc545w

修复sql编码错误问题

上级 acb03120
#include "pch.h" #include "pch.h"
// 调用DLL接口时的参数 // 调用DLL接口时的参数
struct executeParams { struct executeParams
DWORD ptrDb; {
DWORD ptrSql; DWORD ptrDb;
DWORD ptrSql;
}; };
// 接收DLL的返回数据,包括动态数组首地址和数组长度 // 接收DLL的返回数据,包括动态数组首地址和数组长度
struct executeResult { struct executeResult
DWORD SQLResultData; {
DWORD length; DWORD SQLResultData;
DWORD length;
}; };
// 保存ReadProcessMemory读出的结构体 // 保存ReadProcessMemory读出的结构体
struct SQLResultAddrStruct { struct SQLResultAddrStruct
DWORD ColName; {
DWORD l_ColName; DWORD ColName;
DWORD content; DWORD l_ColName;
DWORD l_content; DWORD content;
DWORD isblob; DWORD l_content;
DWORD isblob;
}; };
// vector的数据结构 // vector的数据结构
struct VectorStruct { struct VectorStruct
{
#ifdef _DEBUG #ifdef _DEBUG
DWORD v_head; DWORD v_head;
#endif #endif
DWORD v_data; DWORD v_data;
DWORD v_end1; DWORD v_end1;
DWORD v_end2; DWORD v_end2;
}; };
// 保存SQL查询结构的基础结构 // 保存SQL查询结构的基础结构
struct SQLResultStruct { struct SQLResultStruct
wchar_t* ColName; {
wchar_t* content; wchar_t *ColName;
unsigned char* BlobContent; wchar_t *content;
int BlobLength; unsigned char *BlobContent;
int BlobLength;
}; };
// 查询结果是一个二维数组 // 查询结果是一个二维数组
vector<vector<SQLResultStruct>> SQLResult; vector<vector<SQLResultStruct>> SQLResult;
// 每次查询前清空前一次查询到的结果 // 每次查询前清空前一次查询到的结果
void ClearResultArray() { void ClearResultArray()
if (SQLResult.size() == 0) {
return; if (SQLResult.size() == 0)
for (unsigned int i = 0; i < SQLResult.size(); i++) { return;
for (unsigned j = 0; j < SQLResult[i].size(); j++) { for (unsigned int i = 0; i < SQLResult.size(); i++)
SQLResultStruct* sr = (SQLResultStruct*)&SQLResult[i][j]; {
if (sr->ColName) { for (unsigned j = 0; j < SQLResult[i].size(); j++)
delete sr->ColName; {
sr->ColName = NULL; SQLResultStruct *sr = (SQLResultStruct *)&SQLResult[i][j];
} if (sr->ColName)
if (sr->content) { {
delete sr->content; delete sr->ColName;
sr->content = NULL; sr->ColName = NULL;
} }
if (sr->BlobContent) { if (sr->content)
delete sr->BlobContent; {
sr->BlobContent = NULL; delete sr->content;
} sr->content = NULL;
} }
SQLResult[i].clear(); if (sr->BlobContent)
} {
SQLResult.clear(); delete sr->BlobContent;
sr->BlobContent = NULL;
}
}
SQLResult[i].clear();
}
SQLResult.clear();
} }
// 遍历查询结果,构造SAFEARRAY // 遍历查询结果,构造SAFEARRAY
SAFEARRAY* CreateSQLResultSafeArray() { SAFEARRAY *CreateSQLResultSafeArray()
if (SQLResult.size() == 0 || SQLResult[0].size() == 0) {
return NULL; if (SQLResult.size() == 0 || SQLResult[0].size() == 0)
SAFEARRAYBOUND rgsaBound[2] = { {SQLResult.size() + 1,0},{SQLResult[0].size(),0}}; return NULL;
SAFEARRAY* psaValue = SafeArrayCreate(VT_VARIANT, 2, rgsaBound); SAFEARRAYBOUND rgsaBound[2] = {{SQLResult.size() + 1, 0}, {SQLResult[0].size(), 0}};
HRESULT hr = S_OK; SAFEARRAY *psaValue = SafeArrayCreate(VT_VARIANT, 2, rgsaBound);
long Index[2] = { 0,0 }; HRESULT hr = S_OK;
for (unsigned int i = 0; i < SQLResult.size(); i++) { long Index[2] = {0, 0};
for (unsigned int j = 0; j < SQLResult[i].size(); j++) { for (unsigned int i = 0; i < SQLResult.size(); i++)
SQLResultStruct* ptrResult = (SQLResultStruct*)&SQLResult[i][j]; {
if (i == 0) for (unsigned int j = 0; j < SQLResult[i].size(); j++)
{ {
Index[0] = 0; Index[1] = j; SQLResultStruct *ptrResult = (SQLResultStruct *)&SQLResult[i][j];
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->ColName); if (i == 0)
} {
Index[0] = i + 1; Index[1] = j; Index[0] = 0;
if(ptrResult->content) Index[1] = j;
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->content); hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->ColName);
else { }
VARIANT varChunk; Index[0] = i + 1;
SAFEARRAY* bsa; Index[1] = j;
BYTE* pByte = NULL; if (ptrResult->content)
SAFEARRAYBOUND rgsabound[1]; hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)ptrResult->content);
rgsabound[0].cElements = ptrResult->BlobLength; else
rgsabound[0].lLbound = 0; {
bsa = SafeArrayCreate(VT_UI1, 1, rgsabound); VARIANT varChunk;
SafeArrayAccessData(bsa, (void**)&pByte); SAFEARRAY *bsa;
memcpy(pByte, ptrResult->BlobContent, ptrResult->BlobLength); BYTE *pByte = NULL;
SafeArrayUnaccessData(bsa); SAFEARRAYBOUND rgsabound[1];
varChunk.vt = VT_ARRAY | VT_UI1; rgsabound[0].cElements = ptrResult->BlobLength;
varChunk.parray = bsa; rgsabound[0].lLbound = 0;
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)varChunk); bsa = SafeArrayCreate(VT_UI1, 1, rgsabound);
} SafeArrayAccessData(bsa, (void **)&pByte);
} memcpy(pByte, ptrResult->BlobContent, ptrResult->BlobLength);
} SafeArrayUnaccessData(bsa);
return psaValue; varChunk.vt = VT_ARRAY | VT_UI1;
varChunk.parray = bsa;
hr = SafeArrayPutElement(psaValue, Index, &(_variant_t)varChunk);
}
}
}
return psaValue;
} }
// 读出查询结果 // 读出查询结果
VOID ReadSQLResultFromWeChatProcess(HANDLE hProcess,DWORD dwHandle) { VOID ReadSQLResultFromWeChatProcess(HANDLE hProcess, DWORD dwHandle)
executeResult result = { 0 }; {
ReadProcessMemory(hProcess, (LPCVOID)dwHandle, &result, sizeof(executeResult), 0); executeResult result = {0};
for (unsigned int i = 0; i < result.length; i++) { ReadProcessMemory(hProcess, (LPCVOID)dwHandle, &result, sizeof(executeResult), 0);
VectorStruct v_temp = { 0 }; for (unsigned int i = 0; i < result.length; i++)
vector<SQLResultStruct> s_temp; {
ReadProcessMemory(hProcess, (LPCVOID)result.SQLResultData, &v_temp, sizeof(VectorStruct), 0); VectorStruct v_temp = {0};
while (v_temp.v_data < v_temp.v_end1) { vector<SQLResultStruct> s_temp;
SQLResultAddrStruct sqlresultAddr = { 0 }; ReadProcessMemory(hProcess, (LPCVOID)result.SQLResultData, &v_temp, sizeof(VectorStruct), 0);
SQLResultStruct sqlresult = { 0 }; while (v_temp.v_data < v_temp.v_end1)
ReadProcessMemory(hProcess, (LPCVOID)v_temp.v_data, &sqlresultAddr, sizeof(SQLResultAddrStruct), 0); {
char* ColName = new char[sqlresultAddr.l_ColName + 1]; SQLResultAddrStruct sqlresultAddr = {0};
sqlresult.ColName = new wchar_t[sqlresultAddr.l_ColName + 1]; SQLResultStruct sqlresult = {0};
ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.ColName, ColName, sqlresultAddr.l_ColName + 1, 0); ReadProcessMemory(hProcess, (LPCVOID)v_temp.v_data, &sqlresultAddr, sizeof(SQLResultAddrStruct), 0);
MultiByteToWideChar(CP_ACP,0,ColName,-1,sqlresult.ColName,strlen(ColName) + 1); char *ColName = new char[sqlresultAddr.l_ColName + 1];
char* content = new char[sqlresultAddr.l_content + 1]; sqlresult.ColName = new wchar_t[sqlresultAddr.l_ColName + 1];
if (!sqlresultAddr.isblob) { ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.ColName, ColName, sqlresultAddr.l_ColName + 1, 0);
sqlresult.content = new wchar_t[sqlresultAddr.l_content + 1]; MultiByteToWideChar(CP_ACP, 0, ColName, -1, sqlresult.ColName, strlen(ColName) + 1);
ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.content, content, sqlresultAddr.l_content + 1, 0); char *content = new char[sqlresultAddr.l_content + 1];
MultiByteToWideChar(CP_UTF8, 0, content, -1, sqlresult.content, strlen(content) + 1); if (!sqlresultAddr.isblob)
sqlresult.BlobContent = NULL; {
} sqlresult.content = new wchar_t[sqlresultAddr.l_content + 1];
else { ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.content, content, sqlresultAddr.l_content + 1, 0);
sqlresult.BlobContent = new unsigned char[sqlresultAddr.l_content]; MultiByteToWideChar(CP_UTF8, 0, content, -1, sqlresult.content, strlen(content) + 1);
ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.content, sqlresult.BlobContent, sqlresultAddr.l_content, 0); sqlresult.BlobContent = NULL;
sqlresult.BlobLength = sqlresultAddr.l_content; }
sqlresult.content = NULL; else
} {
delete[] ColName; sqlresult.BlobContent = new unsigned char[sqlresultAddr.l_content];
ColName = NULL; ReadProcessMemory(hProcess, (LPCVOID)sqlresultAddr.content, sqlresult.BlobContent, sqlresultAddr.l_content, 0);
delete[] content; sqlresult.BlobLength = sqlresultAddr.l_content;
content = NULL; sqlresult.content = NULL;
v_temp.v_data += sizeof(SQLResultAddrStruct); }
s_temp.push_back(sqlresult); delete[] ColName;
} ColName = NULL;
SQLResult.push_back(s_temp); delete[] content;
result.SQLResultData += sizeof(VectorStruct); content = NULL;
} v_temp.v_data += sizeof(SQLResultAddrStruct);
s_temp.push_back(sqlresult);
}
SQLResult.push_back(s_temp);
result.SQLResultData += sizeof(VectorStruct);
}
} }
SAFEARRAY* ExecuteSQL(DWORD pid,DWORD DbHandle,BSTR sql) { SAFEARRAY *ExecuteSQL(DWORD pid, DWORD DbHandle, BSTR sql)
WeChatProcess hp(pid); {
if (!hp.m_init) return NULL; WeChatProcess hp(pid);
ClearResultArray(); if (!hp.m_init)
// DWORD ExecuteSQLRemoteAddr = hp.GetProcAddr(ExecuteSQLRemote); return NULL;
DWORD ExecuteSQLRemoteAddr = hp.GetProcAddr(SelectDataRemote); ClearResultArray();
if (ExecuteSQLRemoteAddr == 0) // DWORD ExecuteSQLRemoteAddr = hp.GetProcAddr(ExecuteSQLRemote);
return NULL; DWORD ExecuteSQLRemoteAddr = hp.GetProcAddr(SelectDataRemote);
char* a_sql = _com_util::ConvertBSTRToString(sql); if (ExecuteSQLRemoteAddr == 0)
WeChatData<char*> r_sql(hp.GetHandle(), a_sql, TEXTLENGTHA(a_sql)); return NULL;
executeParams params = { 0 }; string s_sql = unicode_to_utf8(sql);
params.ptrDb = DbHandle; WeChatData<char *> r_sql(hp.GetHandle(), (char *)s_sql.c_str(), s_sql.size());
params.ptrSql = (DWORD)r_sql.GetAddr(); executeParams params = {0};
WeChatData<executeParams*> r_params(hp.GetHandle(), &params, sizeof(params)); params.ptrDb = DbHandle;
if (r_sql.GetAddr() == 0 || r_params.GetAddr() == 0) params.ptrSql = (DWORD)r_sql.GetAddr();
return NULL; WeChatData<executeParams *> r_params(hp.GetHandle(), &params, sizeof(params));
DWORD ret = CallRemoteFunction(hp.GetHandle(), ExecuteSQLRemoteAddr, r_params.GetAddr()); if (r_sql.GetAddr() == 0 || r_params.GetAddr() == 0)
ReadSQLResultFromWeChatProcess(hp.GetHandle(),ret); return NULL;
SAFEARRAY* psaValue = CreateSQLResultSafeArray(); DWORD ret = CallRemoteFunction(hp.GetHandle(), ExecuteSQLRemoteAddr, r_params.GetAddr());
return psaValue; ReadSQLResultFromWeChatProcess(hp.GetHandle(), ret);
} SAFEARRAY *psaValue = CreateSQLResultSafeArray();
\ No newline at end of file return psaValue;
}
...@@ -11,6 +11,18 @@ map<DWORD, short> ServiceCount; ...@@ -11,6 +11,18 @@ map<DWORD, short> ServiceCount;
// 当使用预编译的头时,需要使用此源文件,编译才能成功。 // 当使用预编译的头时,需要使用此源文件,编译才能成功。
string unicode_to_utf8(wchar_t *wstr)
{
int c_size = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, false);
char *buffer = new char[c_size + 1];
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, buffer, c_size, NULL, false);
buffer[c_size] = '\0';
string str(buffer);
delete[] buffer;
buffer = NULL;
return str;
}
BOOL isFileExists_stat(string &name) BOOL isFileExists_stat(string &name)
{ {
struct stat buffer; struct stat buffer;
......
...@@ -43,12 +43,13 @@ using namespace std; ...@@ -43,12 +43,13 @@ using namespace std;
#define TEXTLENGTH TEXTLENGTHW #define TEXTLENGTH TEXTLENGTHW
#endif #endif
BOOL isFileExists_stat(string& name); BOOL isFileExists_stat(string &name);
DWORD GetWeChatRobotBase(DWORD pid); DWORD GetWeChatRobotBase(DWORD pid);
DWORD GetWeChatWinBase(DWORD pid); DWORD GetWeChatWinBase(DWORD pid);
DWORD GetWeChatPid(); DWORD GetWeChatPid();
DWORD StartRobotService(DWORD pid); DWORD StartRobotService(DWORD pid);
DWORD StopRobotService(DWORD pid); DWORD StopRobotService(DWORD pid);
string unicode_to_utf8(wchar_t *wstr);
BOOL CreateConsole(); BOOL CreateConsole();
wstring GetComWorkPath(); wstring GetComWorkPath();
...@@ -57,5 +58,5 @@ tstring GetWeChatInstallDir(); ...@@ -57,5 +58,5 @@ tstring GetWeChatInstallDir();
DWORD GetWeChatVerInt(); DWORD GetWeChatVerInt();
tstring GetWeChatVerStr(); tstring GetWeChatVerStr();
DWORD StartWeChat(); DWORD StartWeChat();
BOOL CloseProcessHandle(DWORD pid, wchar_t* handlename); BOOL CloseProcessHandle(DWORD pid, wchar_t *handlename);
DWORD GetRemoteProcAddr(DWORD pid, LPWSTR modulename, LPSTR procname); DWORD GetRemoteProcAddr(DWORD pid, LPWSTR modulename, LPSTR procname);
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册