关于软盘反拷贝(100分)

  • 主题发起人 zswenyun
  • 开始时间
在基于NT内核的系统中不要使用INT中断,否则死得不好看,不过软盘加密的解决太简单了!
 
>>aizb
你能指点一下我这个菜鸟吗?
我在WIN2000下用CreateFile与SetFilePointer还有WriteFile等API函数
写入软盘,
但不知道在98下如何对应到相应的软盘扇区把2000下写入的内容读出来,
现在主要问题就是2000下如何计算软盘扇区
 
帮我看一下下面的程序
程序如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;
type INT13Regs = record
buffer:pointer;//EBX寄存器
Drive:BYTE;//磁盘号,dl
Head:BYTE;//刺头号,dh
EDX_Hight:WORD;//EDX寄存器
Sector:BYTE;//起始扇区号,cl
Track:BYTE;//磁道号,ch
ECX_Hight:WORD;//ECX寄存器
Number:BYTE;//要读写的扇区数,al
CMD:BYTE;//命令:2—读,3—写,5—格式化,ah
EAX_Hight:WORD;//EAX寄存器
EDI:DWORD;//EDI寄存器
ESI:DWORD;//ESI寄存器
Flags:DWORD;//Flags
end;
TVWin32CtlCode = (ccNone,ccVWin32Intloctl,ccVWin32Int26,ccVWin32Int25,ccVWin32Int13);
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
edit1: TEdit;
RichEdit1: TRichEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Button5: TButton;
Label3: TLabel;
Edit4: TEdit;
Button6: TButton;
Edit5: TEdit;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);//98下读取
var hDev:thandle;
Abuffer,LPRET:array[0..511] of char;//定义缓冲区,放置读取扇区数据
int13_registers:INT13Regs;//定义INT13中断的寄存器结构变量
b_int13_registers,AA:boolean;
TCOUNT:DWORD;
i,j:integer;
Tempstr:string;
begin
hDev:=CreateFile('//./VWIN32 ',0,0,NIL,0,FILE_FLAG_DELETE_ON_CLOSE,0);
int13_registers.buffer:=@Abuffer;
int13_registers.Drive:=0;//0-软盘A;1—软盘B;0x80-硬盘c
int13_registers.Head:=0;//0面
int13_registers.Track:=0;//0磁到道
int13_registers.Sector:=0;//0扇区
int13_registers.Number:=1;
int13_registers.CMD:=2;//读操作
b_int13_registers:=FALSE;
AA:=DeviceioControl(hDev,ord(ccVWin32Int13),@int13_registers,sizeof(INT13Regs),@int13_registers,sizeof(INT13Regs),TCOUNT,NIL);
CLOSEHANDLE(hDev);
//AA:=b_int13_registers;
for i:=0 to 511do
begin
Edit1.text:=Edit1.text+Abuffer;
end;
end;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);//98下写
var hDev:thandle;
Abuffer,LPRET:array[0..511] of char;//定义缓冲区,放置读取扇区数据
int13_registers:INT13Regs;//定义INT13中断的寄存器结构变量
b_int13_registers,aa:boolean;
TCOUNT:DWORD;
i:integer;
begin
hDev:=CreateFile('//./VWIN32 ',0,0,NIL,0,FILE_FLAG_DELETE_ON_CLOSE,0);
for i:=0 to 511do
begin
Abuffer:='b';
end;
int13_registers.buffer:=@Abuffer;
int13_registers.Drive:=0;//0-软盘A;1—软盘B;0x80-硬盘c
int13_registers.Head:=0;
int13_registers.Track:=0;
int13_registers.Sector:=0;
int13_registers.Number:=1;
int13_registers.CMD:=3;//写入
b_int13_registers:=DeviceioControl(hDev,4,@int13_registers,sizeof(INT13Regs),@int13_registers,
sizeof(INT13Regs),TCOUNT,NIL);
CLOSEHANDLE(hDev);
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button3Click(Sender: TObject);//2000下读
var hDev:Thandle;
dwRet:dword;
RBuffer:array[0..511] of char;
Tempstr:string;
i,j:integer;
tcount:boolean;
dwStartSector:integer;
begin
dwStartSector:=0;//起始位置
hDev:=createfile('//./A:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
SetFilePointer(hDev,512*dwStartSector,0,FILE_begin
);
dwRet:=0;
tcount:=ReadFile(hDev,RBuffer,512,dwRet,0);
for i:=0 to 511do
begin
Edit1.text=Edit1.text+RBuffer;
end;
closehandle(hDev);
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.Button4Click(Sender: TObject);//2000下写入
var hDev:Thandle;
dwRet:dword;
RBuffer:array[0..511] of char;
Tempstr:string;
i:integer;
tcount:boolean;
dwStartSector:integer;
begin
dwStartSector:=0;
hDev:=createfile('//./A:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
SetFilePointer(hDev,512*dwStartSector,0,FILE_begin
);
dwRet:=0;
for i:=0 to 511do
begin
RBuffer:='a';
end;
tcount:=WriteFile(hDev,RBuffer,512,dwRet,0);
closehandle(hDev);
end;
//我不知道2000下这样写入软盘,是不是写入0面0磁道0扇区,
我先用98下的写入在98下写入软盘,然后再在2000下读出,
但是读出的不是98下写入的内容,而2000下写入,98下读取也一样
 
对不起,我是说不过软盘加密的破解太简单了,而不是解决太简单了!
 
希望以下对你有用:
软盘的加密解密技术

作者:shanguo

  要学加密解密,必须知道汇编语言,现把主要用到的语言介绍如下
1、DEBUG 的指令;
T --- 单步执行 ,一次执行一个指令
G <Address> --- 执行到 <Address> 就停下来
G --- 执行完载入的程式
N <Filesname>--- 定义档名 (配合 "L" 或 "W" 用)
L --- 载入档案(LOAD)
W --- 写入档案(SAVE)
  大部份破解过程只用到上列指令....一般档案分为.COM 与.EXE ,因为.COM 最大只能有 64K 所以演生出.EXE 档。但是.EXE又有个档头 ,记录档案放在那儿,所以 DEBUG 无法写回此种档案 ,而产生错误讯息,因此EXE档必须用 PCTOOLS 将指令码找出来改一下,
2、部分汇编指令(其余请看8088/8086汇编语言书)
  MOV AA,BB 将 BB 放到 AA 里 即AA<---BB
  CALL 呼叫副程式 (相当於 BASIC 的 GOSUB)
  RET 与 RETF 返回程式 (相当於 BASIC 的 RETURN)
  CMP XX,YY 比较 XX 与 YY
  JZ 若相等则跳跃
  JNZ 若不相等则跳跃
  JB 若小於则跳跃
  JG 若大於则跳跃
  JMP 无条件跳跃
  J??? (各种跳跃指令)
  LOOP 回路
  INT XX BIOS的中断(软盘中断为INT 13)
3、各种寄存器(介绍8088/8086)
  通用寄存器分数据寄存器、指针寄存器、变址寄存器。
a 数据寄存器分 AX--累加寄存器 BX--基址寄存器 CX--计数寄存器 DX--数据寄存器
各寄存器为16位,有按高字节和低字节分两个8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL
b 指针寄存器分 BP--基址寄存器 SP--堆栈寄存器 为16位
c 变址寄存器分 SI--源变址寄存器 DI--目标变址寄存器 为16位
d 控制寄存器包括指令指针寄存器--IP和标志寄存器--FLAG(有9个标志位)
4、软盘读写
  软盘的读写、FORMAT等都由调用INT13中断来实现,在软盘上进行加密就需要利用到INT13。(在后面介绍具体方法)
5、软盘结构
  2HD 的磁片有 80 轨(即80个同心圆) ,每一轨又分为9个磁区 ,每个磁区又再分 512 个位元组 ,因此要做保护只要和正常轨不同即可。(DOS2.0每轨8个磁区 ,DOS3.1以上版本才是9个磁区)
磁轨(TRACK) : 磁片上分成数个同心圆环 ,便称磁轨
面(Head) : 软碟分为 0/1 面 ,但硬碟可能超过此数字
磁区(SECTOR) : 磁轨上储存资料区域之一
N 值 : 磁区大小 ,正常为2 (N=1 256Bytes ,N=2 512Bytes)2的N次方乘以256,即为该磁区的大小,因此正常的磁轨 ID 栏应该为 :
磁区 T H S N
1 02 00 01 02 10.4% 这是第二轨第零面的状况
2 02 00 02 02 10.4% "%" 代表这磁区占该轨的
3 02 00 03 02 10.4% 百分比 ,每次皆会有少许
4 02 00 04 02 10.4% 差异。
5 02 00 05 02 10.4%
6 02 00 06 02 10.4%
7 02 00 07 02 10.4%
8 02 00 08 02 10.4%
9 02 00 09 02 13.7%
  若 N=3 则必需有 17.8% 以上的空间才能制造出正常磁轨 ,不然都会造出坏轨(CRC ERROR) ,所以该轨只能有 5 个磁区 ,否则就变成坏轨。这是因磁碟控制卡之故 ,无法要求小又好(NO ERROR)的磁区。
6、保护的种类(以前在我的网上介绍过)
  空白磁区: 该轨不具磁区 ,也就是某一轨不做 FORMAT ,这样当读写这个磁轨就会造成错误 ,但只能防标准的 DISKCOPY 的拷贝程式 ,是早期的保护方式。
  非标准磁区 : 就是乱改 T H S N 值 ,变成与正常轨不同。
  异常大小的磁区 : 占该磁轨大小百分比异常。
  隐藏磁区 : 用 ID 栏错误法 ,使得该磁区必须要用 READ ID 法才能找到该磁区 ,所以可骗过早期的 COPYWRIT or COPYIIPC
  增加额外磁区 : 让某一轨磁区超过正常数目,磁碟控制卡若能制造出 20h 个磁区就算不错了,但有些却制造甚多个使之无法用软体拷贝。
  虚拟磁区 : 又名 WEAK BIT ,就是将资料写入时以介於 0 与 1 的磁性写入 ,於是读出来的资料每次都不一样 ,正常磁碟机无法做出(碰运气可作出,但百分比越大越难做出) ,只能靠外来硬体做拷贝。
  长轨 : 利用转速慢的磁碟机写入 ,这样写入的资料比较多 ,除非拷贝的磁碟机转速相同 ,不然拷不下(拷贝卡也无法)
  无缝锁 : 利用 N 值为 6 的磁区 ,因为超过该轨所能容纳的空间, 所以当您读取该磁区时就会顺便将头尾的资料读出 ,任何磁碟机都无法处理该区 ,造成不能被拷贝 ,因此市面使用此保护者 ,每片都不一样保护轨资料 ,不可能拷贝。因为一个磁轨无法容纳 N=6 ,所以会格式化出坏轨(BAD CRC)同时利用磁碟机无法正确写入索引孔附近资料,因此拷贝卡等硬体拷被工具也无法拷贝,但如果仍要读该轨时,磁碟就会顺便将索引孔的资料读出,只要比对其资料即可知是否原版。
  额外磁轨 : 正常磁片假如有 39 轨 ,但可读写的还有 40 41 轨 ,因此有人就在该轨做手脚 ,然後以正常方式读写该轨。
  对软盘加密解密需要用到13H中断,下面把13H常用的命令介绍如下:(其余请看DOS大全)
寄存器
功能
AH=02H 读磁盘扇区 AL=扇区数 CH=柱面* CL=起始扇区 DH=磁头(0面和1面)
DL=驱动器(00H-7FH软盘80H-FFH硬盘)
AH=03H 写磁盘扇区
AH=05H 格式化磁盘磁道 参数格式是:磁道号,磁头号(面号),扇区号,扇区字节数
  扇区字节数有一个规定:0=128,1=256,2=512,3=1024,4=2048,5=4096,6=8192,7=6384其中最特殊的是7,就是加密的关键。
AH=06H 格式化坏磁道
举例:
  读A盘第70道0面3扇区开始的3个扇区里的数据,存放在地址为100的缓冲区里,进行如下操作:
MOV AH,02H 使用02H功能读取指定磁道指定扇区的数据
MOV AL,03H 读取3个扇区内容
MOV BX,100H 存放在内存地址为100的缓冲区里
MOV CH,70 磁道号为70号此处的70不是16进制
MOV CL, 03H 扇区号为3
MOV DH,00H 第1面(不是0面就是1面,只有两个面)
MOV DL,00H A盘用0代表
INT 13H 执行中断13H程序
  BBS水木清华站kill的key盘制作源程序(仅供参考)
makekey.dat:
A 100
MOV AX,0504
MOV BX,0200
MOV CX,2701
MOV DX,0000
INT 13
INT 3
E 0:525 01 04
E 200 27 00 A7 02 27 00 D1 02 27 00 BC 02 27 00 E1 02
G
E 0:525 02 12
Q

  copy一下上面的代码,然后放张盘在A:,再debug<mkeykey.dat,
  然后可以format一次保护key
本章具体讲如何编程序对软盘进行格式化;
  例如:在软盘的 29h 轨制造一个编号为 FFh 的磁区,防一般的拷贝软件。
源程序如下:
FORMAT 29H磁轨的程序 分析
CS:100 MOV AX,0000 / 磁头复位读写前的准备
INT 13 / 调用13中断
MOV AX,0501 - FORMAT 1个磁区(13H中断的05H格式化功能)
MOV BX,0200 - 格式化ID的数据资料放在 ES:BX 用200代表
MOV CX,2901 - 29h轨
MOV DX,0001 - 零面,B磁碟机(A盘和硬盘的参数请看DOS大全)
INT 13 - 起动磁碟 I/O(13H中断)
JB 0100 - 失败再重作 跳转到100地址
INT 20 - 结束程序
ES:200 DB 29 00 FF 02 (格式化ID栏资料,即200代表的数据) DB----预置一参数或数据命令
说明: 29---表示第29H磁轨
00---表示第0面
FF---表示编号为FFH
02---表示N=2,磁区大小为512bytes
  以上程序对软盘的加密后,验证密匙可用下面的程序进行。
(本刊版权归shanguo所有,如要转载请注明我的网址和出处)
验证该轨的程序 分析
CS:100 MOV AX,0000 / 磁头复位读写前的准备
INT 13 / 调用13中断
MOV AX,0201 - 读一个磁区
MOV BX,0200 - 将资料放在 ES:BX
MOV CX,29FF - 第29h轨,FFh磁区
MOV DX,0001 - 零面,B磁盘(A盘和硬盘的参数请看DOS大全)
INT 13 - 磁碟 I/O 起动(13H中断)
JB TEST ERROR 无特殊轨就错误,可跳转到某一地址
JMP TEST OK 有特殊轨检查通过就OK
  看了上面的程序和我的分析后,你对加密解密可有一定的了解了。
  本章主要介绍在软盘加密的中如何做出CRC磁道的
  因为对一个磁道格式化时当N=6,会格式化出坏轨(BAD CRC),而此时磁碟机无法正确写入索引孔附近资料,因此拷被工具也无法拷贝,但如果仍要读该轨时,磁碟就会顺便将索引孔的资料读出,只要比对其资料即可知是否原版。流程如下;
+--------+
|磁头复位|
+--------+
|
+--------+
| 读磁道 |
+--------+
|
+----------------+
| 比对是否有坏轨 |
+----------------+
|
+----------------+    不是
| 比对是否有坏轨 |--------------------+
+----------------+ |
|是 |
+----------+ 非预设资料 |
|比对资料区|--------------------------+
+----------+ +----------+
| | 失败结束 |
+----------+ +----------+
|成功的执行|
+----------+

 
  例如:
  FORMAT A磁碟第29h轨,第零面,第1个磁区
  源程序 分析
------------------------------------------------------
MOV AX,0000 ;
重置磁碟
INT 13 ;
调用13中断
MOV AX,0501 ;05H格式化
MOV BX,200 ;
FORMAT 参数用200表示
MOV CX,2901 ;
第29h轨,第零面,第1个磁区
MOV DX,0000 ;
A磁碟
INT 13 调用13中断
JB 'FORMAT ERROR' 失败
JMP 'FORMAT COMPLETE' 格式化成功
ES:200 29 01 01 06 (ID 栏值,即200代表的值,请看上集)
  检验验证程序如下:
  源程序 分析
------------------------------------------------------
MOV AX,0000
INT 13 调用13中断
MOV BX,0000 ;

MOV DS,BX ;
  | 磁碟参数表,放在 0000:0525
MOV BX,0525 ;

MOV AL,06 ;
N=6
MOV [BX],AL ;
将 0000:0525 磁碟参数改为可读 N=6 的磁区
MOV AX,0201 ;
-+
MOV BX,300 ;
| 读取 29h 轨,第 0 面,第一号磁区
MOV CX,2901 ;
| 读到的资料放到 ES:BX
MOV DX,0000 ;
| 请查do
S 手册
INT 13 ;
┘ 调用13中断
CMP AL,10 ;
比较是否 BAD CRC
JZ 'TEST OK' ;
如果是则跳越到比对资料
JMP 'ERROR' 如果不是,错误
  由于 N=6 已超过一个磁区所能容纳的范围,因此变成 BAD CRC,AL 的返回代码请参考do
S 技术手册。
  下章主要介绍,如何编加密盘(如瑞星杀毒)源程序,并汇编成可执行程序。
  前面介绍了软盘加密的中如何做出CRC磁道,如何读取等内容,本期谈谈如何对一个原盘分析并做成原盘的。
  1、找一个原盘如:瑞星,你先要对它分析,找出它同一般盘的不同之处,也就是加密点,并对他的磁道、扇区、面、扇区大小等进行分析,再根据分析的结果数据编制出FORMAT程序,建议你用ANDISK软件对磁盘进行分析。(本站:网络任我行--加密解密--工具宝箱提供,请去下载)
  2、然后你根据分析结果,利用13H编制出源程序,检查完好后,你就可以汇编成程序发布了。
  例如:已有一个RAV盘制作软件(请到我的网站http://shanguo.cn99.com,推荐软件栏下载)该文件可以是TXT文件,也可以是ASM文件。
  先到我的网站下载AV.zip、TASM.ZIP、TLINK.ZIP三个文件,解压后成三个文件:rav.txt tasm.exe tlink.exe。把它们放在一个目录下。
  在DOS下,执行 TASM RAV.TXT 把TXT文件汇编成OBJ文件,得到RAV.OBJ,再执行 TLINK/T RAV.OBJ
  把OBJ文件连接成COM文件,即得到rav.com。这就是一个可执行的瑞星密盘制作软件了。你还不试验一下。
  上章讲了如何编制加密软件,本站会员专区为你提供了好几个加密软件的源程序,你可去下载并汇编成软件,(用上期讲的方法);本期讲如何破解软件(以KV300+Z8为例)
  KV300+是一个很出名的软件,它的加密技术也很出色,现在讲一下如何破解最新的版本(仅供参考)。
  软件工具:TEST UNP UFKV300 LZEXE KV-PATCH (同上一个版本差不多)
  第一步:查找加密壳数
  1、找个KV300.EXE文件来,把它和TEST.EXE放在一个目录下,在纯DOS下运行TEST KV300.EXE 就可以看到提示有两层壳。下面来解壳。
  第二步:解壳
  2、把UFKV300.com文件和KV300.exe放在同一目录下,在DOS下运行UFKV300.com,得到一个文件K。这是脱去第一层壳的KV300,把K改名为KV300.exe。
  3、用UNP脱去第二层壳,在DOS下运行UNP-L KV300.exe就可以得到的是脱去全部壳的KV300.exe了,有333K,你可以自由的进行汇编了,但该软件还有读密盘的子程序在里面。
  第三步:去密盘判断程序
  4、把脱去全部壳的KV300与KV-PATCH放在同一目录,于DOS下运行KV-PATCH,让程序自动执行,你就可以得到一个破解了读密盘的子程序的KV300了,但软件很大,有300多K,这是因为没压缩,你用LZEXE KV300.EXE压缩一下,就仅有144K左右大小了,z这就是破解了的KV300+软件了,可脱离密盘运行了。你还不试验一下自己破解。

 
to:acjin
可是2000下不能用INT13中断呀
 
什么好东东?居然值得这样加密!
 
也不是说什么好东东,本来是公司的要求,
加密解密部分我已经用DES算法完成,只是想在盘上在加一把锁而已,
主要是想知道在2000下如何读写软硬盘的物理扇区
 
老兄,就劝你们公司不要搞了,以后谁还用软驱呀。
现在都是用E盘,优盘,易盘,有时间想一下易盘怎么加密吧。
 
接受答案了.
 

Similar threads

D
回复
0
查看
549
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部