Anda di halaman 1dari 6

Teknik Malware Menggunakan TLS Callback

Entry point suatu program merupakan lokasi yang berisi instruksi kode yang akan dieksekusi pertama kali
oleh sistem. Entry point dapat dianalogikan sebagai void main pada kode bahasa pemrograman.

Rutin yang sering dilakukan virus yaitu dengan memanipulasi entry point. Virus menginfeksi suatu
program dengan menaruh kode virus di awal atau akhir pada program yang akan diinfeksi (host).
Langkah selanjutnya virus mengubah entry point untuk menjalankan kode virus terlebih dahulu dan
setelah itu host pun dipangggil.

Teknik lain yang digunakan virus dalam menginfeksi program yaitu dengan memakai teknik Entry Point
Obscuring (EPO). Virus yang mempunyai kemampuan EPO akan lebih susah dideteksi oleh Antivirus
karena virus tidak akan memodifikasi entry point melainkan dengan melakukan patching atau mengubah
data pada rutin yang memanggil suatu fungsi tertentu. Dengan melakukan patching ini, ketika fungsi
yang diubah sedang dipanggil, kode virus pun dapat terpanggil juga.

Pada tahun 2002, virus Chton merupakan virus pertama yang menggunakan teknik Thread Local Storage
(TLS) Callback. Dengan teknik ini, kode virus akan aktif terlebih dahulu sebelum entry point dieksekusi
oleh sistem.

Dengan adanya TLS Callback ini, tentunya dapat membuat penganalisa virus mengalami kebingungan
karena virus akan aktif terlebih dahulu sebelum dianalisa. Sebagai contoh , jika Anda membuka program
yang mempunya TLS Callback menggunakan OllyDbg, saat proses inisialisasi program, virus akan aktif.
Hal ini akan berlaku jika Anda menggunakan OllyDbg versi 2.0 ke bawah. Untuk versi terbaru pun Anda
harus mengkonfigurasi lagi untuk menghindari dampak dari TLS Callback, yaitu melalui menu Options |
Debugging options | Events. Pilih System breakpoint.

Gambar 1. Kode yang tereksekusi akibat TLS Callback pada OllyDbg

Pada IDA Pro, antisipasi terhadap TLS Callback sudah terdapat pada versi 4.2 yaitu yang diedarkan pada
tahun 2001. Untuk versi lama dari IDA Pro, Anda akan menjalankan kode sebelum entry point saat mulai
men-debug. Skenarionya yaitu buka program menggunakan IDA Pro, lalu tekan F2. IDA Pro akan otomatis
membuat breakpoint pada entry point. Lalu jalankan program dengan harapan kode akan break di entry
point. Tapi apa yang terjadi? TLS Callback pun beraksi. Untuk mencegah hal ini, tekan Ctrl-E, Anda akan
melihat fungsi dengan nama TLSCallback_0.

Gambar 2. Kode yang tereksekusi akibat TLS Callback pada IDA Pro

Gambar 3. Pilihan entry point pada IDA Pro

Thread Local Storage Callback

Ketika thread pada program menggunakan local variables yang berupa stack, maka setiap thread akan
mempunyai akses tersendiri terhadap variables tersebut. Hal ini untuk mencegah pemakaian variables
secara bersamaan oleh thread lain agar tidak menimbulkan crash pada program. Local data merupakan
global variables yang memiliki setiap thread tersendiri. Suatu thread dapat menaruh local data berupa
pointer pada TLS array. TLS Array merupakan array yang bernilai 4 bytes DWORD. Pengaturan data pada
TLS Array dapat dilakukan dengan menggunakan fungsi API TLSAlloc dan TLSFree.

Cara lain yang digunakan bahasa pemrograman agar mendukung TLS adalah dengan mendeklarasi kata
tambahan pada global variables.

Deklarasi pada bahasa Object Pascal yaitu :

var
mydata_process: integer;
threadvar
mydata_threadlocal: integer;

Pada bahasa C :

__declspec(thread) int number;

Format yang lain :

int __thread number;

Global variables yang dideklarasikan tersebut akan secara otomatis dikumpulkan oleh compiler atau
linker menjadi suatu TLS Array yang terletak pada .tls section.

TLS terdapat pada IMAGE_TLS_DIRECTORY yang merupakan bagian dari PE header. Berikut struktur dari
IMAGE_TLS_DIRECTORY :

typedef struct _IMAGE_TLS_DIRECTORY {

UINT32 StartAddressOfRawData;

UINT32 EndAddressOfRawData;

PUINT32 AddressOfIndex;

PIMAGE_TLS_CALLBACK *AddressOfCallBacks;

UINT32 SizeOfZeroFill;

UINT32 Characteristics;

} IMAGE_TLS_DIRECTORY, *PIMAGE_TLS_DIRECTORY;

