Anda di halaman 1dari 34

ANTI - DEBUGGING

Anti-debuggingadalah teknik anti-analisis populer


digunakan oleh malware untuk mengenali kapan itu di
bawah kendali debugger atau untuk menggagalkan
debugger. penulis malware tahu bahwa analis malware
menggunakan debugger untuk mencari tahu
bagaimana malware beroperasi, dan penulis menggunakan teknik anti-debugging
dalam upaya untuk memperlambat analis sebanyak mungkin. Setelah malware
menyadari bahwa itu berjalan di debugger, mungkin mengubah jalur eksekusi kode
normal atau memodifikasi kode untuk menyebabkan kecelakaan, sehingga
mengganggu upaya analis untuk memahami itu, dan menambahkan waktu dan
overhead tambahan untuk usaha mereka.
Ada banyak teknik-mungkin anti-debugging ratusan mereka- dan kita akan
membahas hanya yang paling populer yang kita jumpai di dunia nyata. Kami akan
menyajikan cara untuk memotong teknik anti-debugging, tetapi tujuan kami secara
keseluruhan dalam bab ini (selain memperkenalkan Anda untuk teknik-teknik
khusus) adalah untuk membantu Anda untuk mengembangkan keterampilan yang
Anda harus mengatasi metode anti-debugging baru dan sebelumnya tidak diketahui
selama analisis.
Jendela Debugger Deteksi
Malware menggunakan berbagai teknik untuk memindai indikasi bahwa debugger
terpasang, termasuk menggunakan Windows API, manual memeriksa struktur
memori untuk debugging artefak, dan mencari sistem residu yang ditinggalkan oleh
debugger.

Menggunakan Windows API


Penggunaan Windows fungsi API adalah yang paling jelas dari teknik anti-
debugging. Windows API menyediakan beberapa fungsi yang dapat digunakan oleh
sebuah program untuk menentukan apakah itu sedang debugged. Beberapa fungsi
ini dirancang untuk deteksi debugger; lain dirancang untuk tujuan yang berbeda
tetapi dapat repurposed untuk mendeteksi debugger. Beberapa fungsi ini
menggunakan fungsi tidak didokumentasikan dalam API.
Biasanya, cara termudah untuk mengatasi panggilan ke fungsi API anti-
debugging adalah secara manual mengubah malware selama eksekusi untuk tidak
memanggil fungsi-fungsi ini atau untuk memodifikasi posting panggilan bendera
untuk memastikan bahwa jalur yang tepat diambil. Sebuah pilihan yang lebih sulit
akan menghubungkan fungsi-fungsi ini, seperti dengan rootkit.
Berikut fungsi Windows API dapat digunakan untuk anti-debugging:
IsDebuggerPresent
Fungsi API yang paling sederhana untuk mendeteksi debugger adalah
IsDebuggerPresent. Fungsi ini mencari Proses Blok Lingkungan (PEB) struktur
untuk lapanganIsDebugged, Yang akan kembali nol jika Anda tidak menjalankan
dalam konteks debugger atau nilai nol jika debugger terpasang. Kita akan
membahas struktur PEB secara lebih rinci pada bagian berikutnya.
CheckRemoteDebuggerPresent
Fungsi API ini hampir identik dengan IsDebuggerPresent. Nama menyesatkan
meskipun, karena tidak memeriksa debugger pada mesin remote, melainkan
untuk proses pada mesin lokal. Hal ini juga memeriksa struktur PEB
untukIsDebuggedbidang; Namun, hal itu dapat melakukannya untuk dirinya
sendiri atau proses lain pada mesin lokal. Fungsi ini membutuhkan proses
menangani sebagai parameter dan akan memeriksa apakah proses yang
memiliki debugger terpasang.CheckRemoteDebuggerPresent dapat digunakan
untuk memeriksa proses Anda sendiri dengan hanya melewati pegangan untuk
proses Anda.
NtQueryInformationProcess
Ini adalah fungsi API asli dalam Ntdll.dll yang mengambil informasi tentang
suatu proses. Parameter pertama fungsi ini adalah pegangan proses; yang kedua
digunakan untuk memberitahu fungsi jenis informasi proses yang akan diambil.
Misalnya, menggunakan nilaiProcessDebugPort (nilai 0x7) Untuk parameter ini
akan memberitahu Anda jika proses tersebut saat ini sedang debugged. Jika
proses ini tidak sedang debugged, nol akan dikembalikan; jika tidak, nomor
port akan dikembalikan.
OutputDebugString
Fungsi ini digunakan untuk mengirim string ke debugger untuk tampilan. Hal
ini dapat digunakan untuk mendeteksi keberadaan debugger. Misalnya, properti
16-1 penggunaanSetLastErroruntuk mengatur kode kesalahan saat ini untuk nilai
sewenang-wenang. JikaOutputDebugString disebut dan tidak ada debugger
terpasang, GetLastError seharusnya tidak lagi mengandung nilai sewenang-
wenang kami, karena kode kesalahan akan ditetapkan oleh
OutputDebugStringFungsi jika gagal. JikaOutputDebugString disebut dan ada
debugger terpasang, panggilan untuk OutputDebugString harus berhasil, dan nilai
di GetLastError tidak harus diubah.

DWORD errorValue = 12345;

Anti-Debugging 2
SetLastError (errorValue);

OutputDebugString ( "Test untuk Debugger");

jika (GetLastError () == errorValue)


{
ExitProcess ();
} lain
{
RunMaliciousPayload ();
}

Listing 16-1: OutputDebugString teknik anti-debugging

Manual Memeriksa Struktur


Menggunakan Windows API mungkin metode yang paling jelas untuk mendeteksi
keberadaan debugger, tapi secara manual memeriksa struktur adalah metode yang
paling umum digunakan oleh penulis malware. Ada banyak alasan mengapa penulis
malware yang kecewa menggunakan Windows API untuk anti-debugging.
Misalnya, panggilan API bisa terpancing oleh rootkit untuk kembali informasi
palsu. Oleh karena itu, penulis malware sering memilih untuk melakukan setara
fungsional panggilan API secara manual, daripada mengandalkan Windows API.
Dalam melakukan pemeriksaan manual, beberapa bendera dalam struktur PEB
memberikan informasi tentang keberadaan debugger. Di sini, kita akan melihat
beberapa bendera yang biasa digunakan untuk memeriksa debugger.

Memeriksa BeingDebugged Flag


Struktur Windows PEB dikelola oleh OS untuk setiap proses yang berjalan, seperti
yang ditunjukkan pada contoh di Listing 16-2. Ini berisi semua parameter user-
mode yang berhubungan dengan proses. Parameter ini meliputi data lingkungan
proses, yang itu sendiri meliputi variabel lingkungan, daftar modul dimuat, alamat
di memori, dan status debugger.

typedef struct _PEB {BYTE


Reserved1 [2];
BYTE BeingDebugged;
BYTE Reserved2 [1];
PVOID Reserved3 [2];
PPEB_LDR_DATA LDR;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
BYTE Reserved4 [104];
PVOID Reserved5 [52];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved6 [128];
PVOID Reserved7 [1];
ULONG sessionId;

Anti-Debugging 3
} PEB, * PPEB;

Listing 16-2: terdokumentasi Proses Blok Lingkungan struktur (PEB)

Sementara proses sedang berjalan, lokasi PEB dapat direferensikan oleh lokasi
fs: [30h]. Untuk anti-debugging, malware akan menggunakan lokasi itu untuk
memeriksaBeingDebuggedbendera, yang menunjukkan apakah proses tertentu sedang
debugged. Tabel 16-1 menunjukkan dua contoh dari jenis cek.

Tabel 16-1: Manual Memeriksa BeingDebugged Bendera

mov metode Dorong/pop metode

mov eax, dword ptr fs: [30 h] mendorong ptr dword fs: [30 h]
mov ebx, byte ptr [eax + 2] tes pop edx
ebx, ebx jz NoDebuggerDetected CMP byte ptr [edx + 2], 1 je
DebuggerDetected

Dalam kode di sebelah kiri pada Tabel 16-1, lokasi PEB dipindahkan ke EAX.
Berikutnya, ini diimbangi ditambah 2 dipindahkan ke EBX, yang sesuai dengan
offset ke dalam PEB dari lokasiBeingDebuggedbendera. Akhirnya, EBX diperiksa
untuk melihat apakah itu adalah nol. Jika demikian, debugger tidak terpasang, dan
melompat akan diambil.
Contoh lain ditampilkan di sisi kanan Tabel 16-1. Lokasi PEB dipindahkan ke
EDX menggunakan kombinasi dorong / pop instruksi, dan kemudian BeingDebugged
Bendera pada offset 2 secara langsung dibandingkan dengan 1.
Pemeriksaan ini dapat mengambil banyak bentuk, dan, akhirnya, lompatan
bersyarat menentukan kode jalan. Anda dapat mengambil salah satu pendekatan
berikut untuk mengatasi masalah ini:

 Memaksa melompat untuk diambil (atau tidak) secara manual memodifikasi


