PersonalCorpus 版 (精华区)
作 家: yanyan (孤舟蓑立翁) on board 'Hacker'
题 目: 黑客心经----破解入门
来 源: 哈尔滨紫丁香站
日 期: Sat Aug 23 13:04:53 1997
出 处: bbs@bbs.orange.sjtu.edu.cn
发信人: hhr (铁马冰河入梦来), 信区: DOS
标 题: 黑客心经----破解入门
发信站: 饮水思源站 (Sun Jun 8 21:42:59 1997) , 转信
发信人: subtle (淡然处之), 信区: Dos
标 题: 黑客心经----破解入门
发信站: 鼓浪听涛 (Sun May 18 16:32:27 1997)
一杆小猎枪
------ UHS 破解及 Hacker 入门
如何学破解,的确是一言难尽。因为破解软件是一个很综合的技术,它不仅仅
需要掌握计算机软件硬件等各方面的知识,而且需要有极大的耐心。
我不可能再从汇编语言讲起,只好认为大家已经有汇编语言的基本知识,至少
你大概能看懂寄存器,比较,跳转,调用等语句吧,还得知道有个 debug软件。另
外,知道最常用的几个汇编代码:
90 -----> NOP (就是什么也不干啦!)
75 xx -----> JNZ xx
74 xx -----> JZ xx
EB xx -----> JMP xx
E9 xx -----> JMP xx
EA xx -----> JMP xx
(EA EB E9 是不同的跳转,长、短、中)
这次先介绍软件保护的一般手法。下面是从 UHS (Universal Hint System)
软件中提取出来的部分片段:(我破解时使用的是 Turbo Debug,为了让大家看
清除,我只好使用 debug)
debug uhs.exe
-u
31A5:9229 9A00000C4C CALL 4C0C:0000*
31A5:922E 9AE004BD4A CALL 4ABD:04E0*
31A5:9233 9AC7091F4A CALL 4A1F:09C7*
*
*
* 中间都无关紧要
*
*
31A5:938B BF321A MOV DI,1A32
31A5:938E 1E PUSH DS
31A5:938F 57 PUSH DI
31A5:9390 B8FF00 MOV AX,00FF
31A5:9393 50 PUSH AX
31A5:9394 9AF60F0C4C CALL 4C0C:0FF6
31A5:9399 E88676 CALL 0A22
31A5:939C A27B1D MOV [1D7B],AL
31A5:939F 803E7B1D00 CMP BYTE PTR [1D7B],00
31A5:93A4 7503 JNZ 93A9
31A5:93A6 E868D7 CALL 6B11
31A5:93A9 C706002B0300 MOV WORD PTR [2B00],0003
31A5:93AF B8EC07 MOV AX,07EC
你一步一步的 p,当行至 93A6 时,出现了让人“麻烦”的阻挠画面(程序随机
地产生一个字母让用户按),这说明CALL 6B11便是作者对非注册用户的“惩罚”。
如果按错,则出现:
Program aborted!
Program terminated normally (这是 debug 的)
按对时,将进入 93A9。
那么好,将这一句处理掉,修改 E868D7 为 909090。
于是进入时不会再有相应的“惩罚”画面了。
但是,
问题并不是那么简单:进入系统后,还会随机出现注册画面。为什么呢?
其实刚才的破解是有隐患的:
在调用惩罚画面之前,系统已经将是否注册标志设置为 NO,
所以那种修改就是事后诸葛亮了。
不难看出,这个标志以及放在了 [1D7B],
也不难看出,在 CALL 0A22后,该子程序的返回值 AX 放在了 [1D7B]。
结论就很简单了:
9399 处的 CALL 0A22 就是判断系统是否注册的子程序,而[1D7B]处存放的
是系统是否注册的标志。
很幸运,只要把[1D7B]处的数改为非零就可以了。
选择 31A5:9399 E88676 CALL 0A22
修改为 B80100 MOV AX,1
和后面的 A27B1D MOV [1D7B],AL
相映成辉。
破解前,不要忘记拷贝一份备份;
破解后,不要忘记把破解的文件和备份的文件比较一下,产生 Crack99 的破解描述。
留两个课后作业:
1,本文破解是否很容易?
2,本文出现的判断注册与否的片段是:
CALL 0A22
MOV [1D7B],AL
CMP BYTE PTR [1D7B],00
JNZ 93A9
CALL 6B11
如果是
CALL xxxx
XOR AX,AX
JNZ xxxx
CALL xxxx (这几个 xxxx 并不相同,只是表示一个地址而已)
那么破解又应该如何进行?
哇,破解这么容易啊!
其实不然:
uhs的作者大概不知道世界上还有 Hacker,所以没有增加任何一个
保密措施,这才让大家轻易得手。
首先我们归纳一下软件判断注册的过程:(我用 C 语言描述)
register_flag = judge_register();
if(register_flag == YES)
main_function();
else{
display_copyright();
......
main_function();
}
而在运行过程中,也会随机地调用(调用机率可以任意设置):
if( register_flag == NO){
if( Random_number() > some_constant ) {
display_copyright();
}
}
uhs 的基本结构就是上面的过程。因此我们将 register_flag
强行修改为 YES,就获得了出道以来的第一次胜利。
上次的答案是,如果出现的汇编代码是:
call xxxx
xor ax,ax
jnz xxxx
call xxxx
则应该是由如下的高级语言编译成的:
if(judge_register() != YES){
display_copyright();
.....;
}
估计程序运行中间的调用是:
if( judge_register() != YES ){
if( Random_number() > some_constant ) {
display_copyright();
}
}
针对这种检测方式,最好的办法是“釜底抽薪”:反汇编
judge_register()这个子程序,使它的返回值永远是 YES。估
计judge_register()是这样写的:
…………
if ( 注册号 == 正确的注册号 ) return YES;
else return NO;
修改为:
if ( 注册号 == 正确的注册号 ) return YES;
else return NO;
修改为:
if ( 注册号 == 正确的注册号 ) return YES;
else return YES;
下一次我们结合 Qedit的破解介绍一些简单防破解的手段。
--
※ 来源:.鼓浪听涛 bbs.xmu.edu.cn.[FROM: SunLAB.xmu.edu.]
--
※ 来源:·饮水思源站 bbs.sjtu.edu.cn·[FROM: hhr.bbs@bbs.xmu.edu.]
--
※ 来源:·哈尔滨紫丁香站 bbs1.hit.edu.cn·[FROM: bbs@bbs.orange.sjtu.]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.145毫秒