PersonalCorpus 版 (精华区)

发信人: soo (凤翼天翔), 信区: Hacker
标  题: 破解
发信站: 紫 丁 香 (Wed May 10 15:03:05 2000), 转信

嗨!!  各位破解新手,以下是一篇满有价值的文件
如果能受用,就拜托广为传阅!!
      这篇东西是笔者告别BBS 的" 遗作 " 写完后在各网上应该看不到笔者的ID了!
      至于告别的原因: 荒废学业 , 因为良心不安! 所以决定两年半后再玩!
      下文中有何谬误! 请自行更正! 但不可任意修改笔者的ID & 姓名! 毕竟要
      KEYIN 这些东西也是很累的!
      P S 文中若之前有加 JJ> 表示是 Jowin Ja 补充的!
===============================================================================
=
               破    解    心    得
=======================================
      最近破了不少的GAME 想想也有些心得可告诉大家 虽说对组合语言没深入研究
      但也够用来破密码了!  在进入正题之前,首先要准备的工具有:
        1.DEBUG or SYMDEB or GAMETOOLS or SOFT-ICE 越后面列出的能力越强!
          像笔者都是用GAMETOOLS or SOFT-ICE 来破! 因为现在越来越多的游戏
          都会防止被DEBUG 来TRACE! 所以只有SOFT-ICE能正常运作! 因其切入
          保护模式! 所以没有的最好快去找一套!
        2.各式各样的压(解压)缩执行档的工具! 例: LZEXE,PKLITE,MINI,.....
          其中有一名为UNP 的万用解压缩工具最为好用!其最新版本为3.15
          也许有人会问: 既然有了UNP 干嘛还要LZEXE那些东东!
          因为有些游戏会检查档案格式是否为原来的! 为了省事!
          最好还是以原来的格式压回去比较好!
        3.PCTOOLS
        4.对组合语言有一些些的认识, 例如: 知道CMP 是啥意思!
        5.一只可以写的笔和一本笔记簿!
        有上面那些东东应该就够了!
  现在! 我们先来讲些有关 S-ICE AND GAMETOOLS 的用法! 及一些基本的组合语言
_______________________________________________________________________________
  S-ICE:
    要载入这项东东的话! 要改CONFIG.SYS中的设定 而且不能用EMS的管理程式(例:
    EMM386.EXE) 因S-ICE本身就有管理EMS的能力! 下列就是我的设定:
               DEVICE=C:\S-ICE\S-ICE.EXE /EMM 1024
                         ^^^^^路径改为你自己的 ^^^^ EMS要开多大!
    载入之后下个 EC 的指令会让游标跑到上面去! 而且才能使用[PAGE UP/DOWN]
    来翻页及使用 HERE 的功能!
    在游戏中叫出S-ICE的方法: 按 [ Ctrl + D ]
    要从头追一个程式的话可用S-ICE内附的 LDR.EXE 来达成目地 其用法为:
                LDR [ FILENAME ]
    单 步 执 行 : T [ENTER] 或是直接按 [F10] ( 若直接按F10 则其遇CALL 会直接
                  执行完那个CALL 不会在进去CALL中了)
    往下执行几步: T [ ?? ]
                  ^^^ 这是数字, [] 不用打
    执行到某一段: G [ XXXX:YYYY ] 其中XXXX 可省略不打! 则其会把目前的CS 值自
                  动填入 ( XXXX = CS , YYYY = IP )
    执行到游标目前所在位址: HERE
    设中断点: BPINT ?
    改变视窗大小: WC ? ( ? 表行数 )
    改变所指定位址ASM 的指令: A [ CS:IP ]
    改变所指定位址机器码的指令: E [ CS:IP ]
    看目前的画面: [ F4 ]
    应该就是上面所讲的比较常用! 其它的请按 [ F1 ] 键自己查寻!
    P S [ F? ] 的用途可藉著改 S-ICE.DAT 来更改其用途
