JCer Catcher(JCC)

· · 个人记录

\texttt{JCer Catcher(JCC) v1.12}

版本更新 \tt v1.12

代码:

//2022tysc0819
#include<bits/stdc++.h>
#include<windows.h>     
#include<conio.h>       
#include<shellapi.h>   
#include<tchar.h>      
#define cls system("cls")
#define KEY_DOWN(VK_NONAME)((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
using namespace std;
const string VER="1.12";
int n,sys[6],dd,pdd,pr,atm,bct,cct;
bool ck1,isAdministor;
pair<int,int>pm,m;
vector<pair<string,int> >ot,cot;
string prt,cut1,cut2;
string filename="记录文件.txt";
ofstream file(filename);
MSG msg;
// 0 黑色 1 深蓝 2 深绿 3 天蓝 4 红色 5 深紫 6 土黄 7 白色
// 8 灰色 9 蓝色 a 草绿 b 青色 c 浅红 d 紫色 e 亮黄 f 亮白
void out(string s,int id=7,int tim=0){ 
    HANDLE handle=::GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO info;
    GetConsoleScreenBufferInfo(handle,&info);
    WORD colorBak=info.wAttributes;
    SetConsoleTextAttribute(handle,id);
    for(int i=0;i<(int)s.size();i++){cout<<s[i];Sleep(tim);}
    SetConsoleTextAttribute(handle,colorBak);
    return;
}
void tout(string s,int id=7,int tim=0){
    int i=0;cut1=cut2="";
    for(;i<(int)s.size();i++){if(s[i]==' '){break;}cut1+=s[i];}
    for(;i<(int)s.size();i++){cut2+=s[i];}
    out(cut1);out(cut2,id,tim);
}
void HideCursor(){
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void setp(int x,int y){
    HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord={short(y*2),short(x)};
    SetConsoleCursorPosition(handle,coord);
}
int lh=151,lw=160,test=1;
void setsz(int h,int w){
    POINT point;
    HWND target,parent;
    GetCursorPos(&point);
    target=WindowFromPoint(point);
    if(target!=NULL&&target!=INVALID_HANDLE_VALUE) {
        parent=GetParent(target);
        while(parent!=NULL&&parent!=INVALID_HANDLE_VALUE){
            target=parent;
            parent=GetParent(target);
        }
        RECT rect;
        GetWindowRect(target,&rect);
        MoveWindow(target,rect.left,rect.top,w,h,true);
    }
}
string getTime(){
    time_t now=time(NULL);
    tm *tm_t=localtime(&now);
    sys[0]=tm_t->tm_year+1900;
    sys[1]=tm_t->tm_mon+1;
    sys[2]=tm_t->tm_mday;
    sys[3]=tm_t->tm_hour;
    sys[4]=tm_t->tm_min;
    sys[5]=tm_t->tm_sec;
    return to_string(sys[0])+"."+to_string(sys[1])+"."+to_string(sys[2])+" "+to_string(sys[3])+":"+to_string(sys[4])+":"+to_string(sys[5]);
}
pair<int,int>getPoint(){
    POINT mpoint;
    GetCursorPos(&mpoint);
    return make_pair(mpoint.x,mpoint.y);
}
void neverStop(int sig_num){
    signal(SIGINT,neverStop);
    file<<"["<<getTime()<<"] 收到 "<<sig_num<<" 关闭信号.\n"; 
    ot.push_back(make_pair("[关闭单元] 监测到试图关闭.     ",12));
}
void neverClose(){
    HWND hwnd=GetConsoleWindow();
    HMENU hmenu=GetSystemMenu(hwnd,false);
    RemoveMenu(hmenu,SC_CLOSE,MF_BYCOMMAND);
    LONG style=GetWindowLong(hwnd,GWL_STYLE);
    style&=~(WS_MINIMIZEBOX);
    SetWindowLong(hwnd,GWL_STYLE,style);
    SetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
    ShowWindow(hwnd,SW_SHOWNORMAL);
    DestroyMenu(hmenu);
    ReleaseDC(hwnd,NULL);
} 
void noChoose(){
    SystemParametersInfo(SPI_SETSELECTIONFADE,TRUE,NULL,0);
}
bool _disableLeftButton=1;
bool _disableRightButton=1;
bool _disableMiddleButton=1;
bool _disableXButton1=0;
bool _disableXButton2=0;
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam){
    if(nCode==HC_ACTION){
        if(_disableLeftButton&&(wParam==WM_LBUTTONDOWN||wParam==WM_LBUTTONUP)){
            ot.push_back(make_pair("[监控单元] 监测到按下左键.     ",14));++dd;
            ot.push_back(make_pair("[钩子单元] 成功拦截左键.       ",11));++dd;
            file<<"["<<getTime()<<"] 拦截左键.\n"; 
            return 1;
        }
        if (_disableRightButton&&(wParam == WM_RBUTTONDOWN||wParam==WM_RBUTTONUP)){
            ot.push_back(make_pair("[监控单元] 监测到按下右键.     ",14));++dd;
            ot.push_back(make_pair("[钩子单元] 成功拦截右键.       ",11));++dd;
            file<<"["<<getTime()<<"] 拦截右键.\n"; 
            return 1;
        }
        if (_disableMiddleButton&&(wParam==WM_MBUTTONDOWN||wParam == WM_MBUTTONUP)){
            ot.push_back(make_pair("[监控单元] 监测到按下中键.     ",14));++dd;
            ot.push_back(make_pair("[钩子单元] 成功拦截中键.       ",11));++dd;
            file<<"["<<getTime()<<"] 拦截中键.\n";
            return 1;
        }
    }
    return CallNextHookEx(NULL,nCode,wParam,lParam);
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam){ // 钩子主函数
    if(nCode>=0){
        if(wParam==260){
            ot.push_back(make_pair("[监控单元] 监测到按下 Alt.     ",12));++dd;
            ot.push_back(make_pair("[钩子单元] 成功拦截 Alt.       ",14));++dd;
            file<<"["<<getTime()<<"] 拦截 Alt.\n";     
            return 1;       
        }
        if(wParam==WM_KEYDOWN){
            KBDLLHOOKSTRUCT* kbdData=reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
            int keyCode=kbdData->vkCode;
            if(keyCode==46){ // 屏蔽 Del 
                bct=0;
                cct++;
                ot.push_back(make_pair("[监控单元] 监测到按下 Del.     ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 Del.       ",11));++dd;
                file<<"["<<getTime()<<"] 拦截 Del.\n"; 
                return 1;
            }
            if(keyCode==162){ // 屏蔽 Ctrl 
                bct=0;
                cct++;
                ot.push_back(make_pair("[监控单元] 监测到按下 Ctrl.    ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 Ctrl.      ",11));++dd;
                file<<"["<<getTime()<<"] 拦截 Ctrl.\n"; 
                return 1;
            }
            if(keyCode==91){ // 屏蔽 Win
                bct=0;
                ot.push_back(make_pair("[监控单元] 监测到按下 Win.     ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 Win.       ",11));++dd;
                file<<"["<<getTime()<<"] 拦截 Win.\n"; 
                return 1;
            }
            if(keyCode==161||keyCode==160){ // 屏蔽 Shift 
                bct=0;
                ot.push_back(make_pair("[监控单元] 监测到按下 Shift.   ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 Shift.     ",11));++dd;
                file<<"["<<getTime()<<"] 拦截 Shift.\n"; 
                return 1;               
            } 
            if(keyCode==27){ // 屏蔽 Esc 
                bct++;
                ot.push_back(make_pair("[监控单元] 监测到按下 Esc.     ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 Esc.       ",11));++dd;
                file<<"["<<getTime()<<"] 拦截 Esc.\n"; 
                return 1;               
            } 
            if(nCode==HSHELL_ENDTASK){ // 屏蔽红叉 
                ot.push_back(make_pair("[监控单元] 监测到按下关闭.     ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截关闭.       ",11));++dd;       
                return 1;       
            }   
            KBDLLHOOKSTRUCT* pKeyBoard=(KBDLLHOOKSTRUCT*)lParam;
            if(pKeyBoard->vkCode== VK_DELETE&&GetAsyncKeyState(VK_CONTROL)&0x8000&&GetAsyncKeyState(VK_MENU)&0x8000){ // 屏蔽 Ctrl+Alt+Delete 
                ot.push_back(make_pair("[监控单元] 监测到按下 CAD.     ",14));++dd;
                ot.push_back(make_pair("[钩子单元] 成功拦截 CAD.       ",11));++dd;
                return 1;
            }
        }
    }
    return CallNextHookEx(NULL,nCode,wParam,lParam);
}
BOOL IsRunAsAdministrator(){
    BOOL fIsRunAsAdmin=FALSE;
    DWORD dwError=ERROR_SUCCESS;
    PSID pAdministratorsGroup=NULL;
    SID_IDENTIFIER_AUTHORITY NtAuthority=SECURITY_NT_AUTHORITY;
    if(!AllocateAndInitializeSid(
        &NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0,0,0,0,0,0,
        &pAdministratorsGroup)){
        dwError = GetLastError();
        goto Cleanup;
    }
    if(!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin)){
        dwError=GetLastError();
        goto Cleanup;
    }