nol bendera segera sebelum instruksi jump dijalankan. Ini adalah pendekatan
yang paling mudah.
 Mengubah secara manual BeingDebugged bendera ke nol.

Kedua pilihan umumnya efektif terhadap semua teknik yang dijelaskan di


bagian ini.

CATATAN Sejumlah OllyDbg plug-in mengubah BeingDebuggedbendera untuk Anda.


Yang paling ketenarannyalar adalah Hide Debugger, Hidedebug, dan hantu.
Semua berguna untuk mengatasiBeingDebugged cek bendera dan juga membantu
dengan banyak teknik lain yang kita bahas dalam bab ini.
Memeriksa ProcessHeap Flag
Lokasi yang tak tercatat dalam Reserved4 array (ditunjukkan pada Listing 16-2), yang
dikenal sebagai ProcessHeap, Diatur ke lokasi tumpukan pertama proses dialokasikan
oleh loader. ProcessHeapterletak di 0x18 dalam struktur PEB. tumpukan pertama
berisi header dengan bidang yang digunakan untuk memberitahu kernel apakah
tumpukan diciptakan dalam debugger. Ini dikenal sebagaiForceFlags dan Flags

Anti-Debugging 4
bidang.
Offset 0x10 di header tumpukan adalah ForceFlagslapangan pada Windows XP,
tetapi untuk Windows 7, itu adalah pada offset 0x44 untuk aplikasi 32-bit. Malware
juga dapat melihat mengimbangi 0x0C pada Windows XP atau offset 0x40 pada
Windows 7 untukFlagsbidang. Bidang ini hampir selalu sama denganForceFlags
lapangan, tetapi biasanya ORed dengan nilai 2.
Listing 16-3 menunjukkan kode assembly untuk teknik ini. (Perhatikan bahwa
dua dereferences terpisah harus terjadi.)

mov eax, fs besar: 30h mov eax,


dword ptr [eax + 18h] ptr CMP
dword ds: [eax + 10h], 0 jne
DebuggerDetected

Listing 16-3: Pedoman ProcessHeap cek bendera

Cara terbaik untuk mengatasi teknik ini adalah untuk mengubah


ProcessHeapbendera secara manual atau menggunakan menyembunyikan debug
plug-in untuk debugger Anda. Jika Anda menggunakan WinDbg, Anda dapat
memulai program dengan tumpukan men-debug dinonaktifkan. Sebagai contoh,
perintahWinDbg -HD notepad.exe akan mulai tumpukan dalam mode normal sebagai
lawan mode debug, dan bendera yang telah kita bahas tidak akan ditetapkan.

memeriksa NTGlobalFlag
Sejak proses berjalan sedikit berbeda ketika memulai dengan debugger, mereka
menciptakan tumpukan memori berbeda. Informasi bahwa sistem ini menggunakan
untuk menentukan bagaimana membuat struktur tumpukan disimpan di lokasi yang
tak tercatat di PEB pada offset 0x68. Jika nilai di lokasi ini adalah 0x70, kita tahu
bahwa kita berjalan di debugger.
Nilai 0x70 adalah kombinasi dari bendera berikut ketika tumpukan dibuat oleh
debugger. Bendera ini ditetapkan untuk proses jika dimulai dari dalam debugger.

(FLG_HEAP_ENABLE_TAIL_CHECK | FLG_HEAP_ENABLE_FREE_CHECK |
FLG_HEAP_VALIDATE_PARAMETERS)

Listing 16-4 menunjukkan kode assembly untuk melakukan cek ini.

mov eax, fs besar: ptr 30h cmp dword


ds: [eax + 68H], 70h jz
DebuggerDetected

Listing 16-4: NTGlobalFlag memeriksa

Anti-Debugging 5
Cara termudah untuk mengatasi teknik ini adalah untuk mengubah bendera
secara manual atau dengan plug-in hide-debug untuk debugger Anda. Jika Anda
menggunakan WinDbg, Anda dapat memulai program dengan pilihan debug
tumpukan dinonaktifkan, seperti yang disebutkan pada bagian sebelumnya.

Memeriksa Sistem Residu


Ketika menganalisis malware, kita biasanya menggunakan alat debugging, yang
meninggalkan residu pada sistem. Malware dapat mencari residu ini dalam rangka
untuk menentukan kapan Anda sedang berusaha untuk menganalisanya, seperti
dengan mencari kunci registri untuk referensi untuk debugger. Berikut ini adalah
lokasi umum untuk debugger:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug

kunci registri ini menentukan debugger yang mengaktifkan ketika kesalahan


aplikasi terjadi. Secara default, ini disetel ke Dr Watson, sehingga jika diubah ke
sesuatu seperti OllyDbg, malware dapat menentukan bahwa itu adalah di bawah
mikroskop.
Malware juga dapat mencari sistem untuk file dan direktori, seperti executable
program yang debugger umum, yang biasanya hadir selama analisis malware.
(Banyak backdoors sudah memiliki kode di tempat untuk melintasi filesystem.)
Atau malware dapat mendeteksi residu dalam memori hidup, dengan melihat proses
saat daftar atau, lebih umum, dengan melakukanFindWindow mencari debugger,
seperti ditunjukkan pada Listing 16-5.

jika (FindWindow ( "OllyDbg", 0) == NULL)


{
// Debugger Tidak Ditemukan
} lain
{
// Debugger Terdeteksi
}

Listing 16-5: kode C untuk FindWindow deteksi

Dalam contoh ini, kode hanya terlihat untuk jendela bernama OllyDbg.

Mengidentifikasi Debugger Perilaku


Ingat bahwa debugger dapat digunakan untuk mengatur breakpoints atau single-
langkah melalui proses dalam rangka untuk membantu analis malware di reverse-
engineering. Namun, ketika operasi ini dilakukan di debugger, mereka
memodifikasi kode dalam proses. Beberapa teknik anti-debugging digunakan oleh

Anti-Debugging 6
malware untuk mendeteksi perilaku semacam ini debugger: INT scanning, cek
checksum, dan cek waktu.
INT Scanning
INT 3adalah perangkat lunak interrupt yang digunakan oleh debugger untuk
sementara menggantikan instruksi dalam program berjalan dan untuk memanggil
debug pengecualian handler- mekanisme dasar untuk mengatur breakpoint. Opcode
untukINT 3 aku s 0xCC. Setiap kali Anda menggunakan debugger untuk mengatur
breakpoint, memodifikasi kode dengan menyisipkan0xCC.
Selain tertentu INT 3 instruksi, sebuah INT segera dapat mengatur interupsi
apapun, termasuk 3 (segerabisa menjadi mendaftar, seperti EAX). ItuINT segera
instruksi menggunakan dua opcodes: 0xCD nilai. opcode 2-byte ini kurang umum
digunakan oleh debugger.
Salah satu teknik anti-debugging umum memiliki proses scan kode sendiri
untuk INT 3 modifikasi dengan mencari kode untuk 0xCC opcode, seperti ditunjukkan
pada Listing 16-6.

memanggil $ + 5 pop
edi sub edi, 5 mov ecx,
400h mov eax, 0CCh
repne SCASB jz
DebuggerDetected

Listing 16-6: Kode Scanning untuk breakpoints

Kode ini dimulai dengan panggilan, diikuti dengan pop yang menempatkan EIP
ke EDI.
EDI kemudian disesuaikan dengan awal kode. Kode ini kemudian dipindai
untuk0xCCbytes. Jika sebuah0xCCbyte ditemukan, ia tahu bahwa debugger hadir.
Teknik ini dapat diatasi dengan menggunakan hardware breakpoints bukan
breakpoints perangkat lunak.

Pertunjukan Kode Checksum


Malware dapat menghitung checksum pada bagian kode untuk mencapai tujuan
yang sama seperti scanning untuk menyela. Alih-alih scanning untuk0xCC, Cek ini
hanya melakukan cek redundansi siklik (CRC) atau checksum MD5 dari opcodes
di malware.
Teknik ini kurang umum daripada scanning, tapi itu sama efektif. Carilah
malware yang akan iterasi petunjuk internal diikuti dengan dibandingkan dengan
nilai yang diharapkan.
Teknik ini dapat diatasi dengan menggunakan hardware breakpoints atau secara
manual memodifikasi jalur eksekusi dengan debugger pada saat runtime.

