软件名称:姓名与人生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
--------------------------------------------------------------------------------
- 标 题:姓名与人生2000 片段
- 作 者:井风
- 时 间:2002-02-28
- 链 接:http://bbs.pediy.com