重启验证软件破解思路二
破解作者
yzez[DFCG][BCG][FCG]
破解对象
无敌文件批处理大师 V1.0.1
软件介绍
软件大小: 688 KB
软件语言: 简体中文
软件类别: 国产软件 / 共享版 / 文件更名
应用平台: Win9x/NT/2000/XP
界面预览: 无
加入时间: 2003-11-14 09:23:39
下载次数: 24
计算机用户必备!口号:我们处理一切关于“文件批量处理”。功能:文件和文件夹各种方式的更名、
批量文件分割、文件内容替换等功能,并且在以后陆续增加图片大小转换、图像格式转换、音乐文件压缩
比更改等更多实用功能,该软件的设计以人为本,处处为用户着想,没有华丽的外表,却有众多强大且实
用的功能,既能满足一般用户的需求,也能照顾到高级的使用者。
下载地址
http://www.skycn.com/soft/14515.html
破解工具
pe-scan、OllyDbg 1.09、C32Asm(PLL621的作品,很感谢)
破解目的
只为交流技术,请不要用于商业目的,多支持国产软件。
破解过程
说明:这个软件注不注册,影响并不太大,没有使用时期限制,是否有功能限制我没有去看,写这篇
文章只为说明重启验证破解的一种思路,这个软件重启后,还是会弹出注册界面,前面我写过两篇关于这
种情况重启验证软件的破解思路,这篇文章将从另一角度来说明它的破解。这种破解方法是充分利用软件
的有用信息去找关键点,下面看过程。
1、用pe-scan查壳,是ASPack 2.11的壳,用pe-scan轻松脱壳,脱壳后的程序正常运行。用C32Asm反汇编,
查找有用信息,用W32DASM反汇编没有反应,我倒!不知怎么一回事,找有用信息:已注册。
::004E94D2:: PUSH EBP
::004E94D3:: PUSH 4E95ED
::004E94DB:: MOV FS:[EAX],ESP
::004E94DE:: CALL 004C8C98 ************这是关键CALL吗?在此设断吧!
::004E94E3:: MOV EBX,EAX
::004E94E5:: MOV [ESI+428],BL
::004E94EB:: TEST BL,BL****************测试BL的值是否为0,为0就跳,跳到何处?
::004E94ED:: JE SHORT 004E9522*********为0就跳,跳到004E9522,跳过了下面的已注册!不跳会怎样?
::004E94EF:: LEA EDX,[EBP-C]
::004E94F2:: MOV EAX,[4EEDC4]
::004E94F7:: MOV EAX,[EAX]
::004E94F9:: CALL 004673C4
::004E94FE:: PUSH DWORD PTR [EBP-C]
::004E9501:: PUSH 4E9604 ->: V1.01
::004E9506:: PUSH 4E9614 ->: 已注册*****看,我们找到这里!往上找一找,有什么!
::004E950B:: LEA EAX,[EBP-8]
2、运行脱壳后的程序,输入注册码:1234567890,点确定程序要求重启验证,我们就退出程序,然后用
OllyDbg 1.09载入脱壳后的程序,在004E94DE处设置好断点,按F9程序运行,一会儿就被断在这个地方:
004E94D8 PUSH DWORD PTR FS:[EAX]
004E94DB MOV DWORD PTR FS:[EAX], ESP
004E94DE CALL unpack.004C8C98***********我们在此设断,按F9运行程序,被断,关键CALL按F7跟进!
004E94E3 MOV EBX, EAX
004E94E5 MOV BYTE PTR DS:[ESI+428], BL
004E94EB TEST BL, BL********************注册成功,BL的值为1,反之则为0
004E94ED JE SHORT unpack.004E9522*****为0就跳,跳就失败!
004E94EF LEA EDX, [LOCAL.3]
004E94F2 MOV EAX, DWORD PTR DS:[4EEDC4]
004E94F7 MOV EAX, DWORD PTR DS:[EAX]
004E94F9 CALL unpack.004673C4
004E94FE PUSH [LOCAL.3]
004E9501 PUSH unpack.004E9604
004E9506 PUSH unpack.004E9614
004E950B LEA EAX, [LOCAL.2]
004E950E MOV EDX, 3
======================================================================================
关键CALL的代码:
004C8C98 MOV EAX, DWORD PTR DS:[4EEF8C]
004C8C9D MOV EAX, DWORD PTR DS:[EAX]
004C8C9F MOV EAX, DWORD PTR DS:[EAX+8]
004C8CA2 CALL unpack.004C8AE8***************算法CALL,按F7跟进!代码看下面!
004C8CA7 RETN**********************************返回指令!
========================================================================================
算法CALL的代码:
004C8AE8 PUSH EBP********跟进算法CALL我们停在这里!
004C8AE9 MOV EBP, ESP
004C8AEB XOR ECX, ECX
004C8AED PUSH ECX
*********************省略!************************************
004C8B1D MOV EAX, EBX
004C8B1F CALL unpack.0040E9A8
004C8B24 MOV EAX, [LOCAL.1]***********试验码移入EAX
004C8B27 CALL unpack.00404D1C
004C8B2C CMP EAX, 10******************EAX的值是0A(十进制值是10)试验码的位数,比较0A和10(十进制值是16)
**************也就是说试验码必须是16位
004C8B2F JE SHORT unpack.004C8B38****相等就跳到下面进一步处理!
004C8B31 XOR EBX, EBX*****************不相等往下,EBX清0,BL的值就为0,失败!
004C8B33 JMP unpack.004C8C3C**********无条件跳到:004C8C3C处,所以重新来过,输入试验码:1234567887654321
004C8B38 MOV EAX, [LOCAL.1]***********相等跳到此,试验码:1234567887654321移入EAX
004C8B3B CALL unpack.004A3CEC**********此CALL检验输入的试验码是否是0--9之间的数字,是就置AL的值为1,反之为0
004C8B40 TEST AL, AL*******************测试AL的值是否为0
004C8B42 JNZ SHORT unpack.004C8B4B****不为0就跳,为0就不跳,往下,失败!
004C8B44 XOR EBX, EBX*****************不相等往下,EBX清0,BL的值就为0,失败!
004C8B46 JMP unpack.004C8C3C**********无条件跳到:004C8C3C处
004C8B4B LEA ECX, [LOCAL.3]************跳到这里!
004C8B4E MOV EDX, 1********************赋EDX常数1
004C8B53 MOV EAX, [LOCAL.1]************试验码入EAX
004C8B56 CALL unpack.004A3EBC
004C8B5B MOV EAX, [LOCAL.3]
004C8B5E CALL unpack.004093AC***********取试验码的最后一位1入EAX
004C8B63 MOV ECX, EAX******************EAX的初始值是1,把这个值移入ECX
004C8B65 MOV EAX, ECX
004C8B67 MOV ECX, 3********************把3送入ECX
004C8B6C CDQ*******************************EDX清0
004C8B6D IDIV ECX***********************EAX=EAX/ECX=1/3,商0放EAX,余数1放EDX
004C8B6F MOV ESI, EDX******************把余数1送到ESI
004C8B71 XOR EBX, EBX******************EBX清0
004C8B73 LEA EAX, [LOCAL.4]
004C8B76 PUSH EAX
004C8B77 MOV EDX, EBX******************EBX的值是0,这个值移入到EDX中
004C8B79 ADD EDX, EDX******************EDX自身相加,0+0=0
004C8B7B ADD EDX, ESI******************EDX=EDX+ESI=0+1=1
004C8B7D ADD EDX, 2********************EDX=EDX+2=1+2=3,
004C8B80 MOV ECX, 1
004C8B85 MOV EAX, [LOCAL.1]************把试验码送入EAX,取试验码的第3位:3
004C8B88 CALL unpack.00404F74
004C8B8D MOV EDX, [LOCAL.4]
004C8B90 LEA EAX, [LOCAL.2]
004C8B93 CALL unpack.00404D24
004C8B98 INC EBX***********************EBX加1
004C8B99 CMP EBX, 6********************比较EBX是否等于6!
004C8B9C JNZ SHORT unpack.004C8B73********循环,循环6次,这个循环取试验的值,依次取:3、5、7、9、11、13
**********************6位,连接起来就是:357864
004C8B9E XOR ESI, ESI*********************ESI清0
004C8BA0 MOV EBX, 1***********************赋EBX的值为1,EBX做计数器!
004C8BA5 LEA EAX, [LOCAL.5]***************赋EAX地址值
004C8BA8 MOV EDX, [LOCAL.1]***************试验码入EDX
004C8BAB MOV DL, BYTE PTR DS:[EDX+EBX-1]**取试验码的第1位:1
004C8BAF CALL unpack.00404C44
004C8BB4 MOV EAX, [LOCAL.5]
004C8BB7 CALL unpack.004093AC**************此CALL把取出的第1位试验码:1送入EAX
004C8BBC ADD ESI, EAX*********************ESI=ESI+EAX=0+1=1
004C8BBE INC EBX**************************EBX加1,做计数器!
004C8BBF CMP EBX, 11**********************比较EBX的值是否等于11
004C8BC2 JNZ SHORT unpack.004C8BA5********循环,这个循环是把试验码的各位相加:1+2+3+4+5+6+-----+1=48,值存放在ESI
004C8BC4 MOV EAX, [LOCAL.2]***************把上面取出的6位试验码:357864入EAX
004C8BC7 MOV EDX, unpack.004C8C80*********固定字串值472008入EDX
004C8BCC CALL unpack.00404E60
004C8BD1 JB SHORT unpack.004C8BE6********比较:357864和472008,低于就跳走!一跳就失败!
004C8BD3 MOV EAX, [LOCAL.2]***************把上面取出的6位试验码:357864入EAX
004C8BD6 MOV EDX, unpack.004C8C90*********固定字串值500000入EDX
004C8BDB CALL unpack.00404E60
004C8BE0 JA SHORT unpack.004C8BE6********比较:357864和500000,高于就跳走!一跳就失败!
004C8BE2 MOV BL, 1************************不跳到这里,赋BL的值为1
004C8BE4 JMP SHORT unpack.004C8BE8********无条件跳!
004C8BE6 XOR EBX, EBX********************跳到这里EBX清0
004C8BE8 TEST BL, BL**********************004C8BE2处跳来,测试BL的值!
004C8BEA JE SHORT unpack.004C8C3C*******为0就跳,跳就失败!不跳往下!
004C8BEC XOR EBX, EBX********************EBX清0
004C8BEE CMP ESI, 39*********************比较ESI与39,ESI的值是:48
004C8BF1 JL SHORT unpack.004C8BFA*******小于就跳走
004C8BF3 CMP ESI, 39*********************比较ESI与39
004C8BF6 JG SHORT unpack.004C8BFA*******大于就跳走!相等呢?不跳!就成功
004C8BF8 MOV BL, 1***********************赋BL的值为1
004C8BFA CMP ESI, 47*********************同上!
004C8BFD JL SHORT unpack.004C8C06
004C8BFF CMP ESI, 48*********************同上!
004C8C02 JG SHORT unpack.004C8C06*******大于就跳,等于48就不跳!就成功
004C8C04 MOV BL, 1
004C8C06 CMP ESI, 64
004C8C09 JL SHORT unpack.004C8C12
004C8C0B CMP ESI, 65
004C8C0E JG SHORT unpack.004C8C12*******等于65就成功!
004C8C10 MOV BL, 1
004C8C12 CMP ESI, 6F
004C8C15 JL SHORT unpack.004C8C1E
004C8C17 CMP ESI, 6F
004C8C1A JG SHORT unpack.004C8C1E******等于6F就成功!
004C8C1C MOV BL, 1
004C8C1E CMP ESI, 7D
004C8C21 JL SHORT unpack.004C8C2A
004C8C23 CMP ESI, 7D
004C8C26 JG SHORT unpack.004C8C2A******等于7D就成功
004C8C28 MOV BL, 1
004C8C2A CMP ESI, 88
004C8C30 JL SHORT unpack.004C8C3C
004C8C32 CMP ESI, 88
004C8C38 JG SHORT unpack.004C8C3C*****等于88就成功!
004C8C3A MOV BL, 1*********************赋BL的值为1
004C8C3C XOR EAX, EAX
004C8C3E POP EDX
004C8C3F POP ECX
004C8C40 POP ECX
004C8C41 MOV DWORD PTR FS:[EAX], EDX
004C8C44 PUSH unpack.004C8C5E
004C8C49 LEA EAX, [LOCAL.5]
004C8C4C MOV EDX, 5
004C8C51 CALL unpack.00404A88
004C8C56 RETN
3、算法分析:
这个软件注册成功必须满足下列条件:
第一:注册码必须是16位!
第二:从注册码中取出6位,必须不能小于472008,不能大于500000,注册码的6位取法:取注册码的最后1位,
与3除,由除的余数来控制从第几位取,如最后一位是1,则余数为1,1+2=3,就从第3位取,如是2,则余数是2,2+2=4,
从第4位取,以下类推,然后每隔一位取1位,取完6位为止。
第三:把注册码的各位相加,设值为X,则X必须等于:39、48、65、6F、7D、88中的任何一个就成功!
给几个可用的注册码:1243858867111101、8488999999999999