Anti-Debugging 7
waktu Cek
Waktu pemeriksaan adalah salah satu cara yang paling populer untuk malware untuk
mendeteksi debugger karena proses berjalan lebih lambat ketika sedang debugged.
Sebagai contoh, single-loncatan melalui program substansial memperlambat
kecepatan eksekusi.
Ada beberapa cara untuk menggunakan cek waktu untuk mendeteksi debugger:

 Merekam catatan waktu, melakukan beberapa operasi, mengambil timestamp


lain, dan kemudian membandingkan dua cap waktu. Jika ada lag, Anda dapat
mengasumsikan kehadiran debugger.
 Ambil catatan waktu sebelum dan setelah menaikkan pengecualian. Jika suatu
proses tidak sedang debugged, pengecualian akan ditangani sangat cepat;
debugger akan menangani pengecualian jauh lebih lambat. Secara default,
kebanyakan debugger memerlukan campur tangan manusia untuk menangani
pengecualian, yang menyebabkan delay yang sangat besar. Sementara banyak
debugger memungkinkan Anda untuk mengabaikan pengecualian dan
meneruskannya ke program, masih akan ada penundaan yang cukup besar
dalam kasus tersebut.

Menggunakan Instruksi RDTSC


Metode yang paling umum cek waktu menggunakan RDTSC instruksi (opcode
0x0F31), Yang mengembalikan hitungan jumlah kutu sejak reboot sistem terakhir
sebagai nilai 64-bit ditempatkan ke dalam EDX: EAX. Malware hanya akan
mengeksekusi instruksi ini dua kali dan membandingkan perbedaan antara dua
bacaan. Listing 16-7 menunjukkan contoh malware nyata menggunakanRDTSC
teknik.

RDTSC xor ecx, ecx


menambahkan ecx, eax
RDTSC sub eax, ecx CMP
eax, 0xFFF jb
NoDebuggerDetected
RDTSC mendorong eax
ret

Listing 16-7: The RDTSC teknik timing

Pemeriksaan malware untuk melihat apakah perbedaan antara dua panggilan ke


RDTSC lebih besar dari 0xFFF di , Dan jika terlalu banyak waktu telah berlalu,
lompatan bersyarat tidak akan diambil. Jika melompat tidak diambil,RDTSC
dipanggil lagi, dan hasilnya didorong ke stack di , Yang akan menyebabkan
kembali untuk mengambil eksekusi ke lokasi acak.

Anti-Debugging 8
Menggunakan QueryPerformanceCounter dan GetTickCount
Dua fungsi Windows API yang digunakan seperti RDTSCuntuk melakukan
pemeriksaan Anti- Debugging waktu. Metode ini bergantung pada kenyataan bahwa
prosesor memiliki resolusi tinggi counter-register yang menyimpan jumlah kegiatan
yang dilakukan di prosesor kinerja.QueryPerformanceCounterbisa disebut untuk query
counter ini dua kali untuk mendapatkan perbedaan waktu untuk digunakan dalam
perbandingan. Jika terlalu banyak waktu telah berlalu antara dua panggilan, asumsi
adalah bahwa debugger sedang digunakan.
fungsi GetTickCountmengembalikan jumlah milidetik yang telah berlalu sejak
reboot sistem terakhir. (Karena ukuran dialokasikan untuk counter ini, itu berguling
setelah 49,7 hari.) ContohGetTickCount dalam praktek ditampilkan dalam Listing 16-
8.

a = GetTickCount ();
MaliciousActivityFunction (); b =
GetTickCount ();

delta = ba; if ((delta)>


0x1A)
{
// Debugger Terdeteksi
} lain
{
// Debugger Tidak Ditemukan
}

Listing 16-8: GetTickCount teknik timing

Semua serangan waktu yang telah kita bahas dapat ditemukan selama
debugging atau analisis statis dengan mengidentifikasi dua panggilan berturut-turut
untuk fungsi-fungsi ini diikuti oleh perbandingan. Pemeriksaan ini harus
menangkap debugger hanya jika Anda singlestepping atau pengaturan breakpoints
antara dua panggilan yang digunakan untuk menangkap waktu delta. Oleh karena
itu, cara termudah untuk menghindari deteksi oleh waktu adalah untuk menjalankan
melalui pemeriksaan ini dan mengatur breakpoint hanya setelah mereka, dan
kemudian memulai single-melangkah lagi. Jika itu bukan pilihan, hanya
memodifikasi hasil perbandingan untuk memaksa melompat yang Anda ingin
dibawa.

Mengganggu Debugger Fungsi


Malware dapat menggunakan beberapa teknik untuk mengganggu operasi debugger
yang normal: benang penyimpanan lokal (TLS) callback, pengecualian, dan
mengganggu penyisipan. Teknik ini mencoba untuk mengganggu pelaksanaan
program hanya jika itu adalah di bawah kendali debugger.

Anti-Debugging 9
Menggunakan TLS Callback
Anda mungkin berpikir bahwa ketika Anda memuat program ke debugger, itu akan
berhenti pada instruksi pertama program dijalankan, tapi ini tidak selalu terjadi.
Kebanyakan debugger mulai dari titik masuk program seperti yang didefinisikan
oleh header PE. Sebuah panggilan balik TLS dapat digunakan untuk mengeksekusi
kode sebelum titik masuk dan karena itu mengeksekusi diam-diam di debugger. Jika
Anda hanya bergantung pada penggunaan debugger, Anda bisa kehilangan fungsi
malware tertentu, sebagai callback TLS dapat berjalan secepat itu dimuat ke
debugger.
TLS adalah kelas penyimpanan Windows dalam mana objek data bukan
merupakan variabel tumpukan otomatis, namun adalah lokal untuk setiap thread
yang berjalan kode. Pada dasarnya, TLS memungkinkan setiap thread untuk
mempertahankan nilai yang berbeda untuk variabel dideklarasikan menggunakan
TLS. Ketika TLS diimplementasikan oleh executable, kode biasanya akan
berisi.tlsbagian di header PE, seperti yang ditunjukkan pada Gambar 16-1. TLS
mendukung fungsi callback untuk inisialisasi dan terminasi objek data TLS.
Windows menjalankan fungsi-fungsi ini sebelum menjalankan kode pada awal
normal program.

Gambar 16-1: TLS callback contoh-meja TLS di PEview

TLS callback dapat ditemukan dengan melihat .tlsBagian menggunakan


PEview. Anda harus segera mencurigai anti-debugging jika Anda melihat.tls
Bagian, seperti program yang normal biasanya tidak menggunakan bagian ini.
Analisis callback TLS dengan mudah dengan IDA Pro. Setelah IDA Pro selesai
analisisnya, Anda dapat melihat entry point untuk biner dengan menekan CTRL-E

Anti-Debugging 10
untuk menampilkan semua titik masuk ke program, termasuk callback TLS, seperti
yang ditunjukkan pada Gambar 16-2. Semua fungsi callback TLS telah label mereka
didahului denganTlsCallback. Anda dapat menelusuri ke fungsi callback di IDA Pro
dengan klik dua kali nama fungsi.

Gambar 16-2: Melihat fungsi callback TLS di IDA Pro


(tekan CTRL-E untuk menampilkan)

TLS callback dapat ditangani dalam debugger, meskipun kadang-kadang


debugger akan menjalankan callback TLS sebelum melanggar pada titik awal
masuk. Untuk menghindari masalah ini, mengubah pengaturan debugger ini.
Misalnya, jika Anda menggunakan OllyDbg, Anda dapat memilikinya jeda sebelum
panggilan balik TLS dengan memilih Pilihandebugging PilihanAcara dan
pengaturan Sistem breakpoint sebagai tempat untuk jeda pertama, seperti yang
ditunjukkan pada Gambar 16-3.

CATATAN OllyDbg 2.0 memiliki kemampuan lebih breaking dari versi 1.1; misalnya,
dapat berhenti pada awal callback TLS. Juga, WinDbg selalu istirahat di sistem
breakpoint sebelum callback TLS.

Gambar 16-3: OllyDbg pilihan jeda pertama

Karena TLS callback sangat terkenal, malware menggunakan mereka lebih


jarang daripada di masa lalu. Tidak banyak aplikasi yang sah menggunakan TLS
callback, sehingga.tls Bagian dalam eksekusi dapat menonjol.

