如何在DELPHI中用SQL语句修改ACCESS密码,请教
解决方案 »
- 大家来看看,一个很简单的问题
- 如何启用/禁用外部程序中的控件
- DataSet.Locate 不能定位浮点字段
- 怎么让cxGrid表格里的数据可修改 但不修改数据库里的记录
- 如何将“11/08/2005-RC410-SB450-PTRC-GC-00”字符串当遇到“/”“-”时,把它分开存到其它字符串变量中???
- 请教!!!如何用TServerSocket,TClientSocket来发送与接收Tstream类型数据
- 请问高手,Delphi7能不能直接调用C语言的*.dll文件
- 如何远程控制局域网内的某一台电脑开关机等?
- 在win2000中如何使用自定义纸张打印?急...
- 有关Delphi的简单问题
- 关于第三方组件的问题,放200分!
- 请问,怎样在线程中调用COM?!
const
xorString:array[0..12]of byte=
( $86, $FB, $EC, $37,
$5D, $44, $9C, $FA,
$C6, $5E, $28, $E6,$13 );
xorString2:array[0..20]of byte=
( $D3, $EC, $08, $9C,
$93, $28, $46, $8A,
$01, $7B, $A0, $DF,
$22, $13, $9A, $B1,
$61, $79, $C7, $7C,$5B);
var
passBuf:array[0..14]of byte;
pass:array[0..14]of char;
passBuf2:array[0..40]of byte;
pass2:array[0..20]of char;
B:Byte;
F:TFileStream;
I,j:integer;
begin
if not FileExists(FileNameEdit.Text) then exit;
F:=TFileStream.Create(FileNameEdit.Text,fmOpenRead);
if NOT chk2000.Checked then
try
F.Seek($42,soFromBeginning);
F.Read(passBuf,14);
for I:=0 to 13 do
begin
B := passBuf[i] xor xorString[i];
pass[i]:=char(B);
end;
pass[sizeof(pass) - 1] := #0;
passEdit.Text:=StrPas(Pass);
finally
F.Free;
end else
try
F.Seek($42,soFromBeginning);
F.Read(passBuf2,40);
I:=0;j:=0;
while I<40 do
begin
B := passBuf2[i] xor xorString2[j];
pass2[j]:=char(B);
inc(i,2);inc(j);
end;
pass2[sizeof(pass2) - 1] := #0;
passEdit.Text:=StrPas(Pass2);
finally
f.Free;
end;
end;
原理:
在Access数据库中,为了安全起见,可以为所建的数据库设置密码。
用Access所建的数据库,在库文件的地址00000042处开始的13个字节
是Access库的密码位。
如果一个未加密的库,这13个字节原始数据依次为:access97(
86 FB 37 5D 44 9C FA C6 28 E6 13。),access2000则为上面的(xorString2)事实上,
当你设置了密码后,Access就将你的密码(
请注意你所输入的密码是本文字符)的ACSII码与
以上的13个字节数据进行异或操作,
因此,从库文件的地址00000042开始的13个字节就变成了密钥了
。例如,如果你设置的密码为abc,经过异或操作后,
则从00000042处开始的13个字节的数据变成了E7 99 8F 37 5D 44 9C FA C6 28 E6 13。
一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。
因此,对已经设置了密码的Access库,
只要将13个密钥数据与原始的13个数据进行一次异或操作就可得到密码了。