WinHex是个很优秀的Edit Tool,它的版本升级很快,目前好象到9.64了吧。
前面我已介绍了9.5和9.62版的免注册版破解方法,对于初学者来说,大概
有点云里雾里,什么感觉了、运气了,有点玄虚。实际上,还是有章可循
的。这不,今天下载了个9.64版,用了不到二十分钟的时间就破了。
破解常备兵器:
屠龙刀:SoftIce for Win 4.95
依天剑:W32Dasm 8.93
玄铁剑:Hiew 6.40
碧血剑:UltraEdit 8.0
破WinHex只需屠龙刀和玄铁剑两把“粗笨”兵器足矣。

将9.64版本安装上以后,反复打开、关闭若干次后,出现了一个提示对话框,
大意是:这是一个共享软件,可以任意传播和使用,要想得到它的全部功能,
就掏钱注册吧。赶紧设断
    bpx lockmytask
按确定后被断,按几次F12回到WinHex代码区

    0163:0040CE61 Call user32.IsDlgButtonChecked
    0163:0040CE66 dec eax
    0163:0040CE67 sete byte ptr [0045A7F5]
    0163:0040CE6E mov eax, dword ptr [ebp+10]
    0163:0040CE71 push eax
    0163:0040CE72 mov eax, dword ptr [ebp+08]
    0163:0040CE75 push eax
    0163:0040CE76 Call user32.EndDialog
    0163:0040CE7B jmp 0040CE92   〈-返回此处

这是操作提示对话框的调用代码,没有有价值的线索,又按了N次F12(N是几没
有必要告诉你,自己一试便知),再次回到WinHex代码区

    0163:00405018 push ebp
    0163:00405019 mov ebp, esp
    0163:0040501B push ebx
    0163:0040501C push 00000000
    0163:0040501E mov ebx, dword ptr [ebp+08]
    0163:00405021 push ebx
    0163:00405022 push ecx
    0163:00405023 push edx
    0163:00405024 push eax
    0163:00405025 Call user32.DialogBoxParamA
    0163:0040502A pop ebx   〈-返回此处
    0163:0040502B pop ebp
    0163:0040502C ret 0004

这是程序对对话框函数DialogBoxParamA的一个调用,快抓住狐狸的尾巴了。
慢慢追踪,按F12

    0163:0040CF23 mov byte ptr [0045A7AD], 01
    0163:0040CF2A cmp dword ptr [0045A8F0], 00000000
    0163:0040CF31 je 0040CF3B
    0163:0040CF33 mov ebx, dword ptr [0045A8F0]
    0163:0040CF39 jmp 0040CF41
    0163:0040CF3B mov ebx, dword ptr [0045500C]
    0163:0040CF41 push 0040CE04
    0163:0040CF46 mov ecx, dword ptr [0045B728]
    0163:0040CF4C mov edx, 000003E8
    0163:0040CF51 mov eax, ebx
    0163:0040CF53 call 00405018
    0163:0040CF58 mov byte ptr [0045A7AD], 00   〈-返回此处

因为上面的几个短跳均未跳过0040CF53,因此以上的几个内存地址应该不是存放
注册标志的地方。再按两次F12

*   0163:0044E739 cmp byte ptr [0045A7FB], 00
    0163:0044E740 jne 0044E75D
    0163:0044E742 mov eax, 00000004
    0163:0044E747 call 00402980
    0163:0044E74C dec eax
*   0163:0044E74D je 0044E75D
    0163:0044E74F cmp byte ptr [0045A7BF], 00
*   0163:0044E756 jne 0044E75D
    0163:0044E758 call 00432804
    0163:0044E75D mov eax, ebx   〈-返回此处
哈,有戏!在三个*出均可跳过0044E758(即调用对话框)。
[0045A7FB]和[0045A7FB]可疑,下断
    bpm 0045A7BF
重新运行WinHex,被断,将[0045A7BF]设为1,好象没什么作用,判断该处似乎
是决定共享版WinHex运行几次后弹出提示对话框的。PASS,再下断
    bpm 0045A7FB
事实上,从程序流程来看,是否跳过对话框,[0045A7FB]处的优先处理权要高于
[0045A7FB]。果然,重新运行WinHex,被断

**  0163:0043FA2D cmp byte ptr [0045A787], 00
    0163:0043FA34 setne al
    0163:0043FA37 mov edx, 0045A803
    0163:0043FA3C sub edx, 00000008
    0163:0043FA3F mov byte ptr [edx], al     ;EDX=0045A7FB
    0163:0043FA41 push 00000000   〈-此处被断

    d 0045A7FB
将[0045A7FB]改为1,按F5,程序在几处被断,都是来比较[0045A7FB]的值,啥
话也别说,接着按F5,来到主程序窗口。乌拉!已经成注册版本了。
再回过头分析上面的代码,发现[0045A7FB]的值由[0045A787]决定的,[0045A787]
不为0,就表示程序已注册过了。再下断
    bpm 0045A787
重新运行WinHex,程序只在**下一处被断,以前我还纳闷,什么地方给[0045A787]
赋值呢,现在想来,大概是这样的:

    BOOL registed;         /缺省值为FALSE
    ...
    注册模块    
    {
        if  注册码正确
        {
            registed=TRUE;
        }
    }   
    ...
    if registed            /这里对应**处
    {
       已注册版本;
    }
    else
    {
       未注册版本;
    }
 
这里,变量registed即对应内存单元[0045A787],因为一直没有正确的注册,
所以registed=TRUE语句始终没有被执行。
找到了钥匙,开锁就是举手之劳。将**处改为
    cmp byte ptr [0045A787], 01
即可。**处的代码为803D87A7450000,调出Hiew,按F4进入DECODE模式,按F7
搜索803D87A7450000,找到后按F3,把后面的0000改为0001,按F9存盘,退出。
至此,你已得到了全部功能的WinHex9.64免注册版本,是不是感觉挺简单?

写这个破解文章比破解还累,用了我一个下午的时间。但想想看雪同志是那样
勤勤恳恳,辛辛苦苦地为大家整理破解教程,我还能说什么,只要大家高兴就
好。


南阳:woLONGwxd   2001-1-8