-------------------------------------------------------------------------------
           G A M E T O O L S     简 易 使 用 法
     单 步 执 行 : T
     执行到某一段: G [ XXXX:YYYY ]
                   动填入 ( XXXX = CS , YYYY = IP )
     执行到游标目前所在位址: H
     改变所指定位址机器码的指令: W
     看目前的画面: E
-------------------------------------------------------------------------------
                        破解的所需基本组合关念
     CMP  XX,YY  --->   比较 XX 与 YY
        INT    ?          --->   中断
        INC    XX        --->   将XX中的值加一
        DEC    XX        --->   将XX中的值减一
        LOOP              --->   回圈
        MOV    XX,YY --->   把YY的值搬到XX中
        RET                --->   反回主程式
        NOP                --->   无动作
    +-- CALL              --->   呼叫附程式
    |   JZ                  --->   若相等则跳跃
    |   JNZ                --->   若不相等则跳跃
    |   JMP                --->   无条件跳跃
    |   JB         --->  若小于则跳跃
    +-- JA          --->  若大于则跳跃
    |
    这些指令后面都会接 CS:IP 但若CS和目前相同! 则大部分会省略不写!
                上面东东最好背下来! 这样破起来比较方便!
                若想知道最详尽的用法! 最好自己买书看!
-------------------------------------------------------------------------------
好! 现在正式进入主题:   如何破解密码
   先讲破解的流程: 1. 把工具准备好
                   2. 把判断的地方找出来
                   3. 把所要改的机器码抄下来 用PCTOOLS 改
                                ^^^^^^ 这东东是啥懂吧?
  一般来说,破密码大概都分为三种(笔者是这样分的),一种是直接把问密码的那个CALL
  杀掉! 不然就是把一些跳跃指令改成无动作( NOP )或是无条件跳跃 !再不然就是用
  move 的指令将正确的密码搬入它要捡查的暂存区( 通常是 AX )
                                                      ^^^^ 这又可分为 AL 和 AH
           现在我先把一般较常见的判断密码是否正确的格式写出来
            CMP AX,??   ;这行是说比较AX 与 ?? 的关希
            JZ    CS:IP   ;这行是指若上面的条件成立则跳到 CS:IP 这地方
            JNZ  CS:IP   ;这行是指若上面的不条件成立则跳到 CS:IP 这地方
         而常用的改法则如下面所示( 列出后以后就不在赘述了! 忘了请翻前面)
           把 JZ   改为 JMP    ( 74 -> EB )
           把 JNZ   改为  NOP    ( 75 -> 90 )
           把 CALL 改为  NOP    ( XX XX XX XX XX -> 90 90 90 90 90 )
                                        * CALL占几个BYTE 就要填几个 90
  先说说第一种直接把CALL杀掉的方法吧! 一个程式总是在主程式下有无数的CALL要怎样
  来辨别哪一个才是问密码的CALL 呢?
                  在此笔者先教各位一个偷机的方法:
                  ( 记得要随时拿笔把追到哪了记下来)
-------------------------------------------------------------------------------
  先执行要进入游戏的主档  等他执行到一半时( 当然要在问密码之前,不要太接近问密码
  的时间,再来叫出 S-ICE or GAMETOOLS 向下找到一个( RET )的指令,不要呆呆的一个
  一个的追下去!直接在那个[RET] 上下一个HERE 的命令,再来重复同样的方法一直到你找
  了六页以上还找不到任何一个[ RET ] 表示这个 CS 就是主程式所在的地方
  再来把游标放在你所找的到的第一个CALL 后, 下一个HERE 的指令,若没事发生!
  表示不是这个CALL 有问题,所以我们找下一个再来执行看看,例:
        1300:1993 CALL 0A1B:1F45
        1300:1998 INC  SI            ----> 在这下一个HERE 的指令 若没事表示
        1300:1999 ADD  [BP+57],DL          1993 的那个CALL 没问题, 所以我们
        1300:19A1 CALL 0CD7:1234           游标放在 --+
        1300:19A6 JMP  2A10          <----------------+ 这行看看,若这样就进
        1300:19A9 CMP  SI,+03              入问密码的画面,就成功一大半啦!赶
        1300:19A9 JZ   1000                快进那个call ( 用 T )继续用上面
              :                           的方法来继续追,当你发现执行某个
              :                           call 后它画出了某一部份的密码画
              :                           面时,赶快去带你进这附程式的call
              :                           把它砍了试试! 如果幸运的话! 就从
              :                           此不用受密码的困扰了!如果不行的
                                           话就照原始的方法来追吧!
-------------------------------------------------------------------------------
 如果你是用GAMETOOLS的话!那还有另一种较易判别那一个跳跃指令是在判断密码正不正
 确的方法! 请看下面!
        适用时机: 当会问好几次密码(一般是三次) 若都不正确才会跳回DOS
        使用方法: 1. 先找出存放错误数值的位址 ( 不要对我说连这个都不会 )
                  2. 用 [ AUTO ] 的指令来找出哪一个INC 会增加那位址的数字
                  3. 记住他的 CS:IP
                  4. 依原始的方法一直追 看看哪一个跳跃指令会把你带到刚抄下来
                     的CS:IP 那,一般的判断指令群较常见的有两种 我把他列在下面
                     CMP XX,YY     ;比较XX & YY 是否相同
                     JZ  ????      ;若上面的条件成立(即XX=YY) 就跳到???? 这地方
                     JMP !!!! ---> 若你发现!!!!刚好等于你刚抄下的CS:IP那很幸运
                                   的 这个CMP就是在比较密码是否正确的地方了!
                                   只要把 JZ 改为JMP 就不管输入的是否正确都会判
                                   定你输入正确而可以玩游戏了!
                     不然就是:
                     CMP XX,YY     在这种格式下我们应该把JNZ改为 NOP
                 JNZ !!!!      为啥要这样改呢? 自己稍稍想想就应想的通
                     JMP ????      ( 在此 !!!! 的值是你刚抄下来的那CS:IP )
  讲了好多理论! 现在就让我举一个实例来看看!
  要讲的GAME 是 " 侠 影 记 " !!! ....  喂 . 喂! 不要走啊! 虽然这东东不怎么好玩
  但看在它的密码简单的非常适合用来给初学者实习用 就勉强把它载入HD 吧!
  ( 因为笔者很懒! 所以仅列出重要的部份! 建议你最好跟著我一起做! 这样会比较清楚
  )
  首先当然先试试投机法有没有用! 先试试GAMETOOLS的吧!
    1. 它会把答错的数值放在一个位址, 赶快把它找出来吧!
    2. 选 [ AUTO ] 看看那个程式段会增加他的次数
    3. 哇! 找到下一面*那一列了!
        866B:2F43       MOV     AX,000A
        866B:2F46       MOV     CS:[ 2F41 ],AX
        866B:2F4A       MOV     AX,000C
            :
            :
            :
        866B:2FE0       MOV     CS:[2F39],AX
        866B:2FE4       MOV     AX,CS:[2F39]
        866B:2FE8       CMP     AX,CS:[2F37]
        866B:2FED       JZ      300A
      *866B:2FEF     INC     Word Ptr CS:[ 2F41 ]       ;把 2F41 的值加一
        866B:2FF4       CMP     Word Ptr CS:[ 2F41 ] , +0D ;比较次数是否为13
        866B:2FFA       JZ      2FFF                       ;是的话则跳到 2FFF
        866B:2FFC       JMP     2F4A                       ;无条件跳到   2F4A
            :
            :
            :
        866B:300A       CALL    853A:15EE
        866B:300F       RET
        既然知道 [ 2F41 ] 放的东东是错误的次数而*那行行又去增加它!
        可知我们现在身处于错误的程式段中! 往前找找看看是那里带我们
        来这的! 哇! 运气好好喔! 刚好上面那个就很可疑!想想... 那不
        是和我以前提过的基本类形中的一种很像! 只不过它是不正确的话
        就继续往下执行! 所以试著把 866B:2FED 的JZ改为JMP(无条
        件跳跃),在填入一次密码看看! 哇! 成功了!终于可以进游戏了!
        但! 千万注意一点! 先把机器码抄下来! 不然要怎样用PCTOOLS 来
        改呢?
        想想! 这样还是要看密码画面啊! 有没有能不看密码画面的改法呢?
        在仔细的研就上面的程式码! 在 866B:2FFC 这行不是会跳到 2F4A
        吗? 先想想它能成立的前提, 是不是要 CS:[ 2F41 ] 不等于四 时
        才会跳回去! 其目地在于再问一次密码不是吗? 所以! 我们可以很
        肯定, 886B:2F4A 的前几行是寻问密码的开头! 为什么说是前几行
        呢? 想想! 在 866B:2FF4 时 比较的是 [2F41] 的值是不是等于14
        而你若不在寻问密码的回圈外设初值的话 那这回圈在某种情况下会
        一直在里面绕跑不出来了! 所以再往前看一下! 果然,前两行就是用
        来设定[2F41]的初值的! 所以我们终于可以肯定 CS:2F43 是程式的
        开头! 现在我们就来把带我们到 CS:2F43 的那个 CALL 找出来!
        方法有2:
                 1. 向下找一个 RET 的 ASM 命令 在其上下一个
                    HERE 的命令 执行完后在下一个 T 的指令
                    就能回到那个 CALL 的下面一行了!
                 2. 重新TRACE一次! 看哪个CALL 会把我们带到
                    CS:2F43 !
        经过一番努力! 终于找到下面那些东东了!
        866B:1757       56          PUSH    SI
        866B:1758       EBEB17      CALL    2F43
        866B:175B       BB0000      MOV     BX,0000
        866B:175E       9A0A0F3A85  CALL    853A:0F0A
        试试把 866B:1758 的 CALL 改为 NOP ! P.S 我们可以看到 CS:1758 的机器码
        占了 3 BYTE 所以我们要填入 3 个NOP 因为NOP 仅占 1 BYTE!
        哈哈哈! 果然没密码画面了! 好高兴! 进游戏玩了一下也都没事! 所以说!
        可以进入最后一步骤了!
    4.  把PCTOOLS 找出来! 开始找 *.EXE AND *.COM 找你刚抄下的机器码 ( 前后最好
        都抄两个! 以用来确定是不是这一个! ) 如果找不到!
那把全部的档案都标记起来
        再找一遍! 若还是找不到! 那就可能是执行档被压过了! 用 VIEW 的功能看看档
        头! 看他是被哪种压缩软体压过的! 找出相对应的解压软体解开他! 再找一次
        有时他会把判别码涂掉! 那是就要用UNP 才有办法了! 再找不到! 很不幸的!
        该档已经受到编码! 那时就要凭各功力了!
  JJ> 关于编码的部份,我想说明一下:
  JJ> 在程式载入时,例如: LDR XXX.EXE
  JJ> 立刻用D(查看记忆体) ????:????(你先前找到要改的位址)
  JJ> 看看是不是你抄下来的,通常不是.(因为不是你才找不到嘛!!)
  JJ> 再来看是不是另一种压缩格式,通常判断的方法是,你会看到一个
  JJ> JMP ????:???? ------>跟进去!
  JJ> ....
  JJ> ....
  JJ> RET ????      ------>回去后,准备回写工作!!(回写功夫要熟练)
  JJ> 以上是解未知压缩的部份!
  JJ> 如果不是上述情形,那很可能是编码!!
  JJ> 只要下 BPM ????:???? W
  JJ> 很快就可以找到解编码的程式段!!
  JJ> 这部份需要一点组合语言了!!
  JJ> 再来就是把要修改的部份,带入自己的编码程式,换算一下
  JJ> 在用PCTOOLS 填入,在载入一次(LDR XXX.EXE)
  JJ> 看看改对了没?  不对就要再翻翻书了!!!
--- GoldED 2.42.G0214+ <Reg #7060RC1>
 * Origin: THE  ADVENTURER’S  HOUSE (99:500/151)

--

       
        地球上20%是陆地,80%是海洋
        空气中20%是氧气,80%是氮气
        我自己20%是自己,80%是谁呢

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.235.54]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:214.743毫秒