📄 worm.txt
字号:
MOV AL,ES:[BX] │ 比对是否相同
CMP AL,ES:[BX+200] │ 若相同则 LOOP
JZ LOOP ┘
CMP BX,3FF ┐ 是否比对完毕
JZ 'ERROR' ┘
JMP 'TEST OK' ; TEST OK
以上的保护都是从软体上抄下的,将之简化後登出,不过上述例子都是使用
磁碟 I/O (INT 13h) 方式读取保护,因此很容易被拦截而破解,所以最好的
方法就是将 ROM (BIOS) SAVE 到程式内,如果须要使用到 INT 13h 时,就
呼叫自己程式内的 BIOS ,这样就没有问题了,但是由於 ROM 有 32K ,请自
行抓出可用的程式,摆在自己程式内,这样就算有XX防写程式也不能防止被
写入资料,但由於此方法必需考虑程式是否过大、版权问题,所以少有人用
之,例如目前市面常见的 SoftGard 2.00~3.01 都是自己写磁碟 I/O ,所以
程式庞大,因此将其功能分成三个小档,分别工作之。
SoftGard 3.00 保护简介 :
被 SoftGard 保护住的磁片有两个隐藏档,分别为 CML0300.HCL 以及
VDF0300.VDF。首先由一个主档启动磁片,经过自我侦测程式,然後再把
把 DEBUG 要 TRACE 用的 INT 0~INT 3 全部换成 SoftGard 所用的程式
使得 DEBUG 等程式完全当掉,然後再读取 CML0300.HCL 将自己程式完全
解码,使得SoftGard有正确程式可继续执行(防单步执行),然後将保护轨
资料与解码後的 VDF0300.VDF 资料比对,若正确的话就将原主档解码,并
还原各中断向量,然後执行该档。
对於该种保护的强度可能只有那些真正解过的人才知道了,但是不管保
护如何强劲,都有其致命伤,就是不管何时都禁止按 Ctrl-Break ,因此如
果你在 DEBUG 下执行原版的软体,那就在键入"G"後,连打 Ctrl-Break,
因为就在它解开密码的那一点,就会将程式中断向量还原,然後执行其真正
的程式,而因为它是最後一个步骤才还原中断向量,因此您可以中断其程式
也就代表它正执行到保护与正确程式的交接点,就被你的快手中断掉了,此
时记忆体只留下来真正的程式,再写回磁片就破解了,说穿就是这麽诈。
由於笔者手上有一个类似被 SoftGard 保护的软体,相当强撼,将在下一集
为您大略说明,想写一些防止被 TRACE 的保护,不能错过。
好啦,本篇讲古到此为止,请稍待继续观赏....
拷贝心得第四集
┌—┐ ┌—┐ ┌—┐ ┌—┐ ┌∞
└—┘ └—┘ └—┘ └—┘ └—┘
┌————————————————————┐
│ 软体蛀虫站资料填写 ,请勿修改其内容 │
│ 90 网之 2 ----> 597-1306 24Hr │
└————————————————————┘
==== 第六章 某种超级锁 ====
┌—————————┐
│ 6-1 四川省某档 │
└—————————┘
-R
AX=0000 BX=0000 CX=786E DX=0000 SP=01FE BP=0000 SI=0000 DI=0000
DS=4B37 ES=4B37 SS=5267 CS=5267 IP=05B1 NV UP EI PL NZ NA PO NC
-U CS:05B1 CS:05EB
5267:05B1 5D POP BP ┐
5267:05B2 8C46CF MOV [BP-31],ES │ 将程式码从头加至尾
5267:05B5 8746CD XCHG AX,[BP-33] │
5267:05B8 59 POP CX │ 因为任何的单步执行
5267:05B9 03467F ADD AX,[BP+7F] │ 都会更改程式码[CC]
5267:05BC 45 INC BP │ 加完正确值是 F6E2h
5267:05BD E2FA LOOP 05B9 ┘ 将之放到 AX 暂存器
5267:05BF FA CLI ┐
5267:05C0 5C POP SP │ 从 SS:216-20A 抓资料替换
5267:05C1 1F POP DS │ INT0-3的资料 ,如途中有单
5267:05C2 59 POP CX │ 步执行 ,就更改其SS:20A值
5267:05C3 5B POP BX │ 这是因为当 INT0 被改後 ,
5267:05C4 8CCA MOV DX,CS │ 任何单步执行一旦用到INT3
5267:05C6 870F XCHG CX,[BX] │ 同时也会动到 INT0 ,跟著
5267:05C8 875702 XCHG DX,[BX+02] │ 利用此将SS:20C的0C改掉 ,
5267:05CB 52 PUSH DX │ 造成无限回圈 ,正常绕三圈
5267:05CC 51 PUSH CX │ 後会跳到 INT3 那行
5267:05CD 83EC04 SUB SP,+04 │
5267:05D0 83FB0C CMP BX,+0C │
5267:05D3 75ED JNZ 05C2 ┘
5267:05D5 CC INT 3 — 直接用将AX与自己资料解码
5267:05D6 FC CLD ┐
5267:05D7 8FF7 POP DI │
5267:05D9 71B4 JNO 058F │ 保护检查程式
5267:05DB 8103142A ADD Word Ptr [BP+DI],2A14│
5267:05DF E6EC OUT EC,AL │ (不用 INT13h 而
5267:05E1 52 PUSH DX │ 直接使用自己的
5267:05E2 0830 OR [BX+SI],DH │ 磁碟 I/O )
5267:05E4 031A ADD BX,[BP+SI] │
5267:05E6 BAB467 MOV DX,67B4 │
5267:05E9 9F LAHF │
5267:05EA 5A POP DX ↓
5267:05EB F4 HLT
-D SS:220
5267:0200 40 04 10 02 00 02 00 00-00 01 98 05 0C 00 16 02 @...............
5267:0210 00 00 03 04 04 00 A0 11-48 11 21 C1 1C 30 9A 6B ...... .H.!A.0.k
5267:0220 5C E4 6D 8C D7 F0 EF FF-A3 6D AA B3 24 58 53 45 \dm.Wpo.#m*3$XSE
5267:0230 3F E2 C4 DD 56 ED C1 74-4A 7A D8 8B 77 50 6D 18 ?bD]VmAtJzX.wPm.
5267:0240 1F 1F 54 08 3D B3 48 CC-56 31 F9 85 20 2B AF 9A ..T.=3HLV1y. +/.
5267:0250 DC C2 5A CB F4 95 E1 E4-07 AC 66 8F 8C 4B 98 8F \BZKt.ad.,f..K..
5267:0260 30 64 19 1A 0C 82 18 C0-33 9F 25 43 42 9F 8D DC 0d.....@3.%CB..\
5267:0270 00 CC 93 8B DA C7 24 42-C1 88 3F 7C F3 B4 41 9E .L..ZG$BA.?|s4A.
说明 : 该程式一开始就计算程式码 ,如果您使用了单步执行的话 ,程式就会被
夹上[CC]码 ,造成计算总值不对 ,然後再杀掉 INT0-INT3 防止 DEBUG
之类的程式追踪 ,如您有单步执行一定会动到 INT0-INT3 ,而造成某个
特殊旗标(SS:20C)被改掉。
5267:05CD 83EC04 SUB SP,+04 ┐
5267:05D0 83FB0C CMP BX,+0C │
5267:05D3 75ED JNZ 05C2 ┘
一次抓四个位元 ,比对是否有个 +0C 码,如果没有就继续 ,一但单步执
行 ,这个 +0C 就会被改掉,造成无限回圈(当机) ,最後就跳到下一行去
执行INT3(CS:598) ,不做任何比对AX暂存器 ,直接就当做是程式解码用
,若暂存器资料正确则解码後的程式才是正确的 ,不然就无法预知後果
解码後 ,开始使用解码後的程式(磁碟 I/O)资料比对 ,如程式正确就把
真正的主程式解码和将自己的保护程式清除掉 ,防止被人看见程式解码
後的重要资料 ,最後还原 INT0-INT3 执行该程式。
换句话说 ,您可以在 DEBUG 下执行该程式 ,但不能单步执行 ,因此您
可以在执行当中连打 Ctrl-Break ,当它还原主程式後 ,正好您也取到
控制权 ,将它中断掉了 ,这时您可以去找 PSP 去看主程式在那里 ,将
破解档存回磁片(假如功力够 ,但笔者功力不足 ,无法办到 )。
┌————————————┐
│ 6-2 Sega 公司的游戏 │
└————————————┘
4B37:0100 B80000 MOV AX,0000 ┐
4B37:0103 CD13 INT 13 │ 这是笔者写的一个读取
4B37:0105 B80102 MOV AX,0201 │ 该保护轨资料的程式
4B37:0108 BB0002 MOV BX,0200 │
4B37:010B B90000 MOV CX,0000 │ 读取第零轨零面第零个
4B37:010E BA0000 MOV DX,0000 │ 额外磁区。
4B37:0111 CD13 INT 13 │
4B37:0113 80FC10 CMP AH,10 │ 其资料放到 ES:0200
4B37:0116 75E8 JNZ 0100 │
4B37:0118 CD20 INT 20 ┘
第一次读该轨的资料如下 :
4B37:0200 44 45 44 30 31 32 33 34-35 36 37 38 44 8A C8 E8 DED012345678D.Hh
4B37:0210 08 C0 00 06 CE 44 23 40-00 38 D0 3C 38 1B 21 DE .@..ND#@.8P<8.!^
4B37:0220 88 C0 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .@..............
4B37:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
4B37:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
第二次读该轨的资料如下 :
4B37:0200 44 45 44 30 31 32 33 34-35 36 37 38 44 EA 0A 0C DED012345678Dj..
4B37:0210 26 38 84 4D 9C 8C 46 C9-3D 1C 0D 02 AE D4 03 BD &8.M..FI=....T.=
4B37:0220 36 45 BD BD BD BD BD BD-BD BD BD BD BD BD BD BD 6E==============
4B37:0230 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0240 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0250 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0260 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
4B37:0270 BD BD BD BD BD BD BD BD-BD BD BD BD BD BD BD BD ================
除了标头的 "DED0123456789D" 以外资料都不一样 ,原来这就是著名的
保护 Weak-Bit ,这种保护无法用磁碟介面卡制造出(运气好可以做出)
但是由於该公司出版的游戏都用此法保护 ,并且使用到 INT13h 很容易
被长驻程式骗过去。
笔者附上 CRCEDIT.ASM 供大家参"拷"使用,可骗过该公司的游戏保护。
(该软体不得贩卖图利 ,使用後有任何後遗症 ,恕不负责)。
PS : 软体的保护是为了使软体作者的权益受到保护 ,手上有合法软体者 ,
不要到处散播 ,因为国内软体刚起步 ,也希望大家合力去保护它 ,如
您是一位写软体的作者 ,就可以感觉出希望大家购买合法软体的心情
(笔者不出版软体) ,当您没有能力购买原版软体时 ,使用拷贝版有点
愧对於良心 ,如您有能力购买正版软体 ,希望您早日购买 ,不但用的
安心 ,也有助於软体更新版本 ,让大家有更好的软体与更多的软体作
者头入国内软体市场。
附上的档案分别是 RDATA.COM : 将资料读到 CS:200 ,请用 DEBUG 来
执行这个软体。
CRCEDIT.ASM : 常驻後 ,可以骗过该保护 ,制造出类似
Weak-Bit 的效果,该程式没有侦测自己
是否载入过,故可能被载入两次以上。
(可以自己加减用 ,骗骗看好不好玩??)
Soft Bugger (90/2) 597-1306 24Hr
┌——————————┐
│ 拷贝心得第五集 │
└——————————┘
弟以勇者斗恶龙之游戏为说明 ,以前第一代保护与解法 :
保护 : 解法 :
设定磁碟参数 N=6 设定磁碟参数 N=6
↓ ↓
读取坏磁轨资料 读取 DQ.DAT (坏轨资料档)
↓ ↓
比对资料 比对资料
由於两者都能读到坏轨资料 ,只不过第二者要事先将坏轨资料存为一个档案
(DQ.DAT) 较麻烦 ,不过以後可免 KEY DISK ,省事多了 !
弟以市面上的破解版举例说明 ,兹列出其 EGA 版程式一部份。
-D CS:385
4B70:0385 44 51 2E-44 41 54 00 88 44 03 B9 DQ.DAT..D.9
4B70:0361 1E PUSH DS
4B70:0362 0E PUSH CS
4B70:0363 1F POP DS
4B70:0364 90 NOP
4B70:0365 90 NOP
4B70:0366 90 NOP
4B70:0367 B8003D MOV AX,3D00 ┐
4B70:036A BA8503 MOV DX,0385 │ 开启 DQ.DAT
4B70:036D CD21 INT 21 ┘ (坏轨资料档)
4B70:036F 06 PUSH ES
4B70:0370 1F POP DS
4B70:0371 31D2 XOR DX,DX
4B70:0373 B90020 MOV CX,2000 ┐
4B70:0376 89C3 MOV BX,AX │ 读取档案
4B70:0378 B43F MOV AH,3F │
4B70:037A CD21 INT 21 ┘
4B70:037C 72F3 JB 0371
4B70:037E B43E MOV AH,3E ┐
4B70:0380 CD21 INT 21 ┘ 关档
4B70:0382 1F POP DS
4B70:0383 EB0A JMP 038F
4B70:0385 44 INC SP
以上程式取代了原来的 INT 7Fh(13h) 的读取保护轨资料过程。
弟再举例例说明 ,该游戏是勇者斗恶龙 ][ 的一部份程式 :
4B70:6E01 33C0 XOR AX,AX ┐
4B70:6E03 8ED8 MOV DS,AX │
4B70:6E05 A14C00 MOV AX,[004C] │ 将磁碟读取之 N 值
4B70:6E08 A3FC01 MOV [01FC],AX │ 改为 6 (正常为 2)
4B70:6E0B A14E00 MOV AX,[004E] │
4B70:6E0E A3FE01 MOV [01FE],AX │
4B70:6E11 C5367800 LDS SI,[0078] │
4B70:6E15 B006 MOV AL,06 │
4B70:6E17 884403 MOV [SI+03],AL ┘
4B70:6E1A B80000 MOV AX,0000 ┐ Reset Driver
4B70:6E1D CD7F INT 7F ┘
4B70:6E1F BF0800 MOV DI,0008
4B70:6E22 1E PUSH DS
4B70:6E23 50 PUSH AX
4B70:6E24 B83658 MOV AX,5836
4B70:6E27 8ED8 MOV DS,AX
4B70:6E29 C606E22800 MOV Byte Ptr [28E2],00
4B70:6E2E 90 NOP
4B70:6E2F 881E7E28 MOV [287E],BL
4B70:6E33 58 POP AX
4B70:6E34 1F POP DS
4B70:6E35 57 PUSH DI
4B70:6E36 B80001 MOV AX,0100 ┐
4B70:6E39 050101 ADD AX,0101 │ 读取第 27h 轨第 72h 号磁区
4B70:6E3C B97227 MOV CX,2772 │ 第零面 ,将资料放到 ES:BX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -