如何可以做到当打开某个文件夹的时候就弹出一个密码验证窗口,如果密码正确则可以打开此文件夹,密码不正确则打不开此文件!
解决方案 »
- 关于delphi中扫码枪扫码用到的串口控制控件
- delphi中让dxdbedit中只能接受数字与退格键
- 臧天朔。。。。。
- 请问能将adoquery查询出来的数据拷贝拷贝到adoquery中吗?
- ◎◎◎◎◎◎ 潍坊老乡,祝福他们。
- 不用安装驱动的桌面数据库?
- rave求例子
- 我有两个在dll中调用了窗体的例子,在delphi5中运行正常,可是到了delphi6中却运行不正常了
- 一个QREPORT的问题?小弟初学,大哥指教啊!
- ClientDataset如何取得中间层返回的2个记录集
- Treeview的展开事件是什么,怎么在Treeview的末端增加员工名
- DBGridEh的简单问题,如何根木某列的值锁定某行记录不让编辑,其他行可以编辑
2000的话可以用folder.htt来写 不过只能用来玩玩`
LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo,
ArgErr: Pointer): HResult),DispId为DISPID_BEFORENAVIGATE2,此时调用函数DoBeforeNavigate2(
procedure DoBeforeNavigate2(const pDisp: IDispatch; var URL: OleVariant;
var Flags: OleVariant; var TargetFrameName: OleVariant;
var PostData: OleVariant; var Headers: OleVariant; var Cancel: WordBool);)在这个函数中判断这个目录是否允许打开,如果不允许打开,cancel中返回true即可
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, ShellAPI, ExtCtrls, Buttons, ShlObj, Menus,
UnitLockConst;type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
ButtonOpenFile: TSpeedButton;
ButtonEncrypt: TBitBtn;
EditPassword1: TEdit;
EditPassword2: TEdit;
ButtonUnEncrypt: TBitBtn;
EditFileName: TEdit;
CheckBox1: TCheckBox;
LabelPassword1: TLabel;
LabelPassword2: TLabel;
LabelFileName: TLabel;
procedure ButtonEncryptClick(Sender: TObject);
procedure ButtonOpenFileClick(Sender: TObject);
procedure ButtonUnEncryptClick(Sender: TObject);
private
sExeFilename, sPassword: string;{被加壳的文件名,密码}
procedure LockFile;
procedure UnLockFile;
procedure BusyStatus;
procedure CopyFile(FromFile, ToFile: string);
procedure FileAddShellOrNot(FileName: string);
function StringEncrypt(S: string): string;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}{设置控件无效,表示正忙}
procedure TForm1.BusyStatus;
begin
EditPassword1.Enabled := False;
EditPassword2.Visible := False;
LabelPassword2.Visible := False;
buttonEncrypt.Enabled := False;
ButtonUnEncrypt.Enabled:= False;
EditFileName.Enabled := False;
ButtonOpenFile.Enabled := False;
end;{自定义的加密运算,对密码进行简单的加密}
function TForm1.StringEncrypt(S: string): string;
var
i: Byte;
begin
for i := 1 to Length(S) do
S[i] := Char(i or $75 xor ord(S[i]));
Result := S;
end;{拷贝文件}
procedure TForm1.CopyFile(FromFile, ToFile: string);
var
OpStruc: TSHFileOpStruct;
FromBuf, ToBuf: packed array[0..MaxBufferSize - 1] of char;
begin
fillchar(frombuf, sizeof(frombuf), 0);
fillchar(tobuf, sizeof(tobuf), 0);
StrpCopy(frombuf, fromfile);
StrpCopy(tobuf, tofile);
with OpStruc do
begin
wnd := handle;
wFunc := FO_COPY;
pfrom := @frombuf;
pto := @tobuf;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
fAnyOperationsAborted := false;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
{拷贝文件Shell操作}
ShFileOperation(OpStruc);
end;{取文件的大小}
function GetFileSize2(filename:string):integer;
var
sr:TSearchRec;
begin
if (findfirst(filename,faAnyfile and not faDirectory,sr)<>0) then result:=0
else result:=sr.size;
findclose(sr);
end;{加壳}
procedure TForm1.LockFile;
var
FsName, FtName, FbName, FCode: string;
iTargetFile, iSourceFile: Integer;
MyBuf: array[0..MaxBufferSize - 1] of Char;
LockedFile: TLockedFile;
NumRead, NumWritten: Integer;
bSuccessed: Boolean;
begin
BusyStatus;{设置按钮无效,表示正忙}
FsName := sExeFilename;{被加壳的文件名}
FbName := FsName + '.TMP'; {被加壳文件的备份文件名}
{附加代码的文件名}
FCode := ExtractFilePath(paramstr(0))+'DialogPass.exe';
if not fileexists(FCode) then
raise exception.create(FCode+'文件没找到.'); {如果需要备份文件}
if CheckBox1.Checked then
begin
CopyFile(FsName, FbName);
end;
iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
try
with LockedFile do
begin
Flag := CFlag;{自定义的标志}
Name := ExtractFileName(FsName);{文件名}
Caption := '';{标题,保留没有使用}
Password := StringEncrypt(sPassword);{密码}
AdditionalCodeLen := GetFileSize2(FCode);{附加代码的长度}
end;
{临时文件是在被加壳文件名前加"__"}
FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
CopyFile(FCode, FtName);{先拷贝附加代码} {在附加代码之后写被加壳文件}
bSuccessed := False;
iTargetFile := FileOpen(FtName, fmOpenReadWrite);
try
{定位至目标文件的末尾}
FileSeek(iTargetFile, 0, soFromEnd);
repeat
NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
until (NumRead = 0) or (NumWritten <> NumRead);
{最后写上密码等信息}
FileWrite(iTargetFile, LockedFile, SizeOf(LockedFile));
bSuccessed := True;
showmessage('文件加密完成');
finally
FileClose(iTargetFile);
end;
finally
FileClose(iSourceFile);
end;
if bSuccessed then
begin
{删除被加壳的文件}
DeleteFile(FsName);
{把临时文件重命名为被加壳的文件}
RenameFile(FtName, FsName);
end;
{重新检查文件是否已加壳}
FileAddShellOrNot(EditFileName.Text);
end;{脱壳}
procedure TForm1.UnLockFile;
var
FsName, FtName: string;
iSourceFile, iTargetFile: Integer;
NumRead, NumWritten: Integer;
MyBuf: array[0..MaxBufferSize - 1] of Byte;
LockedFile: TLockedFile;
bSuccessed: Boolean;
begin
bSuccessed := False;
with Form1 do
begin
BusyStatus;
FsName := sExeFilename;{已加壳的文件名}
iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
try
{定位到密码等信息的结构}
FileSeek(iSourceFile, -SizeOf(LockedFile), soFromEnd);
{读取密码等信息}
FileRead(iSourceFile, LockedFile, SizeOf(LockedFile));
{如果密码正确}
if LockedFile.Password = StringEncrypt(sPassword) then
begin
{临时文件是在已加壳文件名前加"__"}
FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
iTargetFile := FileCreate(FtName);{创建临时文件}
try
{定位到加壳前原文件的起始位置}
FileSeek(iSourceFile, LockedFile.AdditionalCodeLen ,
soFromBeginning);
{把属于原文件的内容拷贝到临时文件中}
repeat
NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
until (NumRead = 0) or (NumWritten <> NumRead);
bSuccessed := True;
showmessage('文件解密完成');
finally
{最后SizeOf(LockedFile)字节是密码等信息,不需要读取到临时文件中}
FileSeek(iTargetFile, -SizeOf(LockedFile), soFromEnd);
SetEndOfFile(iTargetFile);
FileClose(iTargetFile);
end;
end else
begin
ShowMessage('密码不正确.');
end;
finally
FileClose(iSourceFile);
end;
if bSuccessed then
begin
{删除已加壳的文件}
DeleteFile(FsName);
{把临时文件改为已加壳}
RenameFile(FtName, FsName);
end;
{重新检查文件是否已加壳的文件}
FileAddShellOrNot(sExeFilename);
end;
end;
{点击"加壳"时}
procedure TForm1.ButtonEncryptClick(Sender: TObject);
begin
if not FileExists(EditFileName.Text) then
begin
showmessage('文件不存在.');
exit;
end;
if EditPassword1.Text = '' then
begin
showmessage('密码不能为空.');
exit;
end;
if EditPassword1.Text <> EditPassword2.Text then
begin
showmessage('两次输入的密码不一致');
exit;
end;
sExeFilename := EditFileName.Text;
sPassword := EditPassword1.Text;
{加壳}
LockFile;
end;{选择可执行文件}
procedure TForm1.ButtonOpenFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
EditFileName.Text := OpenDialog1.FileName;
FileAddShellOrNot(EditFileName.Text);{检查是否已加壳}
end;
end;{点击"脱壳"时}
procedure TForm1.ButtonUnEncryptClick(Sender: TObject);
begin
if not FileExists(EditFileName.Text) then
begin
showmessage('文件不存在.');
exit;
end;
if EditPassword1.Text = '' then
begin
showmessage('密码不能为空.');
exit;
end;
sExeFilename := EditFileName.Text;
sPassword := EditPassword1.Text;
{脱壳}
UnLockFile;
end;{检查文件是否已加壳}
procedure TForm1.FileAddShellOrNot(FileName: string);
var
iOpFile: Integer;
LockedFile: TLockedFile;
FileExt: string;
FileAttr: Integer;
begin
{恢复控件的状态}
EditPassword1.Enabled := True;
EditPassword2.Visible := True;
LabelPassword2.Visible := True;
buttonEncrypt.Enabled := True;
ButtonUnEncrypt.Enabled := True;
EditFileName.Enabled := True;
ButtonOpenFile.Enabled := True;
CheckBox1.Enabled := True; FileExt := ExtractFileExt(FileName);
{如果不是可执行文件}
if StrUpper(PChar(FileExt)) <> '.EXE' then
begin
showmessage(FileName+'文件不是EXE文件');
EditFileName.Text := '';
exit;
end;
FileAttr := FileGetAttr(FileName);
{如果文件属性是只读属性}
if FileAttr and faReadOnly > 0 then
begin
{设置文件属性}
if FileSetAttr(FileName,faArchive)<>0 then
begin
showmessage('设置'+FileName+'文件的属性出错!');
EditFileName.Text := '';
exit;
end;
end;
{打开待加壳或脱壳的文件}
iOpFile := FileOpen(FileName, fmOpenRead);
try
{定位到加密结构}
FileSeek(iOpFile, -SizeOf(LockedFile), soFromEnd);
{读密码等信息}
FileRead(iOpFile, LockedFile, SizeOf(LockedFile));
{检查标志,判断是否已加壳}
if LockedFile.Flag = CFlag then
begin
{设置"脱壳"按钮等控件无效}
buttonEncrypt.Enabled := False;
EditPassword2.Visible := False;
LabelPassword2.Visible:= False;
CheckBox1.Enabled := False;
end
else
{设置"加壳"按钮无效}
//ButtonUnEncrypt.Enabled := False;
finally
FileClose(iOpFile);
end;
end;end.
我曾经在Delphi盒子看到过加密文件的,也是双击弹出一对话框,但是文件夹不知道~~~~~
//==========
没想到可以这样加密的。
如果能使对方察看不多文件名称就更好了。
学习。还有3种方法大家看看行不行。
1、folder.htt加密文件夹
不过非常脆弱,非常依赖操作系统。骗骗不会用google的人呗。。
2、服务:利用服务监视操作系统的一举一动。
也容易被攻击而且如果对方使用自己的光盘操作系统,那么over;
3、FAT表加密
不容易被攻击,但是开发难度也不小。我现在也只做到
读取,写fat表吗,不敢,硬盘好贵的
我还改成能自动预览flash文件的功能,就象在右栏能够显示图片一样的功能。