• 标 题:姓名与人生2000 片段
  • 作 者:井风
  • 时 间:2002-02-28
  • 链 接:http://bbs.pediy.com

软件名称:姓名与人生2000 片段 xmx.exe 269KB 
下载地点:http://cycycycy.yeah.net 
撰 稿 人: 井  风 
时    间: 2002-02-28 
破解工具:Soft-ice 4.05 
解题难度:##[专  业]##      [学  士]      [硕  士]      [博  士] 

前    言: 
            这是一个如何破解软件自身校验的习题,通过学习,你会了解软件实现自身校验技术 
        的原理。 
            
            这个例子来自于本人已完美破解的金天地狗加密软件《姓名与人生2000》软件,这是 
        它的用户界面部分。你若需要完整的《姓名与人生2000》安装程序(61M)及本人重写的加 
        密狗驱动程序,请与我联系。 
            
过    程: 
          1、下载例子verifyxmx.zip,将它解压到一目录,下载支持库,解出XXXXX.dll到同一目录; 

          2、运行xmx.exe可欣赏《姓名与人生2000》软件的界面; 

      3、用16进制软件(我用的是hiew6.7)打开xmx.exe,将它DOS根:This program can not run 
            in DOS mode 随便改动一下,如将This改成CYCY,目的是修改程序;(别忘了保留备份) 

          4、运行程序,这时程序已不能正常运行,只是闪一下便结束了。 

      5、这明显是自身校验保护部分被激活了,程序检测到自身已被修改过,拒绝运行。 

      6、将备份改名为xmx0.exe、xmx0.gam,用于作对比程序运行流程。 

      7、用对比法逐层查找出xmx.exe、xmx0.exe两者流程分叉处:代码中[HERE-A]处。 

0167:0040282A  ADD      ESP,BYTE +08 
0167:0040282D  TEST    EAX,EAX 
0167:0040282F  JNZ      NEAR 00402942 
0167:00402835  MOV      EAX,[00428A70] 
0167:0040283A  MOV      ECX,[00428498] 
0167:00402840  MOV      [ECX+5C],AX 
0167:00402844  MOV      ESI,[00429928] 
0167:0040284A  XOR      EBX,EBX 
0167:0040284C  MOV      EBP,FFFFFFFD 
0167:00402851  CALL    00403FA0  <=====可以肯定[HERE-B]处EAX的值是由此CALL产生,记为[HERE-C] 
                                        重点应在此CALL内,要找出产生[EAX]=190的原因,问题就 
                                        解决了。 
0167:00402856  MOV      EDI,EAX 
0167:00402858  TEST    EDI,EDI 
0167:0040285A  JNZ      NEAR 00402915 
0167:00402860  MOV      EAX,[00428498] 
0167:00402865  MOV      [EAX+5E],BX 
0167:00402869  MOV      EAX,[00428498] 
0167:0040286E  MOV      [EAX+60],BX 
0167:00402872  XOR      EAX,EAX 
0167:00402874  MOV      AX,[004286D4]  <=====将[004286D4]的值移入AX,要找出它是怎样来的? 
0167:0040287A  DEC      EAX            <=====未修改时值为1,修改后时值为190,记为[HERE-B] 
0167:0040287B  CMP      EAX,BYTE +03 
0167:0040287E  JA      00402887        <=====未修改时,此处为不跳,记为[HERE-A] 
0167:00402880  JMP      NEAR [EAX*4+00402948] 
0167:00402887  MOV      EAX,[00428498] 
0167:0040288C  MOV      [EAX+5E],BP 
0167:00402890  JMP      SHORT 00402904 
0167:00402892  CALL    00404FA0        <=====执行此CALL后出现程序界面 
0167:00402897  MOV      EDI,EAX 
0167:00402899  MOV      EAX,[00428530] 
0167:0040289E  PUSH    EAX 
0167:0040289F  CALL    ESI 
0167:004028A1  CMP      EAX,BYTE +01 
0167:004028A4  SBB      EAX,EAX 
0167:004028A6  INC      EAX 

      8、分析:重点转移到[HERE-C]这个CALL内,需要找出产生“190”的原因。。。 

          9、深入跟踪0167:00402851  CALL 00403FA0,代码如下: 

0167:0040402B  CMP      WORD [004286D4],BYTE +04 
0167:00404033  JZ      0040404E 
0167:00404035  MOV      EAX,[00428334] 
0167:0040403A  MOV      ECX,[00428498] 
0167:00404040  MOV      [0042834C],EAX 
0167:00404045  MOV      EDX,[ECX+54] 
0167:00404048  MOV      [00428334],EDX 
0167:0040404E  MOV      AX,[0042403E] 
0167:00404054  CMP      [00428344],AX          <====校验比较处, 
0167:0040405B  JZ      00404066              <====这行不跳的话,就完了。。。 
0167:0040405D  MOV      WORD [004286D4],0190  <====就是这行,它将190移入内存[004286D4] 
0167:00404066  CMP      WORD [004286D4],BYTE +02 
0167:0040406E  JZ      004040AE 
0167:00404070  CMP      WORD [004286D4],BYTE +03 
0167:00404078  JZ      004040AE 
0167:0040407A  MOV      ESI,[00428334] 
0167:00404080  MOV      EAX,[00428498] 
0167:00404085  MOV      ECX,[EAX+54] 
0167:00404088  MOV      [00428334],ECX 
0167:0040408E  MOV      EDX,[EAX+58] 
0167:00404091  PUSH    EDX 

      10、分析: 
                    找到了 0167:00404054  CMP [00428344],AX 这行就容易理解了,我们可以这样 
              想:[00428344]存放的是程序运行时CRC校验的余数,[AX]存放的是程序编译时CRC产生 
              余数,只要两者不同便说明程序被修改而不正确运行。 
         
        我们只要把执行程序中存放的余数改成[00428344]中的值就行了。试一试。。。。 

      11、用16进制软件打开xmx.exe,找出[00428344]值,十六进制4位数。也需可能有很多处, 
              到底是哪个地方呢?你自已试试吧,我可是一眼就能看出来! 

      12、找到偏移值00021E3E处,将这两个字节改成程序运行时[00428344]的值,运行,一切OK! 

小  结: 

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

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