首页
社区
课程
招聘
[求助]Hook SetWindowTextW的问题
发表于: 2016-7-26 22:50 5508

[求助]Hook SetWindowTextW的问题

2016-7-26 22:50
5508
用修改IAT的方法Hook SetWindowTextW,目的是实现WIN7自带的32位计算器程序用中文来显示数字。
系统Win7 X64,功能是实现了,但不知道为什么显示有重叠(如图),把窗口最小化一下再点出来就正常了。百思+OD调试均不得解,求大神指点~~~

图片是手机拍的··请原谅我没有截图,实验室的电脑导出文件要走OA流程,麻烦的要死

这个是最小化前的,明显重叠


这个是最小化后又打开的,好看多了


IAT HOOK 的部分感觉没什么问题,毕竟能成功显示中文数字,就不贴代码了,把自己写的 MySetWindowTextW 代码贴一下。。。其中,pfnOriginal 是原 SetWindowTextW 的地址

 
BOOL MySetWindowTextW(HWND hWnd, LPWSTR szText)
{
  WCHAR Chinese[] = L"零一二三四五六七八九";

  int i = 0, n = wcslen(szText);

  while(i < n)
  {
    if((szText[i] <= L'9') && (szText[i] >= L'0'))
      szText[i] = Chinese[szText[i] - L'0']
     ++i;
  }

  return (pfnOriginal(hWnd, szText));
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 144
活跃值: (31)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
2
你都设置完了 为什么还要调原来的...  应该是假如不设置就调原来的...
2016-7-26 23:01
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
自己的 MySetWindowTextW 只是修改了一下szText缓冲区,真正的 显示字符串功能还要靠系统的 SetWindowTextW 来实现啊
2016-7-26 23:13
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我猜是汉字和数字的宽度不一样,而记事本在更新的时候局部重绘导致宽度计算错误重叠
最小化还原的时候是全刷新

嗯……完全是在瞎猜
2016-7-27 08:34
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
宽度是一样的,都是UNICODE。我也怀疑和重绘有关,但就是确定不了,明明只改动了一下字符缓冲区而已···
2016-7-27 19:35
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
嗯……我是说字体的数字和汉字宽度不同
2016-7-27 20:15
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
蛋似。。为啥最小化再还原就可以显示正常了啊
2016-7-28 23:52
0
雪    币: 53
活跃值: (558)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
RedrawWindow;
2016-7-29 00:08
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
这个应该可以解决问题~~不过可以告诉我为什么会出现这种情况么
2016-8-2 21:26
0
雪    币: 689
活跃值: (422)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
updatewindow也能解决,原因是之前已经显示的没有被清除,所以重叠了.请注意,窗口显示清除和缓冲区清除的区别
2016-8-3 12:12
0
雪    币: 21
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
RedrawWindow 重画
问题出现在hook 时执行你的代码,但window 的 setwindowtext 还是会执行的
2016-8-3 12:45
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
原版的计算器程序中应该是有清楚过期显示的操作的,而我只是添加了一个针对SetWindowTextW的Hook,其他地方都没有改动啊。为什么加了Hook之后却要自己负责清楚过期的显示了呢?
2016-8-17 16:43
0
雪    币: 171
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Etr
13
因为窗口没刷新,要刷新窗口呀
2016-8-18 12:54
0
雪    币: 33
活跃值: (653)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
调用约定 要用 __stdcall

BOOL WINAPI MySetWindowTextW(HWND hWnd, LPWSTR szText)
2016-8-18 14:52
0
雪    币: 1787
活跃值: (345)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
BOOL MySetWindowTextW(HWND hWnd, LPCWSTR lpString)
{
    if(lpString)
    {
         static const WCHAR Chinese[] = L"零一二三四五六七八九";

        int i = 0, n = wcslen(lpString);

        LPCWSTR szText = new WCHAR[n+2];
        memset(szText, 0, n+2);

        while(i < n)
        {
            if((lpString[i] <= L'9') && (lpString[i] >= L'0'))
            szText[i] = Chinese[lpString[i] - L'0'];
            ++i;
        }
        BOOL bok = pfnOriginal(hWnd, szText);
        delete szText;
        return (bok);
    }
    else
    {
        return (pfnOriginal(hWnd, lpString));
    }
}

试试这个,我机器上完全正常。那个缓冲区是只读的,最好不好随便修改
2016-8-18 14:55
0
雪    币: 293
活跃值: (287)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
你程序没崩溃?
BOOL WINAPI MySetWindowTextW(HWND hWnd, LPWSTR szText)
调用约定没了,栈没平衡。另外记得自己申请内存修改然后再释放,不要在原内存修改
2016-8-18 14:59
0
游客
登录 | 注册 方可回帖
返回