• 标 题:copyall2.06b (4千字)
  • 作 者:井  风
  • 时 间:2002-3-24
  • 链 接:http://bbs.pediy.com

软件名称:copyall2.06b  50KB
下载地点:http://www.vdsarg.com
撰 稿 人: 井  风
时    间: 2002-03-28
破解工具:Soft-ice 4.05  Trw2000 1.22  BW2000 0.2
解题难度:[专  业]      ##[学  士]##      [硕  士]      [博  士]

前    言:

        这个例子所涉及的问题包括:手工脱壳、自身校验、解除时间限制、除去提醒对话框四个方面。
                       
过    程:

    1、手工脱壳

    第一步:启动 BW2000 0.2 (下载:fsdb.yeah.net),点[Track],启动copyall.exe,这时
        BW2000显示入口点为00404768,将它记下来;
    第二步:用TRW2000载入copyall.exe,下命令GO 404768,这时程序来到0167:00404768处,
        下命令MAKEPE,稍后命令执行完毕,退出TRW2000,这时在copyall.exe所在目录
        便产生一个新执行文件newpe.exe,至此手工脱壳完成。

    2、解决自身校验

    第一步:执行TRW2000,设断点BPX MESSAGEBOXA,执行NEWPE.EXE,程序中断于[1]CALL
        CALL USER32!MESSAGEBOXA,按F12返回到调用处,可找出[1]。

0167:00403816  PUSH    ECX
0167:00403817  LEA      EAX,[ESP+0314]
0167:0040381E  PUSH    EDX
0167:0040381F  PUSH    EAX
0167:00403820  CALL    `USER32!wsprintfA`
0167:00403826  LEA      ECX,[ESP+031C]
0167:0040382D  PUSH    ECX
0167:0040382E  CALL    00401640  <===执行此行出现自身校验错误框,记为[1]
0167:00403833  ADD      ESP,BYTE +18
0167:00403836  XOR      EAX,EAX    <===记为[2]
0167:00403838  POP      ESI
0167:00403839  ADD      ESP,0504
0167:0040383F  RET   
0167:00403840  MOV      EAX,[0040FCA8]
0167:00403845  SUB      ESP,0400
0167:0040384B  CMP      EAX,0400
0167:00403850  JNA      0040387C
0167:00403852  MOV      ECX,[0040FC9C]
0167:00403858  MOV      EDX,[0040FCA0]
0167:0040385E  SHR      EAX,0A
0167:00403861  PUSH    EAX
0167:00403862  MOV      EAX,[0040FCA4]

    第二步:用16进制编辑器将[1]行5字节改成90 90 90 90 90,将[2]处2字节改成B0 01。
    第三步:运行newpe.exe,程序正常运行了,OK!

    3、解除时间限制

    第一步:将系统时间调回到2002年3月,运行程序,提示本软件试用期已结束,程序退出。
    第二步:设断点:BPX MESSAGEBOXA,运行程序,程序中断于[32]行CALL中,按F12返回到
        [32]处。

0167:00402DBA  CMP      ESI,BYTE +4E
0167:00402DBD  JZ      00402E0B
0167:00402DBF  CMP      ESI,0111
0167:00402DC5  JNZ      00402DFA
0167:00402DC7  CALL    00401090    <===深入跟踪此CALL,看看应如何才能使它永远
                        返回‘0’值。
0167:00402DCC  CMP      EAX,BYTE +01
0167:00402DCF  JNZ      00402DE4    <===此处若跳则会越过[31],只要前面调用返回
                        的值永远是“0”就OK。
0167:00402DD1  PUSH    DWORD 0040ACE4
0167:00402DD6  CALL    00401630    <===执行此行则出现提示试用期结束,记为[31]
0167:00402DDB  PUSH    EBX        <===记为[32]
0167:00402DDC  CALL    00402EB0
0167:00402DE1  ADD      ESP,BYTE +08
0167:00402DE4  MOV      EDX,EDI
0167:00402DE6  PUSH    EBP
0167:00402DE7  SHR      EDX,10

    第三步:分析以上代码,由后向前
    第四步:深入分析0167:00402DC7 CALL 00401090 这行调用,如何使它永运返回“0”值。

0167:00401090 A174B94000      MOV      EAX,[0040B974]
0167:00401095 83EC10          SUB      ESP,BYTE +10
0167:00401098 56              PUSH    ESI
0167:00401099 BE01000000      MOV      ESI,01
0167:0040109E 3BC6            CMP      EAX,ESI
0167:004010A0 750A            JNZ      004010AC      <===这行改成全不跳,记为[33]
0167:004010A2 A170B94000      MOV      EAX,[0040B970] <===这行改成移入EAX寄存器“0”,记为[34]
0167:004010A7 5E              POP      ESI
0167:004010A8 83C410          ADD      ESP,BYTE +10
0167:004010AB C3              RET              <===到此行返回,岂不是很好!
0167:004010AC 33C0            XOR      EAX,EAX
0167:004010AE 8D4C2404        LEA      ECX,[ESP+04]
0167:004010B2 89442404        MOV      [ESP+04],EAX
0167:004010B6 51              PUSH    ECX
0167:004010B7 8944240C        MOV      [ESP+0C],EAX
0167:004010BB C70570B940000000+MOV      DWORD [0040B970],00
0167:004010C5 89442410        MOV      [ESP+10],EAX
0167:004010C9 893574B94000    MOV      [0040B974],ESI
0167:004010CF 89442414        MOV      [ESP+14],EAX

    第五步:如上分析,就能永远返回‘0’。
    第六步:修改程序,将[33]处2 字节改成 75 00,将[34]处5字节改成B8 00 00 00 00。
    第七步:运行程序,一切OK!

    4、除去注册提醒框

    第一步:运行程序,随便拷贝一个目录,跳出提醒框。
    第二步:设断点:BPX MESSAGEBOXA,如上述方法,可找出提醒框的[41]CALL

0167:0040257F  NOP   
0167:00402580  MOV      EAX,[0040FB74]
0167:00402585  MOV      ECX,0190
0167:0040258A  CDQ   
0167:0040258B  IDIV    ECX
0167:0040258D  SUB      ESP,0504
0167:00402593  TEST    EDX,EDX
0167:00402595  JNZ      0040259C  <===只要全跳就可越过[41]行,记为[42]
0167:00402597  CALL    00402850  <===执行此行出现提醒框,记为[41]
0167:0040259C  PUSH    ESI
0167:0040259D  PUSH    EDI
0167:0040259E  PUSH    DWORD 0104
0167:004025A3  LEA      EDX,[ESP+0C]
0167:004025A7  PUSH    DWORD 0040A81C

    第三步:将[42]处1个字节改成 75 。
    第四步:运行程序,一切OK!

小  结:

    这个程序破解过程虽然简单,但它具有一定的代表性。

后  记:
        有疑问请与我联系:hz.cy@163.net