Anti-Debugging 11
menggunakan pengecualian
Seperti dibahas sebelumnya, interupsi menghasilkan pengecualian yang digunakan
oleh debugger untuk melakukan operasi seperti breakpoints. Dalam Bab 15, Anda
belajar bagaimana untuk mendirikan sebuah SEH untuk mencapai lompatan yang
tidak konvensional. Modifikasi dari rantai SEH berlaku untuk kedua anti-
pembongkaran dan anti-debugging. Pada bagian ini, kita akan melewatkan spesifik
SEH (karena mereka dibahas dalam Bab 15) dan fokus pada cara-cara lain yang
pengecualian dapat digunakan untuk menghambat malware
analis.
Pengecualian dapat digunakan untuk mengganggu atau mendeteksi debugger.
Kebanyakan deteksi exceptionbased bergantung pada fakta bahwa debugger akan
menjebak pengecualian dan tidak segera menyebarkannya ke proses yang sedang
debugged untuk menangani. Pengaturan standar pada kebanyakan debugger adalah
untuk pengecualian perangkap dan tidak lulus mereka untuk program ini. Jika
debugger tidak lulus pengecualian untuk proses dengan benar, kegagalan yang
dapat dideteksi dalam mekanisme proses penanganan-pengecualian.
Gambar 16-4 menunjukkan pengaturan default OllyDbg ini; semua
pengecualian akan terjebak kecuali kotak dicentang. Pilihan ini diakses melalui
Optionsdebugging Pilihanpengecualian.

Gambar 16-4: Ollydbg terkecuali pilihan pengolahan

CATATAN Ketika melakukan analisis malware, kami sarankan pengaturan pilihan


debugging untuk lulus semua pengecualian untuk program ini.

memasukkan Interupsi
Bentuk klasik anti-debugging adalah dengan menggunakan pengecualian untuk
mengganggu analis dan mengganggu pelaksanaan program yang normal dengan
memasukkan interupsi di tengah-tengah urutan instruksi yang valid. Tergantung
pada pengaturan debugger, sisipan ini bisa menyebabkan debugger untuk berhenti,

Anti-Debugging 12
karena merupakan mekanisme yang sama debugger itu sendiri digunakan untuk
mengatur breakpoints perangkat lunak.

Memasukkan INT 3
Karena INT 3 digunakan oleh debugger untuk mengatur breakpoints perangkat lunak,
salah satu teknik Anti- Debugging terdiri dari memasukkan 0xCCopcodes menjadi
bagian yang sah dari kode untuk mengelabui debugger untuk berpikir bahwa
opcodes yang breakpoints nya. Beberapa debugger melacak di mana mereka
mengatur breakpoints software untuk menghindari jatuh untuk trik ini.
2-byte urutan opcode 0xCD03 juga dapat digunakan untuk menghasilkan INT 3,
Dan ini sering merupakan cara yang valid untuk malware mengganggu WinDbg. Di
luar debugger,0xCD03 menghasilkan STATUS_BREAKPOINTpengecualian. Namun, di
dalam WinDbg, menangkap breakpoint dan kemudian diam-diam kemajuan EIP
oleh tepat 1 byte, karena breakpoint adalah biasanya0xCCopcode. Hal ini dapat
menyebabkan program untuk mengeksekusi satu set instruksi yang berbeda ketika
sedang debugged oleh WinDbg dibandingkan berjalan normal. (OllyDbg tidak
rentan terhadap gangguan menggunakan ini 2-byteINT 3 menyerang.)
Listing 16-9 menunjukkan kode assembly yang mengimplementasikan teknik
ini. Contoh ini menetapkan panggilan SEH dan kemudian baruINT 3 untuk
memaksa kode untuk melanjutkan.

mendorong diimbangi
terus fs mendorong
dword: [0] mov fs: [0],
esp int 3
// yang debugged terus:
// tidak sedang debugged

Listing 16-9: INT 3 teknik

Memasukkan INT 2D
Itu INT 2D anti-debugging teknik fungsi seperti INT 3-itu INT 0x2Dinstruksi digunakan
untuk mengakses kernel debugger. KarenaINT 0x2D adalah cara yang debugger kernel
mengatur breakpoints, metode yang ditunjukkan pada Listing 16-10 berlaku.

memasukkan ICE
Salah satu petunjuk yang tak tercatat Intel adalah In-Circuit Emulator (ICE)
breakpoint, icebp (opcode 0xF1). Instruksi ini dirancang untuk membuatnya lebih
mudah untuk debug menggunakan ICE, karena sulit untuk mengatur breakpoint
sewenang-wenang dengan ICE.
Pelaksana instruksi ini menghasilkan satu langkah pengecualian. Jika program
ini sedang ditelusuri melalui single-loncatan, debugger akan berpikir itu adalah
pengecualian yang normal yang dihasilkan oleh satu langkah dan tidak
mengeksekusi ditetapkan sebelumnya pengecualian handler. Malware dapat

Anti-Debugging 13
mengambil keuntungan dari ini dengan menggunakan handler pengecualian untuk
aliran eksekusi normal, yang akan terganggu dalam kasus ini.
Dalam rangka untuk memotong teknik ini, tidak satu langkah lebih dari satu
icebp petunjuk.

debugger Kerentanan
Seperti semua software, debugger mengandung kerentanan, dan penulis kadang-
kadang malware menyerang mereka untuk mencegah debugging. Di sini, kami
menyajikan beberapa kerentanan populer di jalan OllyDbg menangani format PE.

PE header Kerentanan
Teknik pertama memodifikasi header Microsoft PE dari biner, menyebabkan
OllyDbg crash ketika loading executable. Hasilnya adalah kesalahan dari “Bad atau
diketahui 32-bit executable File,” namun program ini biasanya berjalan dengan baik
di luar debugger.
Masalah ini disebabkan oleh fakta bahwa OllyDbg mengikuti spesifikasi
Microsoft mengenai header PE terlalu ketat. Pada header PE, biasanya ada struktur
yang dikenal sebagaiIMAGE_OPTIONAL_HEADER. Gambar 16-5 menunjukkan subset
dari struktur ini.
Gambar 16-5: PE IMAGE_OPTIONAL_HEADER dan NumberOfRvaAndSizes kerentanan

Beberapa elemen terakhir dalam struktur ini adalah kepentingan tertentu. Itu
NumberOfRvaAndSizes lapangan menunjukkan jumlah entri dalam DataDirectoryarray
berikut. ItuDataDirectoryarray yang menunjukkan di mana untuk menemukan
komponen executable penting lainnya dalam file; itu adalah sedikit lebih dari sebuah
arrayIMAGE_DATA_DIRECTORYstruktur pada akhir struktur header opsional. Setiap
struktur direktori data menentukan ukuran dan alamat virtual relatif direktori.
Ukuran array diatur ke IMAGE_NUMBEROF_DIRECTORY_ENTRIES, Yang sama dengan
0x10. Windows loader mengabaikan setiapNumberOfRvaAndSizes lebih besar dari 0x10,
Karena apa pun yang lebih besar tidak muat di DataDirectoryArray. OllyDbg
mengikuti standar dan penggunaanNumberOfRvaAndSizes tidak peduli apa.
Sebagai akibatnya, pengaturan ukuran array untuk nilai lebih besar dari 0x10 (seperti
0x99) Akan menyebabkan OllyDbg untuk menghasilkan sebuah jendela pop-up
kepada pengguna sebelum keluar program.
Cara termudah untuk mengatasi teknik ini adalah untuk secara manual
memodifikasi header PE dan mengatur NumberOfRvaAndSizes untuk
0x10menggunakan hex editor atau PE Explorer. Atau, tentu saja, Anda dapat
menggunakan debugger yang tidak rentan terhadap teknik ini, seperti WinDbg atau
OllyDbg 2.0.
Trik lain sundulan PE melibatkan bagian header, menyebabkan OllyDbg crash
selama loading dengan kesalahan “File berisi terlalu banyak data.” (WinDbg dan
OllyDbg 2.0 tidak rentan terhadap teknik ini.) Bagian mengandung isi dari file,
termasuk kode, data , sumber daya, dan informasi lainnya.
Setiap bagian memiliki header dalam bentuk IMAGE_SECTION_HEADER struktur.

Anti-Debugging 14
Gambar 16-6 menunjukkan subset dari struktur ini.

Nama ".teks"
77777777h
Lokasi untuk hampir tidak valid!
memuat bagian ini
VirtualSize 00004C52h

VirtualAddress 00401000h
Lokasi dari data
SizeOfRawData
mentah dalam 77777777h
file PE
PointerToRawData 00000400h

PointerToRelocations 00000000h

...

Gambar 16-6: PE IMAGE_SECTION_HEADER struktur

Unsur-unsur bunga VirtualSize dan SizeOfRawData. Menurut spesifikasi Windows


