请教关于游戏中的文字编码问题

cozil 2005-08-12 07:43:11
我截获了某游戏里的一些文字,都是用ExtTextOutW输出的,我将截获到的文字用WideCharToMultiByte转换后输出到文件,可都是一些乱码,后来我就将十六进制数据打了出来,谁能告诉我这些数据应该如何转换成可以正常显示的文字???
[ExtTextOutW] [13] [cf 32 b3 34 df 2f 63 14 af 45 20 3e d4 4c 55 3f d4 03 6e 11 ca 1b c8 4b c4 01 ]
?????????????
[ExtTextOutW] [12] [53 05 fc 2a 58 2c 12 1c 35 09 45 50 7c 08 03 1c bb 1b 1c 28 00 1d c4 01 ]
?????偅??????
[ExtTextOutW] [7] [c3 09 d1 36 a5 09 f3 2a ed 4a c3 41 c4 01 ]
???????
[ExtTextOutW] [6] [6d 55 f3 09 0b 00 7c 19 24 39 0c 00 ]
啭? ??
[ExtTextOutW] [12] [63 4c e1 03 e0 09 cf 32 b3 34 d4 4c 55 3f e1 03 e0 09 ca 1b c8 4b c4 01 ]
????????????

对于英文字母转换后能正常显示,我想上面的应该是些汉字,可又不知道如何转换,请高人指教,万分感谢!!

...全文
137 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cozil 2005-08-13
  • 打赏
  • 举报
回复
加密的问题应该是不存在的,因为我用同样的程序去挂接windows计算器,截获到的文字只有菜单文字如“编辑,查看”等字样是正常显示的,其它都是乱码,以下是记录串数据到文件的:
void LogFileW(LPCSTR lpFuncName, LPCWSTR lpString, int cbString)
{
char szFileName[]="c:\\hook.log";

char szGbt[256],szGbs[256];
DWORD dwWriteLen;
HANDLE hfile;

memset( szGbt, 0x00, 256 );
memset( szGbs, 0x00, 256 );

WideCharToMultiByte(CP_UTF8,0, lpString, cbString, szGbt, 255, NULL, NULL);

hfile = CreateFile( szFileName, GENERIC_WRITE, \
FILE_SHARE_WRITE | FILE_SHARE_READ , \
NULL, OPEN_ALWAYS, NULL, NULL );
if( hfile )
{
SetFilePointer( hfile, 0L, 0L, FILE_END );
sprintf( szGbs, "[%s] [%d] [%s]\r\n", lpFuncName, cbString, szGbt );
WriteFile( hfile, szGbs, strlen(szGbs), &dwWriteLen, NULL );
CloseHandle( hfile );
}

}

以下是截获extTextOutW的程序:
BOOL WINAPI MyExtTextOutW(HDC hdc,int X,int Y,UINT fuOptions,CONST RECT *lprc,LPCWSTR lpString,UINT cbCount,CONST INT *lpDx)
{
LogFileW( "ExtTextOutW", lpString, cbCount );
ExtTextOutW(hdc,X,Y,fuOptions,lprc,lpString,cbCount,lpDx);
return TRUE;
}

就这两函数,不知道是不是有问题??
everandforever 2005-08-13
  • 打赏
  • 举报
回复
是不是你存16进制数据的时候丢了一些字节呢?一个WCHAR有2字节...(或许是我多嘴)
不过你存的这些字节确实没法转成汉字
netgm 2005-08-13
  • 打赏
  • 举报
回复
TO
我截获了某游戏里的一些文字,都是用ExtTextOutW输出的,我将截获到的文字用

你既然知道是exttextout输出 ..那你就应该继续跟进.是怎么样编码的..
所谓编码.可能是加密编码....没有的话.一般不用转换..多此一举
游戏还要干其它很多事啦
everandforever 2005-08-13
  • 打赏
  • 举报
回复
这篇文章有说明。
http://dev.csdn.net/article/72/72002.shtm
cozil 2005-08-13
  • 打赏
  • 举报
回复
TO : everandforever(Forever)
谢谢你的帮助。你说的这两个参数(936,950)我都试过了仍然不行。我试着hook windows自带的计算器,结果该值为AC_UTF8时,能显示出菜单名称之类的汉字,其它字符是乱码;其它代码页值时都是乱码。
似乎这个问题很难解决,那我想问一下,代码页这个参数在MSDN里只说明了几个,没提到936,950这些值,这些值是从何得知的? 回答后立即结贴 。希望有朋友帮帮忙
everandforever 2005-08-13
  • 打赏
  • 举报
回复
你的LOG函数里面怎么已经用过WideCharToMultiByte了呢?那在外面就不必再转换了。
把LOG函数里面的WideCharToMultiByte改成
WideCharToMultiByte(936,0, lpString, cbString, szGbt, 255, NULL, NULL);
或者
WideCharToMultiByte(950,0, lpString, cbString, szGbt, 255, NULL, NULL);
试试
cozil 2005-08-12
  • 打赏
  • 举报
回复
这个是直接转换为简体的:
WideCharToMultiByte (0x0804, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;

我用这个转换怎么pszGbt里是空的???
那关于第一个参数我在MSDN里只看到几个可用值,936,0x804这两个值是从哪得知的?
dirdirdir3 2005-08-12
  • 打赏
  • 举报
回复
这个是直接转换为简体的:
WideCharToMultiByte (0x0804, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;
dirdirdir3 2005-08-12
  • 打赏
  • 举报
回复
//转换Gb码繁体到Gb码简体,使用API函数LCMapString
LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);
dirdirdir3 2005-08-12
  • 打赏
  • 举报
回复
不好意思,搞错了,可以使用WideCharToMultiByte来转换,不过参数可能要改:
//转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte
WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ;
cozil 2005-08-12
  • 打赏
  • 举报
回复
那应该如何转换?请指教!!
dirdirdir3 2005-08-12
  • 打赏
  • 举报
回复
汉字可能不能使用WideCharToMultiByte来转换。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