怎么样才能防止内存密码泄露,分数不够再加!(300分)

  • 主题发起人 主题发起人 山泉
  • 开始时间 开始时间

山泉

Unregistered / Unconfirmed
GUEST, unregistred user!
问两个问题,分数不够再加
1。怎么让用户拨号上网不保存密码(不用控件)
2。以前有一个程序可以读内存密码。程序如下
怎么办才能防止内存密码泄露,不被程序读出。
unit pass;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls;

type
TForm3 = class(TForm)
GroupBox1: TGroupBox;
ListBox: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form3: TForm3;
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);

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

procedure TForm3.FormCreate(Sender: TObject);
begin
if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then
begin
Application.MessageBox('用户没有保存密码', 'sorry', mb_Ok or mb_IconWarning);
//Application.Terminate;
end
else
if Count = 0 then
ListBox.Items.Add('No passwords found...');
end;


end.
 
呵呵,我知道,而且比如说你先运行你这个程序,显示了密码。然后运行我的方法一次,
立刻就无法显示密码了(用其它类似的程序也一样)
给多少分呢?:)
 
你的方法能否说明一下,谢谢
 
修改注册表的一个键值就可以了,我以前做过的.
 
我也想听听
 
:jingtao
修改注册表的一个键值就可以了,我以前做过的.?什么键值?
呵呵,我知道,而且比如说你先运行你这个程序,显示了密码。然后运行我的方法一次,
立刻就无法显示密码了(用其它类似的程序也一样)
给多少分呢?:)
程序或者 方法过来,分数给你400分

 
修改注册表:
HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Currentversion/Polices/Network
键名:DisablePWDcaching
键值为0时用你的程序可以找到密码(如果有而且保存了的话)
键值为1时用你的程序无法找到密码(即使有而且保存了的话)

注意:很多黑客程序它先检测这个键值,如果是1的话就改变为0,取密码后再改回来。
-----------------------------------------------------------------------------
真正取PWL密码的程序不是调用这个MPR.DLL的.
 
测试了,没有用
密码在还内存中
 
如果系统不安全,仅仅依靠应用程序来保证安全是不够的。如果你知道如何拦截API的话,
你会发现只要截一下RasDialA你就可以得到拨号的用户名和密码,包括联想的免费帐号。
 
只有程序内部引用时动态修改判别参数!同时尽量提高程序的优先级,最好变成...!
 
以后小心,太可怕了。
可惜我还不懂。
 
如果是在内存中的话,可以自己写一个加密代码,对密码进行加密,
用的时候解开就可以了。我就这样做过。当时的算法是:
保存一个时间(yyyy/mm/dd hh:mm):
取得密码的字符acsii值
第一个加上yyyy
第二个加上mm
第三个加上dd
:
:
如果长度达与时间的话就从头开始!
 
应该考虑到你的问题是在使用MS的程序时的情况,这是MS的通用加解密算法,虽然没有
公开但大家也都知道了。你可以不用MS的,但是拦截拨号过程,那就没治了,为避免被
拦截,你就需要反拦截啊。话又说回来,有人在你机器上做手脚,如果机器是你的,你
就应该先手监控它,不管它写什么东西或改任何注册内容,你不需要有反应,机器重启
一律格杀。呵呵,其实我很讨厌这样编程的。
 
请问mpr.dll哪里获取?
 
领分,原因见ID=2071973
 
后退
顶部