PE,VirtualSize harus berisi ukuran total bagian ketika dimuat ke memori, dan
SizeOfRawDataharus berisi ukuran data pada disk. Windows loader menggunakan
lebih kecil dariVirtualSize dan SizeOfRawDatauntuk memetakan data bagian ke dalam
memori. JikaSizeOfRawData lebih besar dari VirtualSize, hanya VirtualSizeData disalin ke
dalam memori; sisanya diabaikan. Karena OllyDbg hanya
menggunakanSizeOfRawData, Pengaturan SizeofRawData untuk sesuatu yang besar
seperti 0x77777777, Akan menyebabkan OllyDbg untuk kecelakaan.
Cara termudah untuk mengatasi teknik anti-debugging ini adalah untuk secara
manual memodifikasi header PE dan mengatur SizeOfRawData menggunakan hex
editor untuk mengubah nilai menjadi dekat dengan VirtualSize. (Perhatikan bahwa,
sesuai dengan spesifikasi, nilai ini harus merupakan kelipatan dariFileAlignment Nilai
dari IMAGE_OPTIONAL_HEADER). PE Explorer adalah program besar untuk digunakan
untuk tujuan ini karena tidak tertipu oleh nilai besar untukSizeofRawData.

The OutputDebugString Kerentanan


Malware sering mencoba untuk mengeksploitasi kerentanan format string di versi
1.1 dari OllyDbg, dengan menyediakan serangkaian % s sebagai parameter untuk
OutputDebugStringmenyebabkan OllyDbg untuk kecelakaan. Waspadalah terhadap
panggilan yang mencurigakan sepertiOutputDebugString ( "% s% s% s% s% s% s% s% s% s%
s% s% s% s% s"). Jika panggilan ini mengeksekusi, debugger Anda akan

jatuh.

Kesimpulan
Bab ini memperkenalkan Anda untuk beberapa teknik anti-debugging populer.
Dibutuhkan kesabaran dan ketekunan untuk belajar mengenali dan teknik
memotong Anti- Debugging. Pastikan untuk mengambil catatan selama analisis dan
mengingat lokasi dari setiap teknik anti-debugging dan bagaimana Anda melewati

Anti-Debugging 15
mereka; hal tersebut akan membantu Anda jika Anda perlu untuk memulai kembali
proses debugging.
Kebanyakan teknik anti-debugging dapat melihat dengan menggunakan akal
sehat, saat debugging proses perlahan-lahan. Misalnya, jika Anda melihat kode
mengakhiri prematur pada lompatan bersyarat, yang mungkin mengisyaratkan
teknik anti-debugging. teknik anti-debugging paling populer melibatkan
mengaksesfs: [30h], Menyebut Windows API panggilan, atau melakukan cek waktu.
Tentu saja, karena dengan semua analisis malware, cara terbaik untuk belajar
untuk menggagalkan teknik anti-debugging adalah dengan terus mundur dan belajar
malware. penulis malware selalu mencari cara baru untuk menggagalkan debugger
dan untuk menjaga analis malware seperti Anda pada jari-jari kaki.

Anti-Debugging 16
Anti-Debugging 17
Anti-Debugging 18
ANTI - VIRTUALMACHINETECHNIQ UES
penulis malware kadang-kadang menggunakan anti-virtual
machine (anti-VM) teknik untuk menggagalkan upaya
analisis. Dengan teknik ini, malware mencoba untuk
mendeteksi apakah itu sedang dijalankan di dalam mesin
virtual. Jika mesin virtual terdeteksi, dapat bertindak secara
berbeda atau hanya tidak berjalan. Hal ini dapat, tentu saja,
menimbulkan masalah bagi analis.
teknik anti-VM yang paling sering ditemukan di malware yang banyak
digunakan, seperti bot, scareware, dan spyware (sebagian besar karena honeypots
sering menggunakan mesin virtual dan karena malware ini biasanya menargetkan
mesin rata-rata pengguna, yang tidak mungkin menjalankan virtual mesin).
Popularitas anti-VM malware telah turun baru-baru ini, dan ini dapat dikaitkan
dengan peningkatan besar dalam penggunaan virtualisasi. Secara tradisional,
penulis malware telah menggunakan teknik anti-VM karena mereka pikir hanya
analis akan menjalankan malware dalam mesin virtual. Namun, saat ini para
administrator dan pengguna menggunakan mesin virtual untuk membuatnya mudah
untuk membangun kembali mesin (pembangunan kembali telah menjadi proses
yang membosankan, tapi mesin virtual menghemat waktu dengan memungkinkan
Anda untuk kembali ke snapshot). penulis malware mulai menyadari bahwa hanya
karena sebuah mesin adalah mesin virtual tidak berarti bahwa itu bukan korban yang
berharga. Sebagai virtualisasi terus tumbuh, teknik anti-VM mungkin akan menjadi
lebih sedikit
umum.
Karena teknik anti-VM biasanya menargetkan VMware, dalam bab ini, kita
akan fokus pada teknik anti-VMware. Kita akan mempelajari teknik yang paling
umum dan bagaimana untuk mengalahkan mereka dengan mengutak-atik beberapa
pengaturan, menghapus perangkat lunak, atau menambal dieksekusi.
Artefak VMware
Lingkungan VMware menyisakan banyak artefak pada sistem, terutama ketika
VMware Tools diinstal. Malware dapat menggunakan artefak ini, yang hadir dalam
filesystem, registry, dan proses daftar, untuk mendeteksi VMware.
Sebagai contoh, Gambar 17-1 menunjukkan proses listing untuk gambar
VMware standar dengan VMware Tools diinstal. Perhatikan bahwa tiga proses
VMware menjalankan: VMwareService.exe, VMwareTray.exe, dan
VMwareUser.exe. Salah satu dari ini dapat ditemukan dengan malware seperti
mencari proses daftar untukVMware tali.

Gambar 17-1: Proses listing di gambar VMware dengan


VMware Tools berjalan

VMwareService.exemenjalankan VMware Tools Service sebagai anak


services.exe. Hal ini dapat diidentifikasi dengan mencari registri untuk layanan
diinstal pada mesin atau dengan daftar layanan menggunakan perintah berikut:

C: \> net start | findstr VMware

Layanan VMware Fisik Disk Helper


VMware Tools Layanan

VMware direktori instalasi C: \ Program Files \ VMware \ VMware Tools juga


mengandung artefak, seperti dapat registri. Sebuah pencarian cepat untuk
“VMware” di registry mesin virtual mungkin menemukan kunci seperti berikut ini,
yang entri yang mencakup informasi tentang hard drive virtual, adapter, dan mouse
virtual.

Anti-Virtual Machine Teknik 20


[HKEY_LOCAL_MACHINE \ HARDWARE \ DeviceMap \ SCSI \ SCSI Port 0 \ SCSI Bus 0 \ Id Target 0
\ Id Logical Unit 0]
"Identifier" = "VMware Virtual IDE Hard Drive"
"Type" = "DiskPeripheral"

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Instal ulang \


0000]
"DeviceDesc" = "VMware Accelerated AMD PCnet Adapter"
"DisplayName" = "VMware Accelerated AMD PCnet Adapter"
"Mfg" = "VMware, Inc."
"ProviderName" = "VMware, Inc."

[HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Control \ Kelas \ {4D36E96F-E325-11CE-


BFC1-08002BE10318} \ 0000]
"LocationInformationOverride" = "dicolokkan ke PS / 2 port tikus"
"InfPath" = "oem13.inf"
"InfSection" = "VMMouse"
"ProviderName" = "VMware, Inc."

Sebagaimana dibahas dalam Bab 2, Anda dapat menghubungkan mesin virtual


Anda ke jaringan dalam berbagai cara, semua yang memungkinkan mesin virtual
untuk memiliki kartu sendiri jaringan virtual antarmuka (NIC). Karena VMware
harus virtualisasi NIC, perlu membuat alamat MAC untuk mesin virtual, dan,
tergantung pada konfigurasi, adapter jaringan juga dapat mengidentifikasi
penggunaan VMware.
Tiga byte pertama dari alamat MAC biasanya khusus untuk vendor, dan alamat
MAC dimulai dengan 00: 0C: 29 terkait dengan VMware. VMware alamat MAC
biasanya berubah dari versi ke versi, tapi semua yang membutuhkan penulis
malware lakukan adalah untuk memeriksa alamat MAC mesin virtual untuk nilai-
nilai VMware.
Malware juga dapat mendeteksi VMware oleh perangkat keras lainnya, seperti
motherboard. Jika Anda melihat versi memeriksa malware perangkat keras,
mungkin akan mencoba untuk mendeteksi VMware. Carilah kode yang memeriksa
alamat MAC atau versi hardware, dan patch kode untuk menghindari cek.
Artefak VMware yang paling umum dapat dengan mudah dihilangkan dengan
menghapus VMware Tools atau dengan mencoba untuk menghentikan VMware
Tools layanan dengan perintah berikut:

