Windows文字框星號密碼檢視器
Windows文字框星號密碼檢視器
本人2002的學習作品
作者:成曉旭
1、 設計原理:註冊一個系統級滑鼠掛鉤,通過監測系統滑鼠所在Windows視窗來獲取密碼,成功獲取密碼之後,通過傳送自定義的Windows系統訊息,到宿主程式。
2、 Hook動態連結庫設計原理:採用Windows Hook技術[滑鼠掛鉤],切入遠端程式內部,並監測當前系統滑鼠所在位置的當然視窗控制程式碼(通過Windows APIWindowFromPoint()),獲取視窗控制程式碼之後,判斷當然視窗是否為文字框,並進一步判斷是否為密碼框,當發現是密碼輸入框時,當此視窗傳送WM_GETTEXT訊息,獲取密碼。成功獲取密碼之後,發現自定義的WM_COPYDATA訊息到宿主程式;
具體實現步驟簡介:
1. 設定系統滑鼠掛鉤:
hkMouseHook := SetWindowsHookEx(WH_MOUSE,@CXX_MouseHookProc,hInstance,0);
2. 登出系統滑鼠掛鉤:
UnHookWindowsHookEx(hkMouseHook);
3. 監測當然視窗及視窗風格判斷:
MousePos := pMhs.pt;
wnd := WindowFromPoint(pmhs.pt);
style := GetWindowLong(wnd,GWL_STYLE);
if (style and ES_PASSWORD) = ES_PASSWORD then
begin
//發現密碼視窗
end;
4. 向密碼框獲取密碼串:
SendMessage(wnd,WM_GETTEXT,256,Integer(@MouseTitle[0]));
5. 傳送自定義訊息到宿主程式:
GetMem(pmi,sizeof(TMouseInfo));
pmi.MouseX := pt.X;
pmi.MouseY := pt.Y;
pmi.MouseTitle := pwd;
GetMem(pcds,sizeof(TCopyDataStruct));
pcds.dwData := 9910;
pcds.cbData := sizeof(TMouseInfo);
pcds.lpData := pmi;
SendMessage(hDec,WM_COPYDATA,0,LPARAM(pcds));
3、 宿主程式設計原理:我的宿主程式是自己學習Windows SDK開發時作品,採用純SDK實現。SDK的程式設計不用廢話了吧。在這個工具程式中,只需要在系統訊息處理方法中,增加一個對WM_COPYDATA的攔截及處理過程就可能了。
case uMsg of
WM_COPYDATA:
begin
CXX_ReceiveCopyData(uMsg);
end;
……
end;
4、 應用技術提點:這個是本人在2002年學習Microsoft Windows SDK程式設計技術時的學習作品。當然,有興趣的話,你完全可以將其Hook進一步進行隱藏,併為其增加“埠反彈”或者“半連線”功能,宿主程式可以是自己的遠端XXXXXX,哈哈,這樣釋出出來的話,想知道的東西就多了……
5、 完整原始碼程式碼:
1. Hook滑鼠掛鉤部分:
產品名稱: Windows 密碼工具[Window98/NT/2000/XP]
功能描述: 擷取Windows密碼編輯框中的密碼串
採用純粹的SDK開發
能捕捉windows98/NT/2000/XP的密碼框中的"*"密碼
開發平臺: Windows2000 + Delphi6 + MSDN + SDK
開發者: 成曉旭
版權所有: 成曉旭
模組設計者: 成曉旭
設計思路: 採用Windows Hook技術[滑鼠掛鉤],切入遠端程式內部,
再傳送WM_GETTEXT訊息擷取密碼,最後用SendMessage傳送
WM_COPYDATA訊息自定義的密碼資訊結構體到目標視窗,以
顯示或處理Hook DLL所擷取的遠端程式的密碼.
開始時間: 2002年3月4日
完成時間: 2002年5月24日[最終實現]
備 注: 此工具是本人在2002年開發的第二個軟體
本工具在2000年6月份左右曾實現過一個Windows98下的
密碼擷取工具,兩年以來,我一直沒有放棄過實現Windows
作業系統下的所有密碼的擷取,如此,終於實現了兩年以來
未曾實現的擷取WindowsNT系列的密碼.[2002/05/24]
以後的路還很長:WindowNT系列的當前使用者登入密碼、
記憶體長駐的其它密碼等等.
}
unit MouseHook;
interface
uses
Messages,Windows;//,SysUtils;
var
hkMouseHook:HHook;
ProcSafelyExit:Pointer;
uCXXMsg:UINT;
procedure DllEntryProc(ul_reason_for_call:DWORD);
procedure SetupHook(fSet:boolean);stdcall;export;
function CXX_MouseHookProc(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
procedure AutoUnInstallHook();far;
implementation
uses DataStruct;
procedure CXX_SendCopyData(pt:TPoint;pwd:TMTitle);
var
pcds:PCopyDataStruct;
pmi:PMouseInfo;
hDec:THandle;
begin
hDec:=Findwindow(Nil,'WM_COPYDATA接收端');
if hDec = 0 then
begin
MessageBox(0,'資料接收視窗沒有找到,程式拒絕傳送WM_COPYDATA訊息!','提示',MB_OK or MB_ICONWARNING);
Exit;
end;
try
GetMem(pmi,sizeof(TMouseInfo));
pmi.MouseX := pt.X;
pmi.MouseY := pt.Y;
pmi.MouseTitle := pwd;
GetMem(pcds,sizeof(TCopyDataStruct));
pcds.dwData := 9910;
pcds.cbData := sizeof(TMouseInfo);
pcds.lpData := pmi;
SendMessage(hDec,WM_COPYDATA,0,LPARAM(pcds));
//PostMessage(hDec,WM_COPYDATA,Handle,LPARAM(pcds));
finally
FreeMem(pmi);
FreeMem(pcds);
end;
end;
function CXX_MouseHookProc(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
var
pMhs:PMOUSEHOOKSTRUCT;
wnd:HWND;
style:LongInt;
MousePos:TPoint;
MouseTitle:TMTitle;
begin
if iCode = HC_ACTION then
begin
FillChar(MouseTitle,255,0);
pMhs := PMOUSEHOOKSTRUCT(lParam);
MousePos := pMhs.pt;
wnd := WindowFromPoint(pmhs.pt);
style := GetWindowLong(wnd,GWL_STYLE);
if (style and ES_PASSWORD) = ES_PASSWORD then
begin
SendMessage(wnd,WM_GETTEXT,256,Integer(@MouseTitle[0]));
//傳送擷取的資訊[]
CXX_SendCopyData(MousePos,MouseTitle);
end;
end;
Result := CallNextHookEx(hkMouseHook,iCode,wParam,lParam);
end;
procedure SetupHook(fSet:boolean);stdcall;export;
begin
if fSet then
begin
if hkMouseHook <> 0 then Exit;
hkMouseHook := SetWindowsHookEx(WH_MOUSE,@CXX_MouseHookProc,hInstance,0);
//if hkMouseHook <> 0 then
// MessageBox(0,'滑鼠掛鉤安裝成功!!!','掛鉤提示',MB_ICONINFORMATION or MB_OK)
//else
// MessageBox(0,'滑鼠掛鉤安裝失敗!','掛鉤提示',MB_ICONWARNING or MB_OK);
end
else
begin
if hkMouseHook <> 0 then
begin
UnHookWindowsHookEx(hkMouseHook);
hkMouseHook := 0;
//if hkMouseHook = 0 then
// MessageBox(0,'滑鼠掛鉤撤消成功!!!','掛鉤提示',MB_ICONINFORMATION or MB_OK)
//else
// MessageBox(0,'滑鼠掛鉤撤消失敗!','掛鉤提示',MB_ICONWARNING or MB_OK);
end;
end;
end;
procedure DllEntryProc(ul_reason_for_call:DWORD);
begin
{
if ul_reason_for_call = DLL_PROCESS_ATTACH then
begin
MessageBox(0,'DLL_PROCESS_ATTACH','MouseDll Hint',MB_OK or MB_ICONINFORMATION);
//uCXXMsg := RegisterWindowMessage(SELF_MESSAGE_NAME);
end
else if ul_reason_for_call = DLL_PROCESS_DETACH then
begin
MessageBox(0,'DLL_PROCESS_DETACH','MouseDll Hint',MB_OK or MB_ICONINFORMATION);
end;
}
end;
procedure AutoUnInstallHook();
begin
if hkMouseHook <> 0 then
SetupHook(False);
ExitProc := ProcSafelyExit;
end;
end.
2. 宿主程式部分:
此程式中,還有關於Windows程式資源載入以及視窗背景繪製等技術的演示。
產品名稱: Windows 密碼工具
功能描述: 擷取Windows密碼編輯框中的密碼串
採用純粹的SDK開發
開發平臺: Windows2000 + Delphi6 + MSDN + SDK
開發者: 成曉旭
版權所有: 成曉旭
模組設計者: 成曉旭
開始時間: 2002年3月4日
完成時間: 2002年3月4日
修改時間1: 2002年3月4日
備 注: 此工具是本人在2002年開發的第二個軟體,
}
program MouseExe;
uses
Windows,
SysUtils,
Messages,
Tie_In_MHook in 'Tie_In_MHook.pas',
DataStruct in 'DataStruct.pas';
{$R MouseExe.res}
const
CXX_WND_CLASS = 'DC_Password'; //主視窗類名
CXX_WND_CAPTION = 'Window2000/XP 密碼捕捉工具';
CXX_PASSKEY = 'chenxiaoxu';
MOUSE_MOVE_TIMER = WM_USER + 9910;
SELF_MESSAGE_NAME = 'CXX_Test_Window_Message';
var
hWndMain, //程式主視窗控制程式碼
hBtnCheck, //程式傳送按鈕控制程式碼
hBtnClose, //程式關閉按鈕控制程式碼
hStcPos, //滑鼠位置提示
hStcTitle, //視窗標題提示
hEdtPos, //滑鼠當前位置
hEdtTitle: //獲取視窗標題
LongWord;
hInstMain: integer; //程式例項控制程式碼
hBGBmp : HBITMAP; //主視窗背景圖片控制程式碼
hCur: HICON;
uCXXMsg: UINT;
procedure CXX_SendCopyData();
var
pcds:PCopyDataStruct;
pmi:PMouseInfo;
hDec:THandle;
begin
hDec:=Findwindow(Nil,'WM_COPYDATA接收端');
if hDec = 0 then
begin
MessageBox(hWndMain,'資料接收視窗沒有找到,程式拒絕傳送WM_COPYDATA訊息!','提
示',MB_OK or MB_ICONWARNING);
Exit;
end;
//try
GetMem(pmi,sizeof(TMouseInfo));
pmi.MouseX := 10;
pmi.MouseY := 50;
pmi.MouseTitle := 'chenxiaoxu';
GetMem(pcds,sizeof(TCopyDataStruct));
pcds.dwData := 9910;
pcds.cbData := sizeof(TMouseInfo);
pcds.lpData := pmi;
SendMessage(hDec,WM_COPYDATA,hWndMain,LPARAM(pcds));
//PostMessage(hDec,WM_COPYDATA,Handle,LPARAM(pcds));
//finally
FreeMem(pmi);
FreeMem(pcds);
//end;
end;
procedure CXX_ReceiveCopyData(Msg:TMessage);
var
str:string;
begin
str := IntToStr(PMouseInfo(PCOPYDATASTRUCT(Msg.LParam)^.lpData)^.MouseX);
str := str + IntToStr(PMouseInfo(PCOPYDATASTRUCT(Msg.LParam)^.lpData)^.MouseY);
end;
//繪製視窗點陣圖背景函式
function CXX_DrawBGBitmap(fdc:HDC;fBitmap:HBitmap):boolean;
var
hdcMem:HDC;
rect:TRect;
bmp:Bitmap;
x,y:integer;
begin
// bmp := nil;
Result := False;
//主視窗背景圖片尚未載入,不能繪製視窗背景
if fBitmap = 0 then Exit;
//獲取繪圖區域
GetClientRect(hWndMain,rect);
//建立相容記憶體裝置描述表
hdcMem := CreateCompatibleDC(fdc);
if hdcMem = 0 then Exit;
//設定點陣圖物件
if (GetObject(fBitmap,sizeof(Bitmap),@bmp) = 0) then Exit;
//設定記憶體裝置描述表內容
if NOT Boolean(SelectObject(hdcMem,fBitmap)) then Exit;
//繪製視窗背景圖片
x := 0;
while(x <= rect.Right-rect.Left) do
begin
y := 0;
while(y <= rect.Bottom-rect.Top) do
begin
BitBlt(fdc,x,y,bmp.bmWidth,bmp.bmHeight,hdcMem,0,0,SRCCOPY);
y := y + bmp.bmHeight;
end;
x := x + bmp.bmWidth;
end;
Result := DeleteDC(hdcMem);
end;
{
function CXX_SetWinCaption():設定視窗物件標題函式
引數定義:
hWnd: 視窗物件控制程式碼
pchText:視窗物件標題
}
procedure CXX_SetWinCaption(hWnd:hWND;pchText:PChar);
begin
SendMessage(hWnd,WM_SETTEXT,0,Integer(pchText));
//SetWindowText(hWnd,pchText);
end;
{
function CXX_GetWinCaption():取得按鈕標題函式
引數定義:
hWnd: 按鈕控制程式碼
pchText:按鈕標題
}
procedure CXX_GetWinCaption(hWnd:hWND;pchText:PChar);
begin
SendMessage(hWnd,WM_GETTEXT,255,Integer(pchText));
end;
procedure CXX_MouseMoveTimerProc(hWin:HWND;uMsg:UINT;idEvent:UINT;dwTime:DWORD);
begin
//MessageBox(hWin,'系統時間','提示',0);
end;
function CXX_SetProgramTimer(fSetTimer:boolean):boolean;
begin
Result := False;
if fSetTimer then
begin
//if SetTimer(hWndMain,MOUSE_MOVE_TIMER,3000,@CXX_MouseMoveTimerProc) <> 0 then
if SetTimer(hWndMain,MOUSE_MOVE_TIMER,100,nil) <> 0 then
Result := True;
end
else
begin
if KillTimer(hWndMain,MOUSE_MOVE_TIMER) then
Result := True;
end;
end;
//主視窗訊息回撥函式
//function CXX_MainWindowProc(hWnd,uMsg,wParam,lParam:DWord):LRESULT;stdcall;
function CXX_MainWindowProc(hWnd:DWord;uMsg:TMessage;wParam,lParam:DWord):LRESULT;stdcall;
var
// pchPassword:PCHAR;
dc :HDC;
ps:PAINTSTRUCT;
begin
{
if uMsg = uCXXMsg then
begin
MessageBox(hWnd,'自定義訊息來了!!!','Hint',0);
MessageBox(hWnd,PChar(lParam),'訊息內容',0);
end;
}
case uMsg of
WM_COPYDATA:
begin
//MessageBox(hWndMain,'視窗接收WM_COPYDATA訊息!','提示',MB_OK or MB_ICONWARNING);
CXX_ReceiveCopyData(uMsg);
end;
WM_CREATE:
begin
uCXXMsg := RegisterWindowMessage(SELF_MESSAGE_NAME);
end;
WM_RBUTTONDBLCLK: //$0206
PostQuitMessage(0);
WM_COMMAND: //$0111
begin
if lParam = hBtnClose then
begin
if MessageBox(hWnd,PChar('確定要退出【'+CXX_WND_CAPTION+'】嗎?'),'確
認',MB_YESNO or MB_ICONQUESTION) = IDYES then
PostQuitMessage(0);
end
else if lParam = hBtnCheck then
begin
//CXX_SetProgramTimer(True);
//PostMessage(HWND_BROADCAST,uCXXMsg,0,0);
//SetupHook(True);
CXX_SendCopyData();
end;
end;
WM_PAINT:
begin
dc := BeginPaint(hWnd,ps);
if NOT CXX_DrawBGBitmap(dc,hBGBmp) then
MessageBox(hWnd,'繪製主視窗背景失敗呢!','提示',MB_OK or MB_ICONWARNING);
end;
WM_DESTROY:
begin
CXX_SetProgramTimer(false);
Halt; //$0002:
end;
end; //End of Case
Result := DefWindowProc(hWnd,uMsg,wParam,lParam);
end;
//應用程式例項化
function CXX_InitInstance():boolean;
var
wndClass:TWndClass;
begin
hInstMain := hInstance;
hCur := LoadCursor(hInstMain,'HANDLE');
if hCur = 0 then
MessageBox(hWndMain,'載入主視窗背景圖片失敗!!!','提示',MB_OK or
MB_ICONWARNING)
else
SetCursor(hCur);
hBGBmp := LoadBitmap(hInstMain,'BACKBMP');
if hBGBmp = 0 then
MessageBox(hWndMain,'載入主視窗背景圖片失敗!!!','提示',MB_OK or
MB_ICONWARNING);
wndClass.cbClsExtra := 0;
wndClass.cbWndExtra := 0;
wndClass.hInstance := hInstMain;
wndClass.hIcon := 0;
wndClass.hCursor := LoadCursor(0,IDC_HAND);
wndClass.hbrBackground := CTLCOLOR_EDIT;
wndClass.lpfnWndProc := @CXX_MainWindowProc;
wndClass.lpszClassName := CXX_WND_CLASS;
wndClass.lpszMenuName := nil;
wndClass.style := CS_DBLCLKS;
Result := Boolean(RegisterClassA(wndClass));
end;
//主程式函式
procedure CXX_RunMainProgram();
var
myMsg:TMsg;
begin
if NOT CXX_InitInstance() then
Exit;
hWndMain := CreateWindowEx(WS_EX_CLIENTEDGE or WS_EX_TOPMOST,
CXX_WND_CLASS,CXX_WND_CAPTION,
WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX,
0,0,320,150,0,0,hInstMain,nil);
hStcPos := CreateWindowEx(0,'static','滑鼠位置:',
WS_VISIBLE OR WS_CHILD,
5,10,80,20,
hWndMain,0,hInstMain,nil);
hEdtPos := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','',
WS_VISIBLE OR WS_CHILD,
100,10,200,20,
hWndMain,0,hInstMain,nil);
hStcTitle := CreateWindowEx(0,'static','獲取密碼:',
WS_VISIBLE OR WS_CHILD,
5,50,80,20,
hWndMain,0,hInstMain,nil);
hEdtTitle := CreateWindowEx(WS_EX_CLIENTEDGE,'Edit','',
WS_VISIBLE OR WS_CHILD,
100,50,200,20,
hWndMain,0,hInstMain,nil);
hBtnCheck := CreateWindowEx(WS_EX_STATICEDGE or WS_EX_CLIENTEDGE,'Button','傳送訊息',
WS_VISIBLE OR WS_CHILD,
10,85,100,30,
hWndMain,0,hInstMain,nil);
hBtnClose := CreateWindowEx(WS_EX_STATICEDGE or WS_EX_CLIENTEDGE,'Button','退出程式',
WS_VISIBLE OR WS_CHILD,
180,85,100,30,
hWndMain,0,hInstMain,nil);
//主程式函式迴圈
while(GetMessage(myMsg,hWndMain,0,0)) do
begin
TranslateMessage(myMsg);
DispatchMessage(myMsg);
end;
end;
begin
CXX_RunMainProgram();
end.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1004627
相關文章
- 經典星號檢視器檢視密碼密碼
- windows檢視wifi密碼WindowsWiFi密碼
- 短視訊原始碼,密碼框驗證資訊文字提示原始碼密碼
- 在windows上如何檢視wifi密碼WindowsWiFi密碼
- 密碼框提示文字程式碼例項密碼
- 為密碼文字框不可粘帖字串密碼字串
- Android之WiFi密碼檢視器AndroidWiFi密碼
- Windows 7 下檢視無線網路密碼Windows密碼
- 密碼框提示文字效果程式碼例項密碼
- 路由器中寬頻密碼檢視路由器密碼
- windows10怎麼檢視系統版本號_如何檢視windows10版本號Windows
- windos IE密碼檢視密碼
- windows下使用cmd檢視連線過的wifi密碼WindowsWiFi密碼
- 取消Windows的開機登陸密碼框Windows密碼
- win10如何檢視wifi密碼_win10檢視wifi密碼方法Win10WiFi密碼
- Windows事件檢視器(收集)Windows事件
- JQuery設定文字框和密碼框獲得焦點時樣式jQuery密碼
- 輸入密碼檢視flag密碼
- 實現密碼框預設文字效果例項程式碼密碼
- win10 如何檢視wifi密碼_window10如何檢視無線密碼Win10WiFi密碼
- js實現的驗證表單文字框和密碼框是否為空程式碼JS密碼
- 做一個自己的WiFi密碼檢視器——AndroidWiFi密碼Android
- 使用命令檢視windows系統連線過的wifi密碼WindowsWiFi密碼
- windows下使用命令列檢視已儲存的wifi密碼Windows命令列WiFi密碼
- js檢測文字框是否為空程式碼例項JS
- Mac基礎:在macOS上輕鬆檢視已登賬號密碼Mac密碼
- Redis 密碼設定和檢視Redis密碼
- docker檢視jenkins初始密碼DockerJenkins密碼
- win10怎麼檢視wifi賬號密碼_win10電腦怎麼看wifi密碼Win10WiFi密碼
- 在Windows 8.1下修改VPN帳號密碼Windows密碼
- 如何在終端輸入密碼時顯示星號密碼
- win10 無線密碼怎麼檢視_win10如何檢視無線網密碼Win10密碼
- windows2003中事件檢視器程式碼Windows事件
- (開發必看)windows檢視埠號使用情況Windows
- AIX檢視序列號和微碼命令AI
- 檢視埠號
- 檢視文字[Linux]Linux
- HTML input password密碼框HTML密碼