☆ 修改comctl32.dll中的SysIPAddress32控件 https://scz.617.cn/windows/200701290918.txt 某些版本的Looknstop、Iris其点分十进制IP输入框有点问题,只能输入两位数字, 比如192输不进去,只能输入19。 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为例。 分别备份如下两处的comctl32.dll。这不是必要步骤,但有备无患,强烈建议: %systemroot%\system32\comctl32.dll comctl32.dll.old %systemroot%\ServicePackFiles\i386\comctl32.dll comctl32.dll.orig 然后将%systemroot%\system32\comctl32.dll复制到临时目录,在临时目录里用你熟 悉的16进制编辑工具按前述介绍修改comctl32.dll。如果愿意,可以顺便设置正确的 校验和。对于SYS必须要设置正确的校验和,而DLL可以不理这茬。 > fc /b comctl32.dll.old comctl32.dll 00000120: 97 17 00000121: 6D 6E 000239B4: 01 81 将临时目录里修改好的comctl32.dll严格地按如下顺序复制到相应目录: %systemroot%\ServicePackFiles\i386\ %systemroot%\system32\dllcache\ %systemroot%\system32\ 在资源管理器里试图将%systemroot%\system32\comctl32.dll改名时,说该文件正在 被使用,只好关掉资源管理器,进cmd.exe去干这事: cd %systemroot%\system32\ move comctl32.dll comctl32.dll.old copy \comctl32.dll . 在资源管理器里确认%systemroot%\system32\comctl32.dll未因SFC而被自动恢复成 某个早期版本。重启OS使之生效。 ☆ 相关程序 https://scz.617.cn/windows/crackcomctl32.exe > 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