Anda juga mungkin dapat mencegah malware dari mencari artefak. Misalnya,
jika Anda menemukan string VMware terkait tunggal dalam malware-sepertinet
start | findstr VMware. VMMouse. VMwareTray.exe, atau VMware Virtual IDE Hard Drive-
Anda tahu bahwa malware ini mencoba untuk mendeteksi VMware artefak. Anda
harus dapat menemukan kode ini dengan mudah di IDA Pro menggunakan referensi
ke string. Setelah Anda menemukannya, patch itu untuk menghindari deteksi sambil
memastikan bahwa malware akan berfungsi dengan baik.

Anti-Virtual Machine Teknik 21


Melewati VMware Artifact Pencarian
Mengalahkan malware yang mencari VMware artefak sering terdiri dari dua proses
yang sederhana: mengidentifikasi cek dan kemudian patch itu. Sebagai contoh,
katakanlah kita jalankanstringterhadap vmt.exe malware. Kami melihat bahwa biner
berisi string"VMwareTray.exe", Dan kami menemukan referensi silang dari kode untuk
string ini. Kami mengikuti ini referensi silang ke 0x401098, seperti yang
ditunjukkan dalam pembongkaran di Listing 17-1 di.

0040102D panggilan ds: CreateToolhelp32Snapshot


00401033 lea ecx, [EBP + processentry32]
00401039 mov ebx, eax
0040103B mendorong ecx; lppe
0040103C mendorong ebx; hSnapshot
0040103D mov [EBP + processentry32.dwSize], 22Ch
00401047 panggilan ds: Process32FirstW
0040104D mov esi, ds: WideCharToMultiByte
00401053 mov edi, ds: strncmp
00401059 lea esp, [esp + 0]
00401060 loc_401060:; KODE XREF: sub_401000 + B7j
00401060 mendorong 0; lpUsedDefaultChar
00401062 mendorong 0; lpDefaultChar
00401064 mendorong 104H; cbMultiByte
00401069 lea edx, [EBP + str1]
0040106F mendorong edx; lpMultiByteStr
00401070 mendorong 0FFFFFFFFh; cchWideChar
00401072 lea eax, [EBP + processentry32.szExeFile]
00401078 mendorong eax; lpWideCharStr
00401079 mendorong 0; dwFlags
0040107B mendorong 3; codepage
0040107D panggilan esi; WideCharToMultiByte
0040107F lea eax, [EBP + str1]
00401085 lea edx, [eax + 1]
00401088 loc_401088:; KODE XREF: sub_401000 + 8DJ
00401088 mov cl, [eax]
0040108A inc eax
0040108B tes cl, cl
loc_401088 singkat 0040108D JNZ
0040108F sub eax, edx
00401091 mendorong eax; MAXCOUNT
00401092 lea ecx, [EBP + str1]
00401098 mendorong diimbangi str2; "VMwareTray.exe"
0040109D mendorong ecx; str1
0040109E panggilan edi; strncmp
004010A0 add esp, 0Ch
004010A3 tes eax, eax
loc_4010C0 singkat 004010A5 jz
004010A7 lea edx, [EBP + processentry32]
004010AD mendorong edx; lppe

Anti-Virtual Machine Teknik 22


004010AE mendorong ebx; hSnapshot 004010AF memanggil
ds: Process32NextW
004010B5 tes eax, eax 004010B7 JNZ
loc_401060 singkat ...
004010C0 loc_4010C0:; KODE XREF: sub_401000 + A5j
004010C0 mendorong 0; Kode
004010C2 panggilan ds: exit

Listing 17-1: snippet Disassembly dari vmt.exe menunjukkan deteksi artefak VMware

Menganalisis kode ini lebih lanjut, kita melihat bahwa itu adalah pemindaian
proses daftar dengan fungsi seperti CreateToolhelp32Snapshot. Process32Next, dan
seterusnya. Itustrncmp di  adalah membandingkan VMwareTray.exe string dengan
hasil konversi processentry32.szExeFileuntuk ASCII untuk menentukan apakah nama
proses sedang dalam proses daftar. JikaVMwareTray.exeditemukan dalam proses
daftar, program ini akan segera mengakhiri, seperti yang terlihat di 0x4010c2. Ada
beberapa cara untuk menghindari deteksi ini:
 Menambal biner saat debugging sehingga melompat di 0x4010a5 tidak akan
pernah diambil.
 Gunakan hex editor untuk memodifikasi VMwareTray.exe string untuk membaca
XXXareTray.exe untuk membuat perbandingan gagal karena ini bukan proses
string yang valid.
 Uninstall VMware Tools sehingga VMwareTray.exe tidak akan lagi berjalan.

Memeriksa Artefak Memory


VMware meninggalkan banyak artefak dalam memori sebagai hasil dari proses
virtualisasi. Beberapa struktur prosesor kritis, yang, karena mereka baik pindah atau
berubah pada mesin virtual, meninggalkan jejak dikenali.
Salah satu teknik yang biasa digunakan untuk mendeteksi artefak memori
pencarian melalui memori fisik untuk string VMware, Yang kami telah menemukan
dapat mendeteksi beberapa ratus kasus.

Petunjuk rentan
Virtual mesin program memantau memonitor eksekusi mesin virtual. Ini berjalan
pada sistem operasi host untuk menyajikan sistem operasi tamu dengan platform
virtual. Ini juga memiliki beberapa kelemahan keamanan yang dapat
memungkinkan malware untuk mendeteksi virtualisasi.

CATATAN X86 terkait instruksi masalah di mesin virtual dibahas dalam bagian ini
awalnya diuraikan di USENIX 2000 kertas “Analisis Kemampuan Intel Pentium
untuk Mendukung Virtual Machine Aman Monitor” oleh John Robin dan Cynthia
Irvine.

Anti-Virtual Machine Teknik 23


Dalam mode kernel, VMware menggunakan terjemahan biner untuk emulasi.
instruksi privileged tertentu dalam mode kernel diinterpretasikan dan ditiru,
sehingga mereka tidak berjalan di prosesor fisik. Sebaliknya, dalam mode
pengguna, kode berjalan langsung pada prosesor, dan hampir setiap instruksi yang
berinteraksi dengan hardware adalah salah istimewa atau menghasilkan perangkap
kernel atau mengganggu. VMware menangkap semua menyela dan proses mereka,
sehingga mesin virtual masih berpikir itu adalah mesin biasa.
Beberapa petunjuk di akses x86 hardware berbasis informasi tetapi tidak
menghasilkan interupsi. Ini termasuksidt. sgdt. sldt, dan cpuid, diantara yang lain.
Dalam rangka untuk virtualisasi petunjuk ini benar, VMware akan perlu melakukan
terjemahan biner pada setiap instruksi (bukan hanya kernel-mode petunjuk),
menghasilkan kinerja hit besar. Untuk menghindari hit kinerja besar dari melakukan
full-instruksi emulasi, VMware memungkinkan instruksi tertentu untuk
mengeksekusi tanpa virtualisasi benar. Pada akhirnya, ini berarti bahwa urutan
instruksi tertentu akan memberikan hasil yang berbeda ketika berjalan di bawah
VMware daripada mereka akan pada hardware asli.
Prosesor ini menggunakan struktur kunci tertentu dan meja, yang dimuat pada
offset yang berbeda sebagai efek samping dari kurangnya terjemahan penuh. Tabel
interrupt descriptor (IDT) adalah struktur data internal ke CPU, yang digunakan oleh
sistem operasi untuk menentukan respon yang tepat untuk menyela dan
pengecualian. Di bawah x86, semua memori mengakses melewati baik tabel global
descriptor (GDT) atau tabel deskripsi lokal (LDT). Tabel ini berisi deskripsi segmen
yang memberikan rincian akses untuk setiap segmen, termasuk alamat dasar, jenis,
panjang, hak akses, dan sebagainya. IDT (IDTR), GDT (GDTR), dan LDT (LDTR)
adalah register internal yang berisi alamat dan ukuran tabel ini masing-masing.
Perhatikan bahwa sistem operasi tidak perlu menggunakan tabel ini. Sebagai
contoh, Windows mengimplementasikan model memori datar dan hanya
menggunakan GDT secara default. Tidak menggunakan LDT.
Tiga instructions- sensitifsidt. sgdt, dan sldt-membaca lokasi tabel ini, dan semua
menyimpan daftar masing-masing ke lokasi memori. Sementara instruksi ini
biasanya digunakan oleh sistem operasi, mereka tidak istimewa dalam arsitektur
x86, dan mereka dapat dieksekusi dari pengguna
ruang.
Prosesor x86 hanya memiliki tiga register untuk menyimpan lokasi dari tiga
tabel tersebut. Oleh karena itu, register ini harus berisi nilai yang valid untuk sistem
operasi host yang mendasari dan akan menyimpang dari nilai-nilai yang diharapkan
oleh virtual (tamu) sistem operasi. karenasidt. sgdt, dan sldt instruksi dapat dipanggil
setiap saat dengan kode mode pengguna tanpa terjebak dan virtualisasi dengan baik
oleh VMware, mereka dapat digunakan untuk mendeteksi keberadaannya.