- StartAddressOfRawData

Setiap thread baru dibuat, sistem akan mengalokasi local data baru berupa buffer untuk thread.
Buffer ini terdapat pada alamat parameter ini. Alamat ini bukan berupa Relative Virtual Address
(RVA) tetapi Virtual Address yang mempunyai relocation entry pada .reloc section .

- EndAddressOfRawData
Parameter ini merupakan Virtual Address dari alamat akhir dari buffer.

- AddressOfIndex

Ketika program dijalankan, sistem atau loader akan mengalokasikan TLS menggunakan TLSAlloc ke
alamat AddressOfIndex . Program akan mengakses TLS variables melalui alamat ini.

- AddressOfCallback

Merupakan alamat fungsi dari TLS yang berisi pointer. Setiap fungsi yang terdapat pada array ini akan
dipanggil setial thread baru dibuat.

- SizeOfZeroFill

Ukuran dalam bytes dari StartAddressOfRawData hingga EndAddressOfRawData.

- Characteristics

Umumnya bernilai 0

Untuk melihat struktur dari IMAGE_TLS_DIRECTORY, Anda dapat menggunakan program StudPE yang
dapat di download di http://bit.ly/aQLtXu .

Buka program yang terdapat TLS Callback, pada bagian kanan yaitu Data Directory, pilih
Image_Dir_Entry_TLS, di bawah pilihan tersebut terdapat tombol “++”, pilih tombol tersebut. Pada
gambar 5, Anda bisa melihat informasi pada IMAGE_TLS_DIRECTORY / TLS table.

Gambar 4. Tampilan StudPE

Gambar 5. Informasi pada TLS table

Demo Program

Berikut kode program menggunakan editor Dev-Cpp :

#include <windows.h>

int MyFunction();
int tlsdone = 0;

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ExitProcess(0);
return 0;
}

int MyFunction ()
{
if(tlsdone == 0)
{
MessageBox( NULL,
"hello",
"hello",
MB_OK | MB_ICONINFORMATION
);
tlsdone = 1;
}
return 0;
}

Jika dilihat, maka fungsi MyFunction tidak dipanggil oleh fungsi main pada program sehingga kode berisi
pesan tidak akan pernah ditampilkan. Tugas selanjutnya yaitu bagaimana menjalankan fungsi
MyFunction dengan cara memanggilnya melalui teknik TLS Callback.

Untuk apa variable tlsdone? Suatu program yang memakai TLS Callback, fungsi pada TLS akan dipanggil
dua kali. Oleh karena itu, tlsdone digunakan untuk mencegak kode tereksekusi untuk kedua kalinya.

Selanjutnya, buka hasil compile dari kode di atas (misalnya dengan nama Project1.exe) menggunakan
OllyDbg. Cari string “hello”. Untuk mencari string, klik kanan pada jendela utama, pilih Search For | All
referenced text strings. Muncul jendela baru yang berisi string pada program. Klik dua kali pada tulisan
berikut :

004012C1 |. C74424 04 003>MOV DWORD PTR SS:[ESP+4],Project1.00403000 ; |ASCII "hello"

Anda akan dibawa ke jendela berisi alamat asli dari string tersebut. Silahkan lihat pada gambar 6.

Gambar 6. String “hello” pada OllyDbg

Lokasi asli dari string yaitu di 00403000. Pada jendel a dump, tekan Ctrl-G dan masukan alamat
00403000. Silahkan lihat pada gambar 7. Geser ke bawah untuk mendapatkan space yang kosong,
sebagai contoh alamat yang diambil yaitu 004030D3. Alamat 004030D3 merupakan Relative Virtual
Address pada IMAGE_DIR_Entry_TLS. Tambahkan 004030D3 dengan 9 DWORD sehingga menghasilkan
004030F7 atau dalam format little indian ialah F7304000.

Gambar 7. Tampilan pada jendela dump

Berdasarkan gambar 6, alamat dimulainya fungsi yang ingin dieksekusi yaitu pada 004012A2.

Berikut baris fungsi dimulai :

004012A2 /. 55 PUSH EBP

Alamat 004012A2 jika diubah menjadi format little indian, yaitu A2124000. Setiap parameter
memerlukan empat bytes untuk nilai yang akan diisi. Parameter pertama akan dimulai dari alamat yang
telah dipilih di atas yaitu 004030D3.

Berikut alamat-alamat untuk setiap parameter :

StartAddressOfRawData : 004030D3

EndAddressOfRawData : 004030D7

AddressOfIndex : 004030EB
AddressOfCallback : 004030DF

SizeOfZeroFill : 004030E3

Characteristics : 004030E7

Selanjutnya masukan terlebih dahulu nilai-nilai dari parameter yang telah diketahui. Blok empat bytes
dari 004030F7 hingga 004030FA, tekan tombol spasi dan masukan nilai A2124000. Setelah itu, dimulai
dari 004030DF, masukan nilai F7304000 dimana nilai ini adalah alamat dari AddressOfCallback.

Gambar 8. Memasukan nilai A2124000

Gambar 9. Memasukan nilai F7304000

Sampai saat ini, diperlukan tiga parameter lagi yang membutuhkan nilai agar TLS table terisi. Untuk
StartAddressOfRawData, pada alamat 004030D3, isi dengan E3304000 (004030E3) yaitu menunjuk bytes
kosong tempat parameter SizeOfZeroFill . Untuk EndAddressOfRawData, isi dengan E7304000
(004030E7) yaitu menunjuk ke Characteristics. Sedangkan untuk AddressOfCallback, isikan dengan
E8304000 (004030EB) yaitu menun juk ke alamat dari fungsi yang akan diekseksi . Untuk lebih jelas,
silahkan lihat gambar 10.

Gambar 10. Tampilan akhir hasil modifikasi di OllyDbg

Untuk menyimpan program, blok semua bytes yang telah dimodifikasi, klik kanan pada pilihan tersebut,
pilih Copy to executable file. Pada jendela baru, klik kanan lagi dan pilih save file. Anggap saja Anda
menyimpan file tersebut dengan nama Project1_.exe

Sekarang TLS table telah selesai, tapi fungsi MyFunction tidak akan dipanggil karena belum adanya
perintah untuk memanggil TLS Table. Untuk itu Anda harus mengubah nilai pada Directory Data. Anda
bisa menggunakan StudPE. Buka Project1_.exe dengan StudPE, pilih Data Dir agar berisi
IMAGE_DIR_ENTRY_TLS. Masukan nilai 000030D3 (image base - 000030D3)di kolom RVA dan masukan
nilai 30000000 di kolom Size. Setelah itu pilih tombol “SAVE to file”.

Gambar 11. Memodifikasi data pada IMAGE_DIR_ENTRY_TLS

Jika Anda tutup StudPE dan menjalankannya lagi untuk membuka Project1_.exe, maka tombol “++” akan
aktif. Pilih tombol tersebut dan lihat gambar 12, bandingkan informasi yang terdapat pada TLS Table
dengan nilai yang Anda masukan melalui OllyDbg? Jika tidak sama berarti ada kesalahan dalam
memasukan alamat pada parameter.

Gambar 12. Informasi Project1_.exe pada TLS table


Jalankan file Project1_.exe. Tanpa bermain-main dengan entry point, program akan menampilkan kotak
pesan.

Dari apa yang telah dikerjakan, untuk membuat suatu program mempunyai TLS Callback cukup mudah
bukan? Yaitu tinggal membuat TLS table menggunakan OllyDbg dan mengupdate informasi
IMAGE_DIR_ENTRY_TLS pada Data Directory.

Apabila Anda membuat TLS Callback melalui kode program, maka compiler akan membuat section
dengan nama .tls secara otomatis. Jadi jika Anda melihat suatu program tanpa section bernama .tls atau
tidak ada section dengan nama tersebut, belum tentu program tersebut tidak memiliki TLS Callback.

Kesimpulan

TLS Callback sering digunakan malware untuk menyembunyikan teknik antidebugging agar terhindar dari
proses analisa. Begitu juga dengan malware, program packer pun menggunakan konsep yang sama untuk
melindungi program dari aktifitas ilegal.

Untuk membuat TLS Callback tidak mesti dilakukan secara hardcore atau manual. Dengan menggunakan
compiler C atau ASM dapat dengan mudah membuat TLS Callback.

Dengan mengetahui adanya TLS Callback ini, setiap melakukan kegiatan debugging haruslah
memperhatikan dari mana program debugger memulai operasi debugging. Hal ini untuk menghindari
Anda kecolongan saat menganalisa suatu malware!

Lebih Lanjut :

- http://msdn.microsoft.com/en-us/library/6yh4a9k1.aspx
- http://www.wasm.ru/article.php?article=tls
- http://cswilliams.ncat.edu/Endian.htm

Ilustrasi : “Entry point” tersembunyi pada malware. Waspadalah!

Gambar ilustrasi : ilustrasi.png

Anda mungkin juga menyukai