破解工具:OD 1.1汉化版 WDasm
破解对象:Hex workshop 4.0
破解目的:技术爱好,方便个人使用
软件简介:HexWorkshop为功能较为强大的二进制文件编辑工具,此版本为4.00版,使用期限为35天,随后有10天的购买期
这是小弟发上来的第一个帖子,一直在申请看雪的ID,等了一周才把注册的邮件地址更换成功,好容易可以和板子上的牛人用文字交流啦。真的好开心!:)。Hex workshop 是大多cracker都会接触到的文件修改工具,小菜鸟在入门阶段攻克的几个软件时,修改文件都是用的Hiewdemo。这次调出原来crack掉的文件想看看自己都修改了那些地方,发现Hex的comp功能还是挺方便的。运行Hex,晕,居然要注册,虽然自己不大用它,但在自己电脑上很难容忍出现注册提示框字样。呵呵,看样子又要拿起自己的手术刀给他动动手术了。
察看执行文件hworks32.exe,无壳,VC编译。用OD载入,运行正常,呵呵,初步断定该程序没有反调试检测功能。接下来就是找到程序的关键点,看看能不能看到注册码或者修改跳转直接注册成功了。本人一向不大愿意跟踪软件的算法,尽管我对于能够写出一个软件注册机的牛人是由衷的敬佩。从解过的几个软件来看,无论是狗保护的还是注册码保护的软件,都可以通过修给特定的地方达到暴力破解的目的。(仅针对特定软件哦,不要认为所有的都可以,要不然有人要骂我误导看客啦,:))跟踪软件作者算法我觉得是很费力不讨好的事情,而且很多算法往往不是个人能够短时间吃透搞定的,不如直接越过算法来的简洁明了。当然这种方式也有它很大的局限性,比如没有找到关键地方可能就会造成软件运行异常,或者破解不全,运行不稳定等等问题。
找到软件关键的地方在于正确的下断点。通过Wdasm查找注册失败对话框的提示字符串,晕!居然没有。现在很多软件都把这些信息加密,或者放在链接库中了。本程序就是放在链接库中验证注册码的,当然这是后话啦。随后我考虑在Od中针对字符串比较函数,字符提取函数,对话框函数,Messagebox函数下断,在输入注册信息后,软件都能顽固的给出注册失败的提示信息。晕倒,看样子要卡壳了。嘿嘿,大虾请勿见笑,为了下断,我连窗口工具都用上了,主要是前面都用得SIce,这两天才转到OD上来,很多方法还在尝试,总之就是断不下来。
天无绝人之路,我发现点击注册按钮后,程序会MMJJ的算半天才出现出错对话框,呵呵 ,看样子算个注册码它还挺吃力的。好了,就钻这个空子。在点击注册按钮后,迅速切换到Od,按下F12让程序停住,运气好的话你会停在bpsregwd.dll中的代码10002DE1处,如果停在Ntdll(笔者用得xp系统)中也没关系,往下运行几条代码就到了 。好了 ,我们断在注册码验证代码之前或者之后了,总之还没有出现出错的对话框。往下跟跟,呵呵 运行到10002e1c出调用10002288函数,随后就发生判断了,可以发现这儿就是关键的验证注册码的地方。试着改改跳转,让他不跳。随便输入注册信息,呵呵,注册正确的提示框出现了!搞定?别高兴太早,重起Hex,你会发现依然是评估版本。看样子我们要跟入验证函数看看了。以下是关键的代码段,贴出来供大家参考。
bpsregwd.dll中的代码:
10002288 55 push ebp
10002289 8BEC mov ebp,esp
1000228B 81EC C4010000 sub esp,1C4
10002291 53 push ebx
10002292 8D45 F8 lea eax,dword ptr ss:[ebp-8]
10002295 56 push esi
10002296 50 push eax
10002297 E8 68B00000 call bpsregwd.1000D304
1000229C 6A 02 push 2
1000229E 8D45 F6 lea eax,dword ptr ss:[ebp-A]
100022A1 5E pop esi
100022A2 50 push eax
100022A3 8D45 FE lea eax,dword ptr ss:[ebp-2]
100022A6 50 push eax
100022A7 8D45 F7 lea eax,dword ptr ss:[ebp-9]
100022AA 50 push eax
100022AB 8D45 F0 lea eax,dword ptr ss:[ebp-10]
100022AE 50 push eax
100022AF 8D45 FF lea eax,dword ptr ss:[ebp-1]
100022B2 50 push eax
100022B3 8D45 EC lea eax,dword ptr ss:[ebp-14]
100022B6 50 push eax
100022B7 8D45 E8 lea eax,dword ptr ss:[ebp-18]
100022BA 50 push eax
100022BB FF75 20 push dword ptr ss:[ebp+20]
100022BE E8 A0FCFFFF call bpsregwd.10001F63 //此处可以跟入察看一下
100022C3 83C4 20 add esp,20
100022C6 84C0 test al,al
100022C8 0F84 8D010000 je bpsregwd.1000245B ; 不跳 nop
100022CE 8B45 0C mov eax,dword ptr ss:[ebp+C]
100022D1 3845 FF cmp byte ptr ss:[ebp-1],al
100022D4 0F85 7E010000 jnz bpsregwd.10002458 ; 不跳 nop
100022DA 8B75 10 mov esi,dword ptr ss:[ebp+10]
100022DD 3975 F0 cmp dword ptr ss:[ebp-10],esi
100022E0 0F8C 72010000 jl bpsregwd.10002458
100022E6 8D8D 3CFEFFFF lea ecx,dword ptr ss:[ebp-1C4]
100022EC 51 push ecx
100022ED FF75 F0 push dword ptr ss:[ebp-10]
100022F0 50 push eax
100022F1 FF75 08 push dword ptr ss:[ebp+8]
100022F4 E8 B7F7FFFF call bpsregwd.10001AB0
100022F9 83C4 10 add esp,10
100022FC 33DB xor ebx,ebx
100022FE 84C0 test al,al
10002300 75 15 jnz short bpsregwd.10002317
10002302 68 AC010000 push 1AC
10002307 8D85 3CFEFFFF lea eax,dword ptr ss:[ebp-1C4]
1000230D 53 push ebx
1000230E 50 push eax
1000230F E8 4C1E0000 call bpsregwd.10004160
10002314 83C4 0C add esp,0C
10002317 FF75 20 push dword ptr ss:[ebp+20]
1000231A 8D85 3CFEFFFF lea eax,dword ptr ss:[ebp-1C4]
10002320 50 push eax
10002321 E8 2A150000 call bpsregwd.10003850
10002326 FF75 18 push dword ptr ss:[ebp+18]
10002329 8D85 5CFEFFFF lea eax,dword ptr ss:[ebp-1A4]
1000232F 50 push eax
10002330 E8 1B150000 call bpsregwd.10003850
10002335 FF75 1C push dword ptr ss:[ebp+1C]
10002338 8D85 ACFEFFFF lea eax,dword ptr ss:[ebp-154]
1000233E 50 push eax
1000233F E8 0C150000 call bpsregwd.10003850
10002344 83C4 18 add esp,18
10002347 8D85 FCFEFFFF lea eax,dword ptr ss:[ebp-104]
1000234D FF75 E8 push dword ptr ss:[ebp-18]
10002350 68 C0B10110 push bpsregwd.1001B1C0 ; ASCII "%06d"
10002355 50 push eax
10002356 E8 60160000 call bpsregwd.100039BB
1000235B FF75 08 push dword ptr ss:[ebp+8]
1000235E 8D85 1CFFFFFF lea eax,dword ptr ss:[ebp-E4]
10002364 50 push eax
10002365 E8 E6140000 call bpsregwd.10003850
1000236A 8B45 EC mov eax,dword ptr ss:[ebp-14]
1000236D 83C4 14 add esp,14
10002370 385D FE cmp byte ptr ss:[ebp-2],bl
10002373 8985 3CFFFFFF mov dword ptr ss:[ebp-C4],eax
10002379 8B45 14 mov eax,dword ptr ss:[ebp+14]
1000237C 8985 64FFFFFF mov dword ptr ss:[ebp-9C],eax
10002382 74 65 je short bpsregwd.100023E9 ; 跳 EB65
10002384 399D 4CFFFFFF cmp dword ptr ss:[ebp-B4],ebx
1000238A 6A 01 push 1
1000238C 58 pop eax
1000238D 8985 40FFFFFF mov dword ptr ss:[ebp-C0],eax
10002393 0F85 99000000 jnz bpsregwd.10002432
10002399 8985 48FFFFFF mov dword ptr ss:[ebp-B8],eax
1000239F 8985 4CFFFFFF mov dword ptr ss:[ebp-B4],eax
100023A5 8B45 F8 mov eax,dword ptr ss:[ebp-8]
100023A8 51 push ecx
100023A9 8985 54FFFFFF mov dword ptr ss:[ebp-AC],eax
100023AF 8985 58FFFFFF mov dword ptr ss:[ebp-A8],eax
100023B5 8BC4 mov eax,esp
100023B7 899D 44FFFFFF mov dword ptr ss:[ebp-BC],ebx
100023BD C785 50FFFFFF 0F000000 mov dword ptr ss:[ebp-B0],0F
100023C7 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
100023CA C700 80C61300 mov dword ptr ds:[eax],13C680
100023D0 E8 16070000 call bpsregwd.10002AEB
100023D5 8B45 F8 mov eax,dword ptr ss:[ebp-8]
100023D8 56 push esi
100023D9 FF75 0C push dword ptr ss:[ebp+C]
100023DC 8985 5CFFFFFF mov dword ptr ss:[ebp-A4],eax
100023E2 E8 62F5FFFF call bpsregwd.10001949
100023E7 EB 47 jmp short bpsregwd.10002430
100023E9 8B45 F8 mov eax,dword ptr ss:[ebp-8]
100023EC 838D 50FFFFFF FF or dword ptr ss:[ebp-B0],FFFFFFFF
100023F3 56 push esi
100023F4 899D 40FFFFFF mov dword ptr ss:[ebp-C0],ebx
100023FA FF75 0C push dword ptr ss:[ebp+C]
100023FD 899D 44FFFFFF mov dword ptr ss:[ebp-BC],ebx
10002403 899D 48FFFFFF mov dword ptr ss:[ebp-B8],ebx
10002409 C785 4CFFFFFF 01000000 mov dword ptr ss:[ebp-B4],1
10002413 8985 54FFFFFF mov dword ptr ss:[ebp-AC],eax
10002419 8985 58FFFFFF mov dword ptr ss:[ebp-A8],eax
1000241F 8985 5CFFFFFF mov dword ptr ss:[ebp-A4],eax
10002425 899D 60FFFFFF mov dword ptr ss:[ebp-A0],ebx
1000242B E8 80F5FFFF call bpsregwd.100019B0
10002430 59 pop ecx
10002431 59 pop ecx
10002432 8D85 3CFEFFFF lea eax,dword ptr ss:[ebp-1C4]
10002438 50 push eax
10002439 56 push esi
1000243A FF75 0C push dword ptr ss:[ebp+C]
1000243D FF75 08 push dword ptr ss:[ebp+8]
10002440 E8 7EF8FFFF call bpsregwd.10001CC3
10002445 83C4 10 add esp,10
10002448 F6D8 neg al
1000244A 1BC0 sbb eax,eax
1000244C 80E4 FE and ah,0FE
1000244F 05 01010000 add eax,101
10002454 8BF0 mov esi,eax
10002456 EB 03 jmp short bpsregwd.1000245B
10002458 6A 05 push 5
1000245A 5E pop esi
1000245B 8BC6 mov eax,esi
1000245D 5E pop esi
1000245E 5B pop ebx
1000245F C9 leave
10002460 C3 retn
笔者试着深入跟进了几个函数,想找到正确的注册码,转了几次头晕了,呵呵呵,功力有限,有待继续修炼。依照上面的代码跳转情况,联系程序中的文字提示,可以很快试出正确的验证流程。有趣的是深入改掉几个跳转,虽然不能注册成功,却可以延长试用的期限,嘿嘿,由于我没有做流程记录,自己也不知道改哪儿了,:),有兴趣的大家可以shishi。不过不要一开始就用我给的跳转方法哦,注册成功了,你就再也找不到注册的按钮了,想再进来看看流程都不行,我想这时候bpsregwd.dll文件也完成了他的使命,没什么作用了。:),推测而已,没有验证。你可以把它删除看看,哈哈!
总结:今天刚刚发现最新版的Hex workshop都有注册机了,放上来不是为了大家用这个软件有多大用处。我想更多的是介绍一下下断点的方法和分享破解软件的一些思路吧,期待与大家一块儿进步!:)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!