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