读书人

怎么对磁盘进行写保护,只读属性

发布时间: 2012-03-01 10:25:46 作者: rapoo

如何对磁盘进行写保护,只读属性
我想实现如下的功能,
通过软缉拿实现对硬盘(C:\ D:\)或者移动硬盘的写保护,只能读出,不能写入文件
或者对文件夹的控制,
用户不能通过windows的属性对话框进行改变.
大家给点思路
分不够就说,只要能帮忙解决,分不是问题.

[解决办法]
给你个思路吧
软盘上有写保护缺口,在对软盘进行写操作前,BIOS要检查软盘状态,如果写保护缺口被封住,则不能进行写操作。而写保护功能对硬盘而言,在硬件上无法进行,但可通过软件来实现。 在DOS系统下,磁盘的写操作包括几种情况:①在COMMAND.COM支持下的写操作,如MD、RD、COPY等;②在DOS功能调用中的一些子功能如功能号为10H、13H、3EH、5BH等可以对硬盘进行写操作;③通过INT 26H将逻辑扇区转换为绝对扇区进行写;④通过INT 13H的子功能号03H、05H等对磁盘进行写操作。 但每一种写操作最后都要调用INT 13H的子功能去实现。

虼耍如果对INT 13H进行拦截,可以实现禁止对硬盘特定逻辑盘的写操作。由于磁盘上文件的写操作是通过INT 13H的03H子功能进行写,调用此子功能时,寄存器CL表示起始扇区号(实际上只用到低6位);CH表示磁道号,在硬盘即为柱面号,该柱面号用10位表示,其最高两位放在CL的最高两位。对硬盘进行分区时可以将硬盘分为多个逻辑驱动器,而每个逻辑驱动器都是从某一个完整的柱面开始。如笔者的硬盘为2.5GB,分为C、D、E、F、G五个盘。其中C盘起始柱面号为00H,D盘起始柱面号为66H,E盘起始柱面号为E5H,F盘起始柱面号为164H,G盘起始柱面号为26BH。如果对INT 13H进行拦截,当AH=03H,并且由CL高两位和CH共同表示的柱面号大于E4H并小于164H,就什么也不做就返回,这样就可以实现对E盘禁止写。

[解决办法]
unit dllMain;
interface
uses
SysUtils,Windows,Winsock,Graphics,tlHelp32,madCodeHook;
type
//要HOOK的API函数定义
TSockSendProc = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
TSockRecvProc = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
TMsgBoxProc = function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
//--------------------函数声明---------------------------
function Sun_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
function Sun_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
function Sun_Box(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
procedure Hook;stdcall;export;
procedure UnHook;stdcall;export;
var
//用来保存原来函数的地址
sunSend: TSockSendProc;
sunRecv: TSockRecvProc;
sunMsg: TMsgBoxProc;
i: Integer;

implementation
function Sun_Box(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
var
strTemp: string;
begin
strTemp := '珊瑚虫:sunsjw ';
Result := sunMsg(hWnd,lpText,pchar(strTemp),uType);
end;
{---------------------------------------}
{函数功能:Recv函数的HOOK
{函数参数:同Recv
{函数返回值:integer
{---------------------------------------}
function Sun_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
//在这里要对接收的数据Buf进行处理
//暂时不处理了,随便响一声吧。
MessageBeep(0);
//调用直正的Send函数
Result := sunRecv(s,Buf,len, flags);
end;
{---------------------------------------}
{函数功能:Send函数的HOOK
{函数参数:同Send
{函数返回值:integer
{---------------------------------------}
function Sun_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
DeskDC: HDC;
Can: TCanvas;
str: string;
found: boolean;
Hand,CurrHand: THandle;
lppe: TProcessEntry32;
begin
DeskDC := GetDC(0);
Can := TCanvas.Create;
Can.Handle := DeskDC;
CurrHand := GetCurrentProcessID();
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
lppe.dwSize := sizeof(lppe);
found := Process32First(Hand,lppe);
while found do
begin
if lppe.th32ProcessID=CurrHand then
begin
str := lppe.szExeFile;
found := false;
end
else
found := Process32Next(Hand,lppe);
end;
try
Inc(i);
Can.TextOut(0,0,str+ ':正在发送数据... ');
finally
Can.Free;
ReleaseDC(0,DeskDC);
end;
Result := sunSend(s,Buf,len, flags);
end;
{------------------------------------}
{过程功能:HookAPI
{过程参数:无
{------------------------------------}


procedure Hook;
begin
HookAPI( 'ws2_32.dll ', 'send ',@Sun_Send,@sunSend);
HookAPI( 'ws2_32.dll ', 'recv ',@Sun_Recv,@sunRecv);
HookAPI( 'user32.dll ', 'MessageBoxA ',@sun_Box,@sunMsg);
end;
{------------------------------------}
{过程功能:取消HOOKAPI
{过程参数:无
{------------------------------------}
procedure UnHook;
begin
UnHookAPI(@sunSend);
UnHookAPI(@sunRecv);
UnHookAPI(@sunMsg);
end;
end.
////////////////////////////////////////////
//调用
unit callMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,madCodeHook;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//把我们的函数注放到其它进程中
InjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'hookMsg.dll ');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
UninjectLibrary(ALL_SESSIONS or SYSTEM_PROCESSES, 'hookMsg.dll ');
end;
end.


[解决办法]
API Hook是不行的,
有一些软件写磁盘不是用的CreateFile

要用文件系统驱动IFS
[解决办法]
去网上找《Windows文件系统过滤驱动开发教程》

读书人网 >.NET

热点推荐