我截获了某游戏里的一些文字,都是用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 ]
????????????对于英文字母转换后能正常显示,我想上面的应该是些汉字,可又不知道如何转换,请高人指教,万分感谢!! 

解决方案 »

  1.   

    汉字可能不能使用WideCharToMultiByte来转换。
      

  2.   

    不好意思,搞错了,可以使用WideCharToMultiByte来转换,不过参数可能要改:
    //转换Unicode码到Gb码繁体,使用API函数WideCharToMultiByte 
    WideCharToMultiByte (936, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; 
      

  3.   

    //转换Gb码繁体到Gb码简体,使用API函数LCMapString 
    LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE, pszGbt, -1, pszGbs, iLen);
      

  4.   

    这个是直接转换为简体的:
    WideCharToMultiByte (0x0804, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; 
      

  5.   

    这个是直接转换为简体的:
    WideCharToMultiByte (0x0804, 0, (PWSTR) wszUnicode, -1, pszGbt,iLen, NULL, NULL) ; 我用这个转换怎么pszGbt里是空的???
    那关于第一个参数我在MSDN里只看到几个可用值,936,0x804这两个值是从哪得知的?
      

  6.   

    是不是你存16进制数据的时候丢了一些字节呢?一个WCHAR有2字节...(或许是我多嘴)
    不过你存的这些字节确实没法转成汉字
      

  7.   

    TO
    我截获了某游戏里的一些文字,都是用ExtTextOutW输出的,我将截获到的文字用你既然知道是exttextout输出 ..那你就应该继续跟进.是怎么样编码的..
    所谓编码.可能是加密编码....没有的话.一般不用转换..多此一举
    游戏还要干其它很多事啦
      

  8.   

    加密的问题应该是不存在的,因为我用同样的程序去挂接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;
    }就这两函数,不知道是不是有问题??
      

  9.   

    你的LOG函数里面怎么已经用过WideCharToMultiByte了呢?那在外面就不必再转换了。
    把LOG函数里面的WideCharToMultiByte改成
    WideCharToMultiByte(936,0, lpString, cbString, szGbt, 255, NULL, NULL);
    或者
    WideCharToMultiByte(950,0, lpString, cbString, szGbt, 255, NULL, NULL);
    试试
      

  10.   

    TO : everandforever(Forever) 
    谢谢你的帮助。你说的这两个参数(936,950)我都试过了仍然不行。我试着hook windows自带的计算器,结果该值为AC_UTF8时,能显示出菜单名称之类的汉字,其它字符是乱码;其它代码页值时都是乱码。 
       似乎这个问题很难解决,那我想问一下,代码页这个参数在MSDN里只说明了几个,没提到936,950这些值,这些值是从何得知的? 回答后立即结贴 。希望有朋友帮帮忙
      

  11.   

    这篇文章有说明。
    http://dev.csdn.net/article/72/72002.shtm