Menggunakan Red Pill Anti-VM Teknik


Pill merah adalah teknik anti-VM yang mengeksekusi sidtinstruksi untuk mengambil
nilai dari IDTR mendaftar. Monitor mesin virtual harus memindahkan tamu IDTR
untuk menghindari konflik dengan IDTR host. Sejak monitor mesin virtual tidak

Anti-Virtual Machine Teknik 24


diberitahu ketika mesin virtual menjalankansidtinstruksi, yang IDTR untuk mesin
virtual dikembalikan. Tes pil Merah untuk perbedaan ini untuk mendeteksi
penggunaan VMware.
Listing 17-2 menunjukkan bagaimana pil Merah dapat digunakan oleh
malware.

mendorong EBP mov


EBP, esp sub esp,
454h dorongan ebx
dorongan esi
mendorong edi
mendorong 8; Ukuran mendorong 0;
Val lea eax, [EBP + Dst] dorongan eax;
Dst panggilan _memset add esp, 0Ch
lea eax, [EBP + dst]







Listing 17-2: Pil Merah di malware

The malware isu yang sidt instruksi di , Yang menyimpan isi IDTR ke dalam
lokasi memori yang ditunjuk oleh EAX. The IDTR adalah 6 byte, dan byte kelima
mengimbangi berisi awal alamat memori dasar. Yang byte kelima dibandingkan
dengan 0xFF, tanda tangan VMware.
Pil merah berhasil hanya pada mesin prosesor tunggal. Ini tidak akan bekerja
secara konsisten terhadap prosesor multicore karena setiap prosesor (tamu atau host)
memiliki IDT ditugaskan untuk itu. Oleh karena itu, hasil dari sidt instruksi dapat
bervariasi, dan tanda tangan yang digunakan oleh pil Merah bisa diandalkan.
Untuk menggagalkan teknik ini, dijalankan pada mesin prosesor multicore
atau hanya NOP-out sidt petunjuk.

Menggunakan No Pill Teknik


Itu sgdt dan sldtinstruksi teknik untuk mendeteksi VMware umumnya dikenal
sebagai Tidak ada pil KB. Tidak seperti pil Merah, ada pil KB bergantung pada
kenyataan bahwa struktur LDT ditugaskan untuk prosesor, bukan sebuah sistem
operasi. Dan karena Windows tidak biasanya menggunakan struktur LDT, tapi
VMware menyediakan dukungan virtual untuk itu, meja akan berbeda diramalkan:
The LDT lokasi pada mesin host akan menjadi nol, dan pada mesin virtual, itu akan
menjadi nol. Sebuah cek sederhana untuk nol terhadap hasilsldt instruksi melakukan
trik.
Itu sldtMetode dapat ditumbangkan di VMware dengan menonaktifkan
akselerasi. Untuk melakukan ini, pilih VMpengaturanprosesordan centang

Anti-Virtual Machine Teknik 25


kotak Percepatan Nonaktifkan. Tidak ada Pill memecahkan masalah percepatan ini
dengan menggunakansmsw instruksi jika sldtMetode gagal. Metode ini melibatkan
memeriksa berdokumen high-order bit dikembalikan olehsmsw petunjuk.

Query I / O Komunikasi Pelabuhan


Mungkin yang paling populer teknik anti-VMware sedang digunakan adalah bahwa
dari query port komunikasi I / O. Teknik ini sering ditemui di cacing dan bot, seperti
worm Storm dan Phatbot.
VMware menggunakan port I / O virtual untuk komunikasi antara mesin virtual
dan sistem operasi host untuk mendukung fungsi seperti copy dan paste antara dua
sistem. pelabuhan dapat dilihat dan dibandingkan dengan angka ajaib untuk
mengidentifikasi penggunaan VMware.
Keberhasilan teknik ini tergantung pada x86 diinstruksi, yang salinan data dari
I / O port yang ditentukan oleh sumber operan ke lokasi memori yang ditentukan
oleh operan tujuan. VMware memonitor penggunaandi instruksi dan menangkap I /
O ditakdirkan untuk port saluran komunikasi 0x5668 ( VX). Oleh karena itu, operan
kedua perlu dimuat denganVX dalam rangka untuk memeriksa VMware, yang terjadi
hanya ketika register EAX sarat dengan angka ajaib 0x564D5868 (VMXh). ECX harus
dimuat dengan nilai yang sesuai dengan tindakan yang Anda ingin tampil di
pelabuhan. Nilai0xA berarti “mendapatkan jenis versi VMware,” dan 0x14 berarti
“mendapatkan ukuran memori.” Keduanya dapat digunakan untuk mendeteksi
VMware, tetapi 0xA lebih populer karena dapat menentukan versi VMware.
Phatbot, juga dikenal sebagai Agobot, adalah botnet yang mudah digunakan.
Salah satu fitur-fiturnya adalah dukungan built-in I / O teknik port komunikasi,
seperti ditunjukkan pada Listing 17-3.

004014FA mendorong eax


004014FB mendorong ebx
004014FC mendorong ecx
004014FD mendorong edx
004014FE mov eax, 'VMXh'
00401503 mov ebx, [EBP + var_1C]
00401506 mov ecx, 0xA
00401509 mov dx, 'VX'
0040150E di eax, dx
0040150F mov [EBP + var_24], eax
00401512 mov [EBP + var_1C], ebx
00401515 mov [EBP + var_20], ecx
00401518 mov [EBP + var_28], edx ...
0040153E mov eax, [EBP + var_1C]
00401541 CMP eax, 'VMXh'
00401546 JNZ loc_40155C singkat

Listing 17-3: Phatbot ini deteksi VMware

Anti-Virtual Machine Teknik 26


malware yang pertama memuat angka ajaib 0x564D5868 (VMXh) Ke dalam
register EAX di . Berikutnya, beban variabel lokalvar_1cke EBX, alamat memori
yang akan kembali balasan dari VMware. ECX yang sarat dengan nilai 0xAuntuk
mendapatkan VMware jenis versi. Di. 0x5668 (VX) Dimuat ke DX, yang akan
digunakan dalam berikut di instruksi untuk menentukan port komunikasi VMware I
/ O.
Setelah eksekusi, diinstruksi terperangkap oleh mesin virtual dan ditiru untuk
melaksanakannya. Itudiinstruksi menggunakan parameter EAX (nilai magic), ECX
(operasi), dan EBX (informasi kembali). Jika nilai magic cocok VMXh dan kode
berjalan dalam mesin virtual, monitor mesin virtual akan bergema yang kembali
lokasi memori yang ditentukan oleh register EBX.
Cek di menentukan apakah kode sedang berjalan dalam mesin virtual. Karena
mendapatkan jenis versi opsi yang dipilih, ECX mendaftar akan berisi jenis
VMware (1 = Express, 2 = ESX, 3 = GSX, dan 4 = Workstation).
Cara termudah untuk mengatasi teknik ini adalah untuk NOP-out di instruksi
atau untuk menambal melompat bersyarat untuk memungkinkan apapun hasil dari
perbandingan.

Menggunakan Instruksi str


Itu strinstruksi mengambil pemilih segmen dari tugas register, yang menunjuk ke
segmen tugas negara (TSS) dari tugas yang sedang dijalankan. penulis malware
dapat menggunakanstrinstruksi untuk mendeteksi keberadaan mesin virtual, karena
nilai-nilai yang dikembalikan oleh instruksi mungkin berbeda pada mesin virtual
versus sistem asli. (Teknik ini tidak bekerja pada hardware multiprosesor.)
Gambar 17-2 menunjukkan str instruksi di 0x401224 di malware yang dikenal
sebagai
SNG.exe. Ini beban TSS ke dalam 4 byte:var_1 melalui VAR_4, Seperti yang diberi
label oleh IDA Pro. Dua perbandingan yang dibuat di 0x40125A dan 0x401262
untuk menentukan apakah VMware terdeteksi.

Anti-VM Instruksi x86


Kami baru saja Ulasan petunjuk yang paling umum digunakan oleh malware untuk
menggunakan teknik anti-VM. Instruksi ini adalah sebagai berikut:
 sidt
 sgdt
 sldt
 smsw
 str
 di (Dengan operan kedua diatur ke VX)
 cpuid

Malware biasanya tidak akan menjalankan instruksi ini kecuali itu adalah
melakukan deteksi VMware, dan menghindari deteksi ini bisa semudah menambal
biner untuk menghindari memanggil petunjuk ini. Instruksi-instruksi ini pada

