引用:
原帖由 zhengboy2000 于 2007-1-1 19:17 发表
在英文版操作系统中没有这个问题,已经有高手(当然不是我啦)知道原因啦,就是你的 X:\windows\system32\comctl32.dll 这个文件要修改一下。我上传了一个,确保替换就可以了,小心windows的文件保护功能。你 ...
slangmgh于2003年8月分析并解决了这个问题。这些软件用到了comctl32.dll中的
SysIPAddress32控件,欲知技术细节请Google之。
我对这些Win32的窗口机制不了解,下面仅仅介绍如何基于slangmgh的分析结果修改
comctl32.dll中的SysIPAddress32控件。为避免版本依赖性,将介绍全过程,使得安
装微软补丁后仍可自剁之。
以英文XP SP2中的5.82.2900.2982版comctl32.dll为例。
在IDA Pro的Names窗口中寻找"SysIPAddress32",顺着交叉引用关系可以定位如下代
码:
--------------------------------------------------------------------------
5D092E82 C7 45 F8 30 2F 09 5D mov dword ptr [ebp-8], offset aSysipaddress32 ; "SysIPAddress32"
5D092E89 FF 15 8C 14 09 5D call ds:_imp__LoadCursorW
5D092E8F 89 45 EC mov [ebp-14h], eax
5D092E92 8B 45 08 mov eax, [ebp+8]
5D092E95 89 45 E4 mov [ebp-1Ch], eax
5D092E98 8D 45 D4 lea eax, [ebp-2Ch]
5D092E9B 50 push eax
5D092E9C 89 75 F4 mov [ebp-0Ch], esi
5D092E9F C7 45 D4 0B 40 00 00 mov dword ptr [ebp-2Ch], 400Bh
5D092EA6 C7 45 D8 5E 4E 0E 5D mov dword ptr [ebp-28h], offset IPAddressWndFn
5D092EAD 89 75 E8 mov [ebp-18h], esi
5D092EB0 C7 45 E0 04 00 00 00 mov dword ptr [ebp-20h], 4
5D092EB7 C7 45 F0 06 00 00 00 mov dword ptr [ebp-10h], 6
5D092EBE 89 75 DC mov [ebp-24h], esi
5D092EC1 FF 15 D8 14 09 5D call ds:_imp__RegisterClassW
--------------------------------------------------------------------------
窗口过程是IPAddressWndFn,下次自剁时可直接在Names窗口中寻找这个函数,或者
直接G到这个函数。在IPAddressWndFn中调用了CreateWindowExW:
--------------------------------------------------------------------------
5D0E4F9B 8B 4D B0 mov ecx, [ebp-50h]
5D0E4F9E 33 C0 xor eax, eax
5D0E4FA0 50 push eax
5D0E4FA1 C6 46 08 00 mov byte ptr [esi+8], 0
5D0E4FA5 C6 46 09 FF mov byte ptr [esi+9], 0FFh
5D0E4FA9 FF 71 04 push dword ptr [ecx+4]
5D0E4FAC FF 75 A8 push dword ptr [ebp-58h]
5D0E4FAF FF 75 AC push dword ptr [ebp-54h]
5D0E4FB2 6A 64 push 64h
5D0E4FB4 6A 64 push 64h
5D0E4FB6 6A 0A push 0Ah
5D0E4FB8 50 push eax
5D0E4FB9 68 01 00 00 40 push 40000001h ; WS_CHILD | ES_CENTER
5D0E4FBE 50 push eax
5D0E4FBF 68 B0 D5 0B 5D push offset aEdit ; "Edit"
5D0E4FC4 50 push eax
5D0E4FC5 FF 15 7C 14 09 5D call ds:_imp__CreateWindowExW
--------------------------------------------------------------------------
0x5D0E4FB9处指定的dwStyle是"WS_CHILD | ES_CENTER",将之改成0x40000081,即
"WS_CHILD | ES_CENTER | ES_AUTOHSCROLL"。
下次自剁时也可以搜索字节流"6A 64 6A 64 6A 0A 50 68 01 00 00 40 50"定位。
以中文2000 SP4中的5.81.3900.7109版comctl32.dll为例。
> fc /b comctl32.dll.old comctl32.dll
00000120: 97 17
00000121: 6D 6E
000239B4: 01 81
在资源管理器里确认%systemroot%\system32\comctl32.dll未因SFC而被自动恢复成
某个早期版本。重启OS使之生效。
☆ 相关程序
> crackcomctl32.exe -i comctl32.dll.old comctl32.dll
infile : comctl32.dll.old
outfile : comctl32.dll
size : 0x00081510
oldsum : 0x00086D97
sum[0] : 0x00086E17
sum[1] : 0x00086E17
succeeded