Cleanup:
    if(pAdministratorsGroup){
        FreeSid(pAdministratorsGroup);
        pAdministratorsGroup=NULL;
    }
    if (ERROR_SUCCESS!=dwError){throw dwError;}
    return fIsRunAsAdmin;
}
bool RestartAsAdmin(){
    TCHAR szPath[MAX_PATH];
    if (!GetModuleFileName(NULL,szPath,MAX_PATH))
        return false; 
    SHELLEXECUTEINFO sei={sizeof(sei)};
    sei.lpVerb=_T("runas"); 
    sei.lpFile=szPath;    
    sei.nShow=SW_NORMAL; 
    return ShellExecuteEx(&sei);
}
string st,tit;
signed main(){
    tit="title JC 记录仪 v"+VER;
    system(tit.c_str()); 
    // setsz(500,500);
    HideCursor();
    neverClose();
    noChoose();
    HHOOK hook=SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardProc,NULL,0);
    HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
    signal(SIGINT,neverStop);
    file<<"\n--------------新运行-------------\n";
    file<<"["<<getTime()<<"] 程序运行 "<<VER<<" 版本.\n"; 
    out("--------------------------------------\n",6);
    out("|",6);out("[显示单元] ");out("电脑已经设置自动监控模式.",10);out("|\n",6);
    out("|",6);out("[显示单元] ");out("请勿在机主离开时使用电脑.",12);out("|\n",6);
    for(int i=1;i<=10;i++){ot.push_back(make_pair("[监控单元] 监控单元已就位.     ",10));++dd;}
    if(hook==NULL){ot.push_back(make_pair("[钩子单元] 无法注册钩子.       ",12));++dd;}
    else{ot.push_back(make_pair("[钩子单元] 钩子单元已就位.     ",10));++dd;}
    while(1){
        m=getPoint();
        signal(SIGINT,neverStop);
        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        if(m!=pm){
            file<<"["<<getTime()<<"] 鼠标从 ("<<pm.first<<","<<pm.second<<") 位置移到 ("<<m.first<<","<<m.second<<") 位置.\n"; 
            if(pm.first==0&&pm.second==0){ot.push_back(make_pair("[监控单元] 鼠标侦测初始化.     ",11));}
            else{if(ot[int(ot.size()-1)].first!="[监控单元] 监测到鼠标移动.     ")ot.push_back(make_pair("[监控单元] 监测到鼠标移动.     ",11));}
            ++dd;
        }
        for(int i=0;i<256;i++){
            if(KEY_DOWN(i)){
                if(i==0x01){
                    file<<"["<<getTime()<<"] 鼠标在 ("<<m.first<<","<<m.second<<") 位置点击.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到鼠标点击.     ")ot.push_back(make_pair("[监控单元] 监测到鼠标点击.     ",14));++dd;
                }else if(i==0x02){
                    file<<"["<<getTime()<<"] 鼠标在 ("<<m.first<<","<<m.second<<") 位置按下右键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到鼠标右击.     ")ot.push_back(make_pair("[监控单元] 监测到鼠标右击.     ",14));++dd;
                }else if(i==0x08){
                    file<<"["<<getTime()<<"] 监测到按下 BackSpace 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下退格.     ")ot.push_back(make_pair("[监控单元] 监测到按下退格.     ",14));++dd;
                }else if(i==0x0d){
                    file<<"["<<getTime()<<"] 监测到按下 Enter 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下回车.     ")ot.push_back(make_pair("[监控单元] 监测到按下回车.     ",14));++dd;
                }else if(i==0x1b){
                    file<<"["<<getTime()<<"] 监测到按下 Esc 键.\n";
                    bct++;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下 Esc.     ")ot.push_back(make_pair("[监控单元] 监测到按下 Esc.     ",14));++dd;
                }else if(i==0x20){
                    file<<"["<<getTime()<<"] 监测到按下空格键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下空格.     ")ot.push_back(make_pair("[监控单元] 监测到按下空格.     ",11));++dd;
                }else if(i==0x12){
                    file<<"["<<getTime()<<"] 监测到按下 Alt 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下 Alt.     ")ot.push_back(make_pair("[监控单元] 监测到按下 Alt.     ",11));++dd;
                }else if(i>=int('0')&&i<=int('9')){
                    file<<"["<<getTime()<<"] 监测到按下 "<<char(i)<<" 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到输入.         "&&ot[int(ot.size()-1)].second!=11)ot.push_back(make_pair("[监控单元] 监测到输入.         ",11));++dd;
                }else if(i>=int('A')&&i<=int('Z')){
                    file<<"["<<getTime()<<"] 监测到按下 "<<char(i)<<" 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到输入.         "&&ot[int(ot.size()-1)].second!=14)ot.push_back(make_pair("[监控单元] 监测到输入.         ",14));++dd;
                }else if(i==0x11){
                    file<<"["<<getTime()<<"] 监测到按下 Ctrl 键.\n";
                    bct=0;
                    ot.push_back(make_pair("[监控单元] 监测到按下 Ctrl.    ",14));++dd;
                }else if(i>=0x70&&i<=0x7b){
                    file<<"["<<getTime()<<"] 监测到按下 F"<<(i-0x70+1)<<" 键.\n";
cct=22222,ck1=1; 
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下 F 功能键.")ot.push_back(make_pair("[监控单元] 监测到按下 F 功能键.",14));++dd;
                }else if(i>=0x60&&i<=0x69){
                    file<<"["<<getTime()<<"] 监测到按下 "<<(i-0x60)<<" 键.\n";
                    bct=0;
                    if(ot[int(ot.size()-1)].first!="[监控单元] 监测到按下小键盘.   ")ot.push_back(make_pair("[监控单元] 监测到按下小键盘.   ",11));++dd;
                }else if(i==0xa0||i==0xa1){
                    file<<"["<<getTime()<<"] 监测到按下 Shift 键.\n";
                    bct=0;
                    ot.push_back(make_pair("[监控单元] 监测到按下 Shift.   ",14));++dd;
                }else if(i==91||i==92){
                    file<<"["<<getTime()<<"] 监测到按下 Win 键.\n";
                    bct=0;
                    ot.push_back(make_pair("[监控单元] 监测到按下 Win.     ",14));++dd;
                }
            }
        } 
        if(bct>25)ck1=1;
        if(ck1&&cct>25){
            file<<"["<<getTime()<<"] 验证成功.\n";
            ot.push_back(make_pair("[验证单元] 验证成功.           ",10));++dd;
        }
        if(dd!=pdd){
            /*if(pdd==0)atm=2;
            else*/ atm=0;
            for(int i=max(0,int(ot.size())-1-9),j=0;i<(int)ot.size();i++,j++){
                setp(j+3,0);
                out("|",6);tout(ot[i].first,ot[i].second,atm);out("     |\n",6);
                setp(j+3,0);
            }
            int res=0;
            res=system("taskkill /im Taskmgr.exe /f >nul 2>&1");
            if(res==128){
                setp(13,0);out("|",6);out("[关闭单元] ");out("未打开任务管理器.   ",10,atm);out("     |\n",6);
            }else if(res==1){
                setp(13,0);out("|",6);out("[关闭单元] ");out("关闭任务管理器失败. ",12,atm);out("     |\n",6);
                res=system("taskkill /im Taskmgr.exe /f >nul 2>&1");
                if(res==1){
                    MessageBox(NULL,"请使用管理员模式打开本程序.","警告",MB_OK|MB_ICONHAND);
                    if(RestartAsAdmin()){
                        MessageBox(NULL,"打开管理员模式成功!","结果",MB_OK|MB_ICONASTERISK);
                        res=system("taskkill /im Taskmgr.exe /f >nul 2>&1");
                        if(res==1){
                            MessageBox(NULL,"仍无法关闭,请重新用管理员模式打开!","警告",MB_OK|MB_ICONHAND);
                            system("cls");
                            system("color 07");
                            exit(0);
                        }else
                            isAdministor=1;
                    }else{
                        MessageBox(NULL,"打开管理员模式失败!","结果",MB_OK|MB_ICONHAND);
                    }
                }
            }else{
                setp(13,0);out("|",6);out("[关闭单元] ");out("关闭任务管理器成功. ",14,atm);out("     |\n",6);
            } 
            if(!file.is_open()){
                setp(14,0);out("|",6);out("[文件单元] ");out("文件无法打开.       ",12,atm);out("     |\n",6);
            }else{
                setp(14,0);out("|",6);out("[文件单元] ");out("文件正常.           ",10,atm);out("     |\n",6);
            }
            if(!isAdministor&&!IsRunAsAdministrator()){
                MessageBox(NULL,"请使用管理员模式打开本程序.","警告",MB_OK|MB_ICONHAND);
                if(RestartAsAdmin()){
                    MessageBox(NULL,"打开管理员模式成功!","结果",MB_OK|MB_ICONASTERISK);
                    isAdministor=1;
                    system("cls");
                    system("color 07");
                    exit(0);
                }else{
                    MessageBox(NULL,"打开管理员模式失败!","结果",MB_OK|MB_ICONHAND);
                }
            }
            // setsz(500,500);
            setp(16,0);out("--------------------------------------\n",6);
        }
        if(ck1&&cct>25)break;
        if(ot.size()>1000){ // 防止内存爆炸 
            for(int i=max(0,int(ot.size())-1-10),j=0;i<(int)ot.size();i++,j++){cot.push_back(ot[i]);}   
            ot.clear(); 
            for(auto v:cot)ot.push_back(v);
            ot.push_back(make_pair("[文件单元] 内存清空已完成.     ",10));
        }
        setp(15,0);out("|",6);
        st=getTime(); 
        out("[时间单元] ");out(st,3);for(int i=1;i<=25-int(st.size());i++)cout<<" ";
        out("|\n",6);
        pm=m;pdd=dd;
    }
    UnhookWindowsHookEx(hook); // 卸载钩子 
    UnhookWindowsHookEx(mouseHook); // 卸载钩子 
    return 0;
}