两个解密问题!灌水者都有份!!!(200分)

  • 主题发起人 主题发起人 chehongll
  • 开始时间 开始时间
C

chehongll

Unregistered / Unconfirmed
GUEST, unregistred user!
1、对于ACCESS 2000数据库是在其什么位置并采取何种方式实行加密的?(它与ACCESS 97不同)
2、拨号网络中密码保存在什么位置?采取何种方式加密的?
 
哈哈,我第一个回答,但我却不知道答案,很抱歉![:)]
 
1。Access 2000数据库的密码忘了怎么办



  在Access 2000 数据库中,为了安全起见,可以为所建的数据库设置密码。但是,密码忘了怎么办?别急,这里介绍一种密码破解方法。
  用磁盘编辑工具打开Access 2000 所建的数据库,在库文件的地址00000042处开始的40个字节是Access 2000库的密码位。如果一个未加密的库,这40个字节原始数据依次为:29 77 EC 37 F2 C8 9C FA 69 D2 28 E6 BC 3A 8A 60 FB 18 7B 36 5A FE DF B1 D8 78 13 43 60 23 B1 33 9B ED 79 5B 3D 39 7C 2A 。当你给数据库设置了密码后,这40个字节就变成了密钥。因此,要破解密码而不需保持原库的密码,只要将00000042 处开始的40个字节还原成原始数据就行了。要做到这一点,你可用磁盘编辑工具或将以下所附的程序稍加修改,把以上所列40个数据填到00000042开始处。
  但是,有没有办法既能破解密码又能保持原密码呢?有。要做到这一点,必须搞清楚Access 2000库的加密原理。事实上,Access 2000库的加密原理很简单。当你设置了密码后,Access 2000 就将你的密码(请注意你所输入的密码是ASCII字符)的ASCII码与以上的40个字节数据进行异或操作,因此,从库文件的地址00000042开始的40个字节就变成了密钥了。例如,如果你设置的密码为12345678901234567890(注意:最多只能设20个ASCII字符),经过异或操作后,则从00000042处开始的40个字节的数据就变成了 18 77 DE 37 C1 C8 A8 FA 5C D2 1E E6 8B 3A B2 60 C2 18 4B 36 6B FE ED B1 EB 78 27 43 55 23 87 33 AC ED 41 5B 04 39 4C 2A 。大家都知道,一个数据经过一次异或操作后,再一次经过同样的异或操作就可还原了。因此,对已经设置了密码的Access 2000库,只要将40个密钥数据与原始的40个数据进行一次异或操作就可得到密码了。
以下是一个C语言破解程序:
/* 假设加密码后的Access 2000库为myacc.mdb,并存放在C盘的根目录下 */
#include "stdio.h"
main( )
{
FILE *fp;
char mm0[40]={0x29,0x77,0xec,0x37,0xf2,
0xc8,0x9c,0xfa,
0x69,0xd2,0x28,0xe6,0xbc,0x3a,0x8a,0x60,
0xfb,0x18,0x7b,0x36,0x5a,0xfe,0xdf,0xb1,
0xd8,0x78,0x13,0x43,0x60,0x23,0xb1,0x33,
0x9b,0xed,0x79,0x5b,0x3d,0x39,0x7c,0x2a};
/* 这是40个原始数据 */
char mm1[40],mm2[40];
/* mm1用来存放加密后的40个密钥;mm2用来存放密码 */
int i,k;
fp=fopen("c://myacc.mdb","rb");
if (fp==NULL){
printf("/n不能打开该库!");
exit(0);
}
rewind(fp);
fseek(fp,0x42L,0);
fread(mm1,40,1,fp); /* 读取密钥 */
for (i=0;i<40;i++)
mm2=mm0^mm1;/* 原始数据与密钥异或 */
fclose(fp);
k=0;
for (i=0;i<40;i++){
if (mm2!=0){
k=1;
break;
}
}
if (k==0) /* k为0,表示未设密码 */
printf("/n未设密码!");
else{ /* k为1,表示设有密码 */
printf("/n密码是:/n");
for (i=0;i<40;i=i+2) /* 打印密码 */
printf("%c",mm2);
}
}
  顺便提一下,由于ACCESS 2000对每个密码字符采用双字节表示,故40个字节原始数据可依次分为20组,每组代表一个密码字符,进行异或操作的是每组的第一个字节,第二个字节不变。

2。对Win9X来说,用户密码隐藏在系统目录*.Pwl中,试试下面的程序
不管是拨号网络密码,或是共享目录密码,只要是Save了的,统统都可以出来了.
unit Main;

interface

uses
Windows, SysUtils, Classes, Forms, ShellAPI, Controls, StdCtrls;

type
TfrmMain = class(TForm)
GroupBox1: TGroupBox;
ListBox: TListBox;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
hMPR: THandle;
end;

var
frmMain: TfrmMain;

const
Count: Integer = 0;

function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; stdcall;

implementation

{$R *.DFM}
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar; dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';

type
PWinPassword = ^TWinPassword;
TWinPassword = record
EntrySize: Word;
ResourceSize: Word;
PasswordSize: Word;
EntryIndex: Byte;
EntryType: Byte;
PasswordC: Char;
end;

var
WinPassword: TWinPassword;

function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool; stdcall;
var
Password: String;
PC: Array[0..$FF] of Char;
begin
inc(Count);

Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);
PC[WinPassword.ResourceSize] := #0;
CharToOem(PC, PC);
Password := StrPas(PC);

Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize + WinPassword.ResourceSize);
Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);
PC[WinPassword.PasswordSize] := #0;
CharToOem(PC, PC);
Password := Password + ': ' + StrPas(PC);

frmMain.ListBox.Items.Add(Password);
Result := True;
end;

procedure TfrmMain.FormShow(Sender: TObject);
begin
if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then
begin
Application.MessageBox('Can''t load passwords: User is not logon.', 'Error', mb_Ok or mb_IconWarning);
Application.Terminate;
end
else
if Count = 0 then
ListBox.Items.Add('No passwords found...');
end;

end.
 
无话可说了。
 
第二个问题用一个看**的工具就能得到,具体存放位置我也不知道
 
forgot2002大虾: 我任意用ACCESS 2000创建的两个数据库发现它们从000000X42处开始的
数值有些还不一样。和你提供的40个字节数值也不一样。这两个数据库都是未加密的。这
是怎么回事?????
 
有意思!
 
forgot2002大虾: 我用ACCESS 2000创建的两个没有加密的数据库从000000X42处开始
凡用作加密的字节数值都不一样。为什么??????????
 
没有尝试过。几年前抄过这段东西,却没有成功。因为当时我对Excel与Access分不清。
 
不错。学习
 
Access 2000,密码为有几个字节为动态生成,一般固定字节的密码可以破戒,
动态生成的几个无能为力
 
这里有工具
http://widelyskyture.myetang.com/hack/ruanjian/attack.htm
 
可放在注册表,也可放在Cookie里面,也可放在自定义文件中。
 
多人接受答案了。
 

Similar threads

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