对于破解来说,本人是个新的不能再新的人,好在也是做软件行业的,但水平有限,不过也不至于到隔行的地步。初来乍到,久闻看雪高墙下深不可测,望高手指点一二,感激不尽。
最近公司引入一款测试软件,名字就不提了,是个比较新颖的产品不过也出到7.x了。这款软件比较强大,各方面都很不错,公司总部也在联络购买事宜,但这个过程需要点时间,由于我们现在处于对软件的学习和研究阶段,此软件注册前的限制极其恶心,实在忍受不了,于是萌生破意。
下面进入正题,软件只能说破了浅浅的一点点,实在继续不下去了,望高手们浪费点时间看完,给一点援助。
【软件结构】XXXX.exe(主程序),tcCore.dll(注册检查等核心),以及N多dll+多线程
【壳】PEID 0.95 查壳 "yota's .......",根据各方面判断,此壳似乎为vmp
【软件限制】1. 30天试用
2. 每个脚本代码行数限制500行
3. 每个项目脚本个数限制2个
4. 最多可建项目限制6个
5. 等
萌生破意以来一直用OD研究,开始用PEID 0.94对主程序查壳,显示无壳delphi 6.0-7.0,于是菜菜的我进入3天的死胡同才发现原来关键在tcCore.dll。
PEID 0.94对此文件查壳,显示什么也找到。于是菜菜的我认为这个文件没有壳,又3天过去了,牺牲了我的休息时间,于是觉得自己还太弱放弃了。
过了1天,想了想久闻PEID是各路好手的得利工具,怎么来个什么也没找到,而且发现程序语言也没找到,感觉有些不对,于是没事在网上寻觅,下了PEID 0.95查壳显示“yota's .....”,具体是什么给忘了,于是激动万分,破解的激情又来了。
接下来1个星期在网上找寻各种yota的脱壳工具及脚本,终无济于事,加上身心疲惫,于是又放弃了。
又过了3天,由于目前公司没什么事,大家在研究软件的使用和测试脚本的编写。当那天打开这个软件的时候,30天试用已经过了,6-7台机器不能使用了。于是又把工作搬到了虚拟机上。每当在虚拟机上打开这个软件的时候总是有种不甘心,也确定很不方便。于是有意无意的又在网上查了起来,当然查资料的过程,总是在看雪找到了下一步的曙光。
有人说一个强劲的壳人称VMP,会误导查壳工具。于是在OD里看了看汇编代码,在网上搜了搜比对了一下,发现我被骗了。这个壳极有可能是VMP,于是心中又喜,知道是什么壳就好办了。可惜好景不长,人人都说VMP壳新手别想脱,灰心至极,心想这算真的无能为力了。
这次的放弃时间较长,VMP高手都不好脱,更别提自己了。还是有意无意在网上乱搜,也常有人说不脱壳有不脱壳的破法,得知了传说中的ESP定律。从上学的时候就一直对定律这种东西头疼,认为只有牛顿才懂。试着学了学,大意就是入栈出栈的指针值永远不会变。但就算知道这个原理跟了程序很长一段跳来跳去的,也不知道怎么弄了。还是功力太浅啊。就这样又过了1个星期。
某天,无意中发现了C盘my document目录中相对应这个软件的文件夹下有个regkey.dat文件,对这文件破解是不可能的了,于是就把这个文件给删了,再次运行软件的时候就又弹出了最开始需要输入activation key的对话框了,又有些激动,把试用的激活码又输了一遍。结果很显然,当然不能用,还是提示过期了。之后又灵机一动,输个错的,提示激活码错误的对话框出来了。
这下有了这么多线索,激情重燃。先不管别的试着各种情况下对MessageBoxA下断点看看有什么,结果真断下了。返回到程序领空的时候,代码如下:
11269B10 00 DB 00
11269B11 E8 DB E8
11269B12 F6 DB F6
11269B13 84 DB 84
11269B14 F9 DB F9
11269B15 FF DB FF
11269B16 33 DB 33 ; CHAR '3'
11269B17 C0 DB C0
11269B18 5A DB 5A ; CHAR 'Z'
11269B19 59 DB 59 ; CHAR 'Y'
11269B1A 59 DB 59 ; CHAR 'Y'
11269B1B 64 DB 64 ; CHAR 'd'
11269B1C 89 DB 89
这一堆一堆的根本看不懂,加上用OD加载DLL的时候就总提示说这个是自解压文件,代码是运行时才出来,这就真没办法了。在网上花了好长时间搜自解压文件怎么办也没什么结果。就在又要放弃的时候,看雪有个帖子里说右键->分析->从模块删除分析。我试了一下,果然可以看见汇编代码了,至今不知道这是为什么。
看见代码了又断下消息框,代码如下:
1126929F 61 POPAD
112692A0 6C INS BYTE PTR ES:[EDI],DX ; I/O 命令
112692A1 204461 79 AND BYTE PTR DS:[ECX+79],AL
112692A5 73 20 JNB SHORT tcCore.112692C7
112692A7 4C DEC ESP
112692A8 65:66:74 00 JE SHORT 000092AC ; 多余的前缀
112692AC 55 PUSH EBP
112692AD 8BEC MOV EBP,ESP
112692AF B9 05000000 MOV ECX,5
112692B4 6A 00 PUSH 0
112692B6 6A 00 PUSH 0
112692B8 49 DEC ECX
112692B9 ^ 75 F9 JNZ SHORT tcCore.112692B4
112692BB 51 PUSH ECX
112692BC 33C0 XOR EAX,EAX
112692BE 55 PUSH EBP
112692BF 68 8F942611 PUSH tcCore.1126948F
112692C4 64:FF30 PUSH DWORD PTR FS:[EAX]
112692C7 64:8920 MOV DWORD PTR FS:[EAX],ESP
112692CA 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
112692CD 50 PUSH EAX
112692CE E8 B9FBFFFF CALL tcCore.11268E8C
112692D3 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
112692D6 837D FC 01 CMP DWORD PTR SS:[EBP-4],1
112692DA 75 0A JNZ SHORT tcCore.112692E6 //小弟只能找到这里,如果把Z改成1的话让它不跳转,就能到达一个试用对话框,只要改这里就可以无限的试用了。实在找不出怎么改成正式版。
112692DC E8 FBFEFFFF CALL tcCore.112691DC
112692E1 E9 81010000 JMP tcCore.11269467
.
.
.
11269348 FFEB JMP FAR EBX ; 非法使用寄存器
.
.
.
11269448 6A 7D PUSH 7D
1126944A 48 DEC EAX
1126944B C183 D9FF30D8 A>ROL DWORD PTR DS:[EBX+D830FFD9],0AB ; 移位常量超出 1..31 的范围
.
.
.
11269560 BA 02000000 MOV EDX,2
11269565 E8 767DF9FF CALL tcCore.112012E0
1126956A C3 RETN
1126956B ^ E9 387CF9FF JMP tcCore.112011A8
11269570 ^ EB DB JMP SHORT tcCore.1126954D
11269572 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
11269575 807D FB 00 CMP BYTE PTR SS:[EBP-5],0
11269579 74 0F JE SHORT tcCore.1126958A
.
.
.
11269618 8BE5 MOV ESP,EBP
1126961A 5D POP EBP
1126961B C3 RETN
1126961C FFFF ??? ; 未知命令
1126961E FFFF ??? ; 未知命令
.
.
.
1126963E 61 POPAD
1126963F 6263 64 BOUND ESP,QWORD PTR DS:[EBX+64]
11269642 65:66:67:68 696>PUSH 6A69 ; 多余的前缀
11269648 6B6C6D 6E 6F IMUL EBP,DWORD PTR SS:[EBP+EBP*2+6E],6F
1126964D 70 71 JO SHORT tcCore.112696C0
1126964F 72 73 JB SHORT tcCore.112696C4
11269651 74 75 JE SHORT tcCore.112696C8
11269653 76 77 JBE SHORT tcCore.112696CC
11269655 78 79 JS SHORT tcCore.112696D0
11269657 7A 00 JPE SHORT tcCore.11269659
11269659 0000 ADD BYTE PTR DS:[EAX],AL
1126965B 0055 8B ADD BYTE PTR SS:[EBP-75],DL
1126965E EC IN AL,DX ; I/O 命令
1126965F 83C4 F8 ADD ESP,-8
.
.
.
1126971C 6A 30 PUSH 30
1126971E 6A 01 PUSH 1
11269720 68 AC992611 PUSH tcCore.112699AC ; ASCII "MAINICON"
11269725 A1 04105311 MOV EAX,DWORD PTR DS:[11531004]
1126972A 50 PUSH EAX
1126972B E8 CC88F9FF CALL tcCore.11201FFC
.
.
.
112699DE 6A 00 PUSH 0
112699E0 49 DEC ECX
112699E1 ^ 75 F9 JNZ SHORT tcCore.112699DC //这里和下面对应,不是注册成功就是试用过期。
112699E3 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
.
.
.
11269A16 68 589B2611 PUSH tcCore.11269B58
11269A1B 68 5C9B2611 PUSH tcCore.11269B5C ; ASCII "Demo"
11269A20 E8 77F4FFFF CALL tcCore.11268E9C
11269A25 84C0 TEST AL,AL
11269A27 0F84 93000000 JE tcCore.11269AC0 //这里具体跳什么对话框忘了,反正是注册成功或者是试用过期,此注册成功并不是没事了,只是一个提示框,需要重启程序验证
11269A2D 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
.
.
.
11269A51 68 5C9B2611 PUSH tcCore.11269B5C ; ASCII "Demo" //看见这个demo极其不爽,也不知道怎么办
11269A56 E8 49F4FFFF CALL tcCore.11268EA4
11269A5B 6A 00 PUSH 0
11269A5D 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14]
11269A60 50 PUSH EAX
.
.
.
11269AAA 6A 00 PUSH 0
11269AAC E8 5B85F9FF CALL tcCore.1120200C
11269AB1 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
11269AB4 C780 4C020000 0>MOV DWORD PTR DS:[EAX+24C],1
11269ABE EB 56 JMP SHORT tcCore.11269B16 //这里直接跳到提示框之下
11269AC0 6A 10 PUSH 10 //看来是有地方跳到这里然后往下提示注册失败
11269AC2 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
11269AC5 50 PUSH EAX
.
.
.
11269B06 8B45 D0 MOV EAX,DWORD PTR SS:[EBP-30]
11269B09 E8 9A77F9FF CALL tcCore.112012A8
11269B0E 50 PUSH EAX
11269B0F 6A 00 PUSH 0
11269B11 E8 F684F9FF CALL tcCore.1120200C //从11269AC0到这里是激活失败的提示框
11269B16 33C0 XOR EAX,EAX
11269B18 5A POP EDX
11269B19 59 POP ECX
11269B1A 59 POP ECX
11269B1B 64:8910 MOV DWORD PTR FS:[EAX],EDX
11269B1E 68 529B2611 PUSH tcCore.11269B52
11269B23 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
11269B26 BA 04000000 MOV EDX,4
11269B2B E8 F076F9FF CALL tcCore.11201220
11269B30 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
11269B33 BA 02000000 MOV EDX,2
11269B38 E8 E376F9FF CALL tcCore.11201220
11269B3D 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
11269B40 BA 02000000 MOV EDX,2
11269B45 E8 D676F9FF CALL tcCore.11201220
11269B4A C3 RETN
经过苦苦追寻,只能找到如下结果
112692D6 837D FC 01 CMP DWORD PTR SS:[EBP-4],1
这个位置,只要让结果为0,下面跳的时候就能跳到试用,继而可以达到过期还能继续反复试用。虽然软件没破了,但是这个结果已经足已让我窃喜了,于是直接改指令达到目的,结果证明我想的过于简单了,人家是自解压的,代码不能直接改。我的天,每次在惊喜中总有失望。
又到网上,又看到看雪达人的只字片语,了解了传说中的SMC破解技术,小学习了一下就霸王硬上了。
据观察上面112692D6这句指令中EBP-4中的值是2,事到如今也管不了为什么是2了,就直接想把后面比较的值也改成2就得了。在这句下硬件写入断点,找到了写入01的时候,又在其之后随便找到了一个非自解压的JMP,又苦寻了一段非自解压占用的空闲内存(这个过程省略N千字)。好,现在只省patch了。JMP跳到找的那一段空内存,在空内存上放了几行指令:
CMP BYTE PTR DS:[112692D9], 1 //先判断这个地址中是否已经放了1
JNZ SHORT (第四行) //如果不是,跳过第三行修改指令
MOV BYTE PTR DS:[112692D9], 2 //如果是,修改为2
JMP (原JMP跳转的地方) //跳回原程序
调试了N次后,终于可以了,高手看到这里肯定应该笑了。没错,后来才发现这里写的112692D9
是死地址,DLL的基址会变的,这样一来只能在OD下运行,单独运行不了,更别提放到别的机器上了。这是问题其一,其二是后面的1和2这个数值会根据regkey.dat文件变化,这些都不管了,需要时连同我的regkey.dat一块拷贝得了。
到目前为止,小弟才疏学浅,也只能到这地步了,其间经历的困难重重,浪费的时间与精力不可估量,常常做梦都在想,这些我都无怨言,怪自己能力不够,只为坚持着这个精神。我不相信破不了这个软件。。今天发帖请高手帮助,望看在我费的力气份上指点一二,感激不尽。
两个问题:
1. 怎么把我上面的补丁指令中的内存改成可以适应基址变化的?
2. 如果可能,给一些破解成正式版的思路?
ps:关于试用版,有个dialog,这个dialog可能是这个软件自定义的。上面有三个按钮:try now, buy now, cancel。每次试用的时候都要点try now。之后就进程序了没有提示框。另外两个也没什么突破点。不知道下什么断点能断到这个窗口。
ps2:点试用进入程序后,如果创建了三个脚本,再随便运行一个的话,会有提示框提示试用版有限制不能创建超过2个脚本,这个提示框看似像messagebox,但里面还有个help按钮。 而且一旦进入了程序,在OD下,主线程就结束了,不知道怎么断这个消息框。
最后,小弟由于情急发帖,如果违反了规定望版主见谅加告之。
小弟在此拜谢~
2010.7.19
刚刚学习了重定位,豁然开朗,应用于上面的SMC代码,变成:
117B31D4 53 PUSH EBX
117B31D5 E8 00000000 CALL tcCore_r.117B31DA
117B31DA 5B POP EBX
117B31DB 81EB DA315B00 SUB EBX,5B31DA
117B31E1 80BB D9920600 0>CMP BYTE PTR DS:[EBX+692D9],1
117B31E8 5B POP EBX
117B31E9 75 15 JNZ SHORT tcCore_r.117B3200
117B31EB 53 PUSH EBX
117B31EC E8 00000000 CALL tcCore_r.117B31F1
117B31F1 5B POP EBX
117B31F2 81EB F1315B00 SUB EBX,5B31F1
117B31F8 C683 D9920600 0>MOV BYTE PTR DS:[EBX+692D9],5
117B31FF 5B POP EBX
117B3200 ^ E9 7C75E8FF JMP tcCore_r.1163A781
这样一来这个dll在什么地方都可以运行了,终于达到无限期试用了,继续向下一步努力 ~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课