字符编码转换代码
MultiByteToWideChar
这个函数用于将多字节字符串转换为宽字符(Unicode)字符串。 字符串不一定来自多字节字符集。
函数结构
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCCH lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
参数
CodePage: 指定源字符串的代码页,如CP_ACP(当前系统ANSI代码页)、CP_UTF8等。 lpMultiByteStr: 指向要转换的多字节字符串。 cbMultiByte: 指定要转换的字节数。 lpWideCharStr: 指向接收转换后的宽字符字符串的缓冲区。 cchWideChar: 指定宽字符缓冲区的大小(以字符为单位)。
WideCharToMultiByte
这个函数用于将宽字符(Unicode)字符串转换为多字节字符串。 字符串不一定来自多字节字符集。
函数结构
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWCH lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCCH lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
参数
CodePage: 指定目标多字节字符串的代码页。 lpWideCharStr: 指向要转换的宽字符字符串。 cchWideChar: 指定要转换的宽字符数。 lpMultiByteStr: 指向接收转换后的多字节字符串的缓冲区。 cbMultiByte: 指定多字节缓冲区的大小(以字节为单位)。
主要关注的点:CodePage代码页
常见的代码页标识符
CP_ACP (0): 当前系统 ANSI 代码页 CP_OEMCP (1): 当前系统 OEM 代码页 CP_MACCP (2): Macintosh 代码页 CP_THREAD_ACP (3): 当前线程的 ANSI 代码页 CP_SYMBOL (42): Symbol 代码页 CP_UTF7 (65000): UTF-7 CP_UTF8 (65001): UTF-8
具体到不同语言和地区的代码页:
936: 简体中文 GBK 950: 繁体中文 Big5 932: 日语 Shift-JIS 949: 韩语 1250: 中欧语言 (波兰、捷克等) 1251: 西里尔字母 (俄语等) 1252: 西欧语言 (英语、德语、法语等) 1253: 希腊语 1254: 土耳其语 1255: 希伯来语 1256: 阿拉伯语 1257: 波罗的海语言 1258: 越南语
54936: GB18030
HOOK代码示例
#include <windows.h>
#include <detours.h>
// 原始函数的类型定义
typedef int (WINAPI *MULTIBYTETOWIDECHAR)(UINT, DWORD, LPCSTR, int, LPWSTR, int);
typedef int (WINAPI *WIDECHARTOMULTIBYTE)(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR, LPBOOL);
// 保存原始函数的指针
MULTIBYTETOWIDECHAR TrueMultiByteToWideChar = MultiByteToWideChar;
WIDECHARTOMULTIBYTE TrueWideCharToMultiByte = WideCharToMultiByte;
// Hook函数:MultiByteToWideChar
int WINAPI HookedMultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr,
int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar)
{
// 强制使用GBK编码(代码页936)
return TrueMultiByteToWideChar(936, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar);
}
// Hook函数:WideCharToMultiByte
int WINAPI HookedWideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr,
int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte,
LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar)
{
// 强制使用GBK编码(代码页936)
return TrueWideCharToMultiByte(936, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr,
cbMultiByte, lpDefaultChar, lpUsedDefaultChar);
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)TrueMultiByteToWideChar, HookedMultiByteToWideChar);
DetourAttach(&(PVOID&)TrueWideCharToMultiByte, HookedWideCharToMultiByte);
DetourTransactionCommit();
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)TrueMultiByteToWideChar, HookedMultiByteToWideChar);
DetourDetach(&(PVOID&)TrueWideCharToMultiByte, HookedWideCharToMultiByte);
DetourTransactionCommit();
}
return TRUE;
}
举个例子
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容