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毫秒