Anti-Virtual Machine Teknik 27


dasarnya tidak berguna jika dijalankan dalam mode pengguna, jadi jika Anda
melihat mereka, mereka cenderung bagian dari kode antiVMware. VMware
menjelaskan sekitar 20 petunjuk sebagai “tidak virtualizable,” yang sebelumnya
adalah yang paling umum digunakan oleh malware.

Menyoroti Anti-VM di IDA Pro


Anda dapat mencari petunjuk yang tercantum dalam bagian sebelumnya di IDA Pro
menggunakan script IDAPython ditunjukkan pada Listing 17-4. Script ini mencari
petunjuk, menyoroti setiap merah, dan mencetak jumlah instruksi anti-VM
ditemukan di jendela output IDA.
Gambar 17-2 menunjukkan hasil parsial menjalankan script ini terhadap
SNG.exe dengan satu lokasi (strdi 0x401224) disorot oleh bar. Memeriksa kode
disorot dalam IDA Pro akan memungkinkan Anda dengan cepat melihat apakah
instruksi yang ditemukan terlibat dalam teknik anti-VM. Penyelidikan lebih lanjut
menunjukkan bahwastr instruksi yang digunakan untuk mendeteksi VMware.

Anti-Virtual Machine Teknik 28


Gambar 17-2: The str anti-VM teknik SNG.exe

dari idautils mengimpor * dari


idc import *

kepala = Kepala (SegStart (ScreenEA ()), SegEnd (ScreenEA ()))


antiVM = [] untuk i di kepala:
jika (GetMnem (i) == "sidt" atau GetMnem (i) == "sgdt" atau GetMnem (i) == "sldt" atau
GetMnem (i) == "smsw" atau GetMnem (i) == "str "atau GetMnem (i) == "di" atau
GetMnem (i) == "cpuid"): antiVM.append (i)
print "Jumlah calon petunjuk Anti-VM:% d" % (len (antiVM)) untuk saya di antiVM:
SetColor (i, CIC_ITEM, 0x0000FF)
Pesan ( "Anti-VM:% 08x \ n" % i)

Listing 17-4: IDA Pro script untuk menemukan petunjuk anti-VM

menggunakan ScoopyNG
ScoopyNG (http://www.trapkit.de/) adalah alat deteksi VMware gratis yang
mengimplementasikan tujuh pemeriksaan yang berbeda untuk mesin virtual,
sebagai berikut:

 Tiga cek pertama mencari sidt. sgdt, dan sldt (Pil Merah dan ada Pill) instruksi.
 Cek keempat mencari str.
 Kelima dan keenam menggunakan backdoor I / O port 0xA dan 0x14 pilihan,
masing-masing.
 Cek ketujuh bergantung pada bug di VMware versi berjalan dalam modus
emulasi.

Untuk versi dibongkar check keempat ScoopyNG, lihat Gambar 17-2.

Pengaturan tweaking
Kami telah membahas sejumlah cara untuk menggagalkan deteksi VMware seluruh
bab ini, termasuk menambal kode, menghapus VMware Tools, mengubah
pengaturan VMware, dan menggunakan mesin multiprosesor.
Ada juga sejumlah fitur tidak terdokumentasi di VMware yang dapat
membantu mengurangi teknik anti-VMware. Misalnya, menempatkan pilihan
dalam Listing 17-5 ke dalam file Vmx mesin virtual akan membuat mesin virtual
kurang terdeteksi.

isolation.tools.getPtrLocation.disable = "TRUE"
isolation.tools.setPtrLocation.disable = "TRUE" isolation.tools.setVersion.disable =
"TRUE" isolation.tools.getVersion.disable = "TRUE"
monitor_control.disable_directexec = "TRUE "monitor_control.disable_chksimd =
"TRUE" monitor_control.disable_ntreloc = "TRUE"
monitor_control.disable_selfmod = "TRUE" monitor_control.disable_reloc =

Anti-Virtual Machine Teknik 29


"TRUE" monitor_control.disable_btinout = "TRUE"
monitor_control.disable_btmemspace = "TRUE" monitor_control.disable_btpriv =
"TRUE" monitor_control.disable_btseg = "TRUE"

Listing 17-5: VMware File Vmx pilihan berdokumen digunakan untuk menggagalkan teknik anti-
VM

Itu directexecparameter menyebabkan kode mode pengguna untuk ditiru,


bukannya berjalan secara langsung pada CPU, sehingga menggagalkan teknik anti-
VM tertentu. Empat pengaturan pertama digunakan oleh perintah backdoor
VMware sehingga VMware Tools berjalan di tamu tidak bisa mendapatkan
informasi tentang host.
Perubahan ini akan melindungi terhadap semua cek ScoopyNG, selain keenam,
ketika berjalan pada mesin multiprosesor. Namun, kami tidak menyarankan
menggunakan pengaturan ini di VMware, karena mereka menonaktifkan kegunaan
VMware Tools dan mereka mungkin memiliki efek negatif yang serius pada kinerja
mesin virtual Anda. Menambahkan pilihan ini hanya setelah Anda telah kehabisan
semua teknik lainnya. Teknik-teknik ini telah disebutkan untuk kelengkapan, tetapi
memodifikasi file Vmx untuk mencoba untuk menangkap sepuluh berpotensi
ratusan cara yang VMware mungkin terdeteksi dapat sedikit dari sia-sia.

Melarikan diri Virtual Machine


VMware memiliki kerentanan, yang dapat dimanfaatkan untuk crash sistem operasi
host atau bahkan menjalankan kode di dalamnya.
Banyak kerentanan dipublikasikan ditemukan di folder VMware bersama fitur
atau alat-alat yang mengeksploitasi fungsi drag-and-drop dari VMware Tools. Salah
satu kerentanan dipublikasikan dengan baik menggunakan folder bersama untuk
memungkinkan tamu untuk menulis ke file pada sistem operasi host dalam rangka
untuk mengubah atau kompromi sistem operasi host. Meskipun teknik khusus ini
tidak bekerja dengan versi saat ini dari VMware, beberapa kelemahan yang berbeda
telah ditemukan di folder bersama fitur. shared folder menonaktifkan dalam
pengaturan mesin virtual untuk mencegah jenis serangan.
Lain kerentanan dipublikasikan dengan baik ditemukan dalam fungsi layar
mesin virtual di VMware. Mengeksploitasi kerentanan ini dikenal sebagai hujan
deras, dan tersedia untuk umum sebagai bagian dari Canvas penetrationtesting alat
(kerentanan ini juga telah ditambal oleh VMware).
Tertentu alat yang tersedia untuk umum membantu dalam memanfaatkan
VMware sekali tuan rumah telah terinfeksi, termasuk VMchat, VMcat, VMftp,
VMdrag-n-hack, dan VMdrag-n-sploit. Alat-alat ini jarang digunakan sampai Anda
telah lolos mesin virtual, dan Anda tidak perlu khawatir tentang mereka jika
malware yang sedang berjalan dalam mesin virtual.

Anti-Virtual Machine Teknik 30


Kesimpulan
Bab ini memperkenalkan paling populer teknik anti-VMware. Karena penulis
malware menggunakan teknik ini untuk memperlambat analisis, penting untuk
dapat mengenali mereka. Kami telah menjelaskan teknik ini secara rinci sehingga
Anda dapat menemukan mereka di pembongkaran atau debugging, dan kami telah
menjelajahi cara untuk mengatasinya tanpa perlu memodifikasi malware pada
tingkat pembongkaran.
Ketika melakukan analisis dinamis dasar, Anda harus selalu menggunakan
mesin virtual. Namun, jika malware subjek Anda tampaknya tidak berjalan,
mempertimbangkan untuk mencoba mesin virtual lain dengan VMware Tools
dihapus sebelum debugging atau membongkar malware mencari deteksi mesin
virtual. Anda mungkin juga menjalankan malware subjek Anda dalam lingkungan
virtual yang berbeda (seperti VirtualBox atau Parallels) atau bahkan pada mesin
fisik.
Seperti dengan teknik anti-debugging, teknik anti-VM dapat melihat dengan
menggunakan akal sehat sambil perlahan-lahan debugging proses. Misalnya, jika
Anda melihat kode mengakhiri prematur pada lompatan bersyarat, mungkin
melakukannya sebagai hasil dari teknik anti-VM. Seperti biasa, menyadari jenis
masalah dan melihat ke depan dalam kode untuk menentukan tindakan apa yang
harus diambil.

Anti-Virtual Machine Teknik 31


Anti-Virtual Machine Teknik 32
Anti-Virtual Machine Teknik 33
Anti-Virtual Machine Teknik 34

Anda mungkin juga menyukai