• 标 题:重启验证软件破解思路二——无敌文件批处理大师 V1.0.1
  • 作 者:txm123
  • 时 间:2003年11月15日 01:55
  • 链 接:http://bbs.pediy.com

重启验证软件破解思路二

破解作者
        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     EBXEAX
004E94E5  MOV     BYTE PTR DS:[ESI+428], BL
004E94EB  TEST    BLBL********************注册成功,BL的值为1,反之则为0
004E94ED  JE      SHORT unpack.004E9522*****为0就跳,跳就失败!
004E94EF  LEA     EDX, [LOCAL.3]
004E94F2  MOV     EAXDWORD PTR DS:[4EEDC4]
004E94F7  MOV     EAXDWORD 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     EAXDWORD PTR DS:[4EEF8C]
004C8C9D  MOV     EAXDWORD PTR DS:[EAX]
004C8C9F  MOV     EAXDWORD PTR DS:[EAX+8]
004C8CA2  CALL    unpack.004C8AE8***************算法CALL,按F7跟进!代码看下面!
004C8CA7  RETN**********************************返回指令!
========================================================================================
算法CALL的代码:

004C8AE8  PUSH    EBP********跟进算法CALL我们停在这里!
004C8AE9  MOV     EBPESP
004C8AEB  XOR     ECXECX
004C8AED  PUSH    ECX
*********************省略!************************************

004C8B1D  MOV     EAXEBX
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     EBXEBX*****************不相等往下,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    ALAL*******************测试AL的值是否为0
004C8B42  JNZ     SHORT unpack.004C8B4B****不为0就跳,为0就不跳,往下,失败!
004C8B44  XOR     EBXEBX*****************不相等往下,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     ECXEAX******************EAX的初始值是1,把这个值移入ECX
004C8B65  MOV     EAXECX
004C8B67  MOV     ECX, 3********************把3送入ECX
004C8B6C  CDQ*******************************EDX清0
004C8B6D  IDIV    ECX***********************EAX=EAX/ECX=1/3,商0放EAX,余数1放EDX
004C8B6F  MOV     ESIEDX******************把余数1送到ESI                        
004C8B71  XOR     EBXEBX******************EBX清0
004C8B73  LEA     EAX, [LOCAL.4]
004C8B76  PUSH    EAX
004C8B77  MOV     EDXEBX******************EBX的值是0,这个值移入到EDX中
004C8B79  ADD     EDXEDX******************EDX自身相加,0+0=0                       
004C8B7B  ADD     EDXESI******************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     ESIESI*********************ESI清0
004C8BA0  MOV     EBX, 1***********************赋EBX的值为1,EBX做计数器!
004C8BA5  LEA     EAX, [LOCAL.5]***************赋EAX地址值
004C8BA8  MOV     EDX, [LOCAL.1]***************试验码入EDX
004C8BAB  MOV     DLBYTE 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     ESIEAX*********************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     EBXEBX********************跳到这里EBX清0
004C8BE8  TEST    BLBL**********************004C8BE2处跳来,测试BL的值!
004C8BEA  JE      SHORT unpack.004C8C3C*******为0就跳,跳就失败!不跳往下!
004C8BEC  XOR     EBXEBX********************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     EAXEAX
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