Anda di halaman 1dari 34

Lab 10-1 Solusi

Jawaban pendek
1. Jika Anda menjalankan ProcMon untuk memantau program ini, Anda akan
melihat bahwa satu-satunya panggilan untuk menulis ke registri adalah untuk
RegSetValue untuk nilai HKLM \ SOFTWARE \ Microsoft \ Cryptography \ RNG \ Seed.
Beberapa perubahan tidak langsung dibuat oleh panggilan ke CreateServiceA,
Tetapi program ini juga membuat perubahan langsung ke registry dari kernel
yang tidak terdeteksi oleh ProcMon.
2. Untuk mengatur breakpoint untuk melihat apa yang terjadi di kernel, Anda harus
membuka executable dalam sebuah contoh dari WinDbg berjalan dalam mesin
virtual, sementara juga debugging kernel dengan contoh lain dari WinDbg di
mesin host. Ketika Lab10-01.exe dihentikan dalam mesin virtual, Anda pertama
kali menggunakan! drvobjperintah untuk mendapatkan pegangan ke objek driver,
yang berisi pointer ke fungsi membongkar. Berikutnya, Anda dapat mengatur
breakpoint pada fungsi membongkar dalam pengemudi. breakpoint akan dipicu
ketika Anda me-restart Lab10-01.exe.
3. Program ini menciptakan layanan untuk memuat sopir. Kode driver kemudian
menciptakan (atau memodifikasi, jika mereka ada) kunci registri \ Registry \
Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ StandardProfile dan
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ DomainProfile.
Pengaturan kunci registri menonaktifkan firewall Windows XP.

Analisis rinci
Kita mulai dengan beberapa analisis statis dasar. Meneliti executable, kita melihat
sangat sedikit impor selain yang standar yang disertakan dengan setiap executable.
Impor dari bungaOpenSCManagerA. OpenServiceA. ControlService. StartServiceA, dan
CreateServiceA. Ini menunjukkan program menciptakan layanan, dan mungkin mulai dan
memanipulasi layanan tersebut. Tampaknya ada sedikit interaksi tambahan sistem.
String keluaran mengungkapkan string menarik beberapa. Yang pertama
adalahC: \ Windows \ System32 \ Lab10-01.sys, Yang menunjukkan bahwa Lab10-01.sys
mungkin berisi kode untuk layanan ini.
Memeriksa file driver, kita melihat bahwa itu mengimpor hanya tiga fungsi.
Fungsi pertama adalahKeTickCount, Yang termasuk dalam hampir setiap pengemudi
dan dapat diabaikan. Dua fungsi yang tersisa,RtlCreateRegistryKey dan
RtlWriteRegistryValue, Memberitahu kita bahwa pengemudi mungkin mengakses registry. 10
File driver juga berisi sejumlah string yang menarik, sebagai berikut:

EnableFirewall
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ StandardProfile
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall \ DomainProfile
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft \ Windows Firewall
\ Registry \ Machine \ SOFTWARE \ Policies \ Microsoft

string ini terlihat banyak seperti kunci registri, kecuali bahwa mereka mulai
dengan \ Registry \ Machine, Bukan salah satu kunci akar registri biasa, seperti HKLM.
Ketika mengakses registry dari kernel, awalan\ Registry \ Machine setara dengan
mengakses HKEY_LOCAL_MACHINEdari program user-space. Pencarian Internet
mengungkapkan bahwa pengaturanEnableFirewall nilai 0 menonaktifkan built-in
Windows XP firewall.
Karena string ini menunjukkan bahwa malware menulis ke registri, kita
membuka ProcMon untuk menguji hipotesis kami. Hal ini menunjukkan beberapa
panggilan ke fungsi yang membaca registry, tetapi hanya satu panggilan untuk
menulis ke registri:RegSetValue pada nilai HKLM \ SOFTWARE \ Microsoft \ Cryptography \
RNG \ Seed. nilai registri ini berubah sepanjang waktu dan tidak berarti untuk analisis
malware, tapi karena kode kernel yang terlibat, kita perlu memastikan bahwa
pengemudi tidak memodifikasi registri secara terselubung.
Berikutnya, kita membuka executable, arahkan ke utama fungsi yang ditampilkan
pada Listing 10-1L, dan melihat bahwa itu hanya membuat empat fungsi panggilan.

00401004 mendorong 0F003Fh; dwDesiredAccess


00401009 mendorong 0; lpDatabaseName
0040100B mendorong 0; lpMachineName
0040100D call ds: OpenSCManagerA; Membuat sambungan ke layanan
0040100D; kontrol manajer pada komputer yang ditentukan
0040100D; dan membuka tertentu Database 00401013 mov edi, eax
00401015 uji edi, edi
00401017 JNZ loc_401020 singkat
00401019 pop edi
0040101A add esp, 1Taw 0040101D
retn 10h 00.401.020 loc_401020:
00401020 mendorong esi
00401021 mendorong 0; lpPassword
00401023 mendorong 0; lpServiceStartName
00401025 mendorong 0; lpDependencies
00401027 mendorong 0; lpdwTagId
00401029 mendorong 0; lpLoadOrderGroup
0040102B push diimbangi BinaryPathName; "C: \\ Windows \\ System32 \\ Lab10-01.sys"
00401030 dorongan 1; dwErrorControl
00401032 push 3; dwStartType
00401034 dorongan 1; dwServiceType
00401036 mendorong 0F01FFh; dwDesiredAccess
0040103B mendorong diimbangi ServiceName; "Lab10-01"
00401040 mendorong diimbangi ServiceName; "Lab10-01"
00401045 mendorong edi; hSCManager
00401046 call ds: CreateServiceA

Listing 10-1L: utama metode dari Lab10-01.exe

Pertama, itu panggilan OpenSCManagerA di  untuk mendapatkan pegangan untuk


service manager, dan kemudian memanggil CreateServiceA di untuk membuat layanan
yang disebut Lab10-01. Panggilan untuk
CreateServiceA memberitahu kita bahwa layanan akan menggunakan kode di C: \ Windows \
System32 \ Lab10-01.sys di  dan bahwa jenis layanan 3 di , atau
SERVICE_KERNEL_DRIVER, Yang berarti bahwa file ini akan dimuat ke dalam kernel.
Jika panggilan untuk CreateServiceA gagal, panggilan kode OpenServiceA dengan
nama layanan yang sama, seperti yang ditunjukkan pada Listing 10-2L di . Hal ini
akan membuka pegangan ke layanan Lab10-01 jikaCreateServiceA panggilan gagal
karena layanan sudah ada.

00401052 mendorong 0F01FFh ; dwDesiredAccess


00401057 mendorong diimbangi ServiceName; "Lab10-01" 0040105C
dorongan edi ; hSCManager
0040105D

Listing 10-2L: Panggilan untuk OpenServiceA untuk mendapatkan pegangan ke layanan untuk Lab10-01

Berikutnya, panggilan Program StartServiceA untuk memulai layanan, seperti


ditunjukkan pada Listing 10-3L di . Akhirnya, itu panggilanControlService di . Kedua
parameter untukControlServiceadalah jenis pesan kontrol sedang dikirim. Dalam hal ini,
nilai adalah0x01 di , Yang kita lihat di dokumentasi dan menemukan bahwa itu berarti
SERVICE_CONTROL_STOP. Ini akan membongkar pengemudi dan memanggil fungsi
membongkar pengemudi.

00401069 mendorong 0; lpServiceArgVectors


0040106B mendorong 0; dwNumServiceArgs
0040106D mendorong esi; hService
0040106E call ds: StartServiceA
00401074 uji esi, esi
00401076 jz loc_401086 singkat
00401078 lea eax, [esp + 24h + ServiceStatus]

C mov EBP, esp

sub_10906
0040107C mendorong eax; lpServiceStatus
0040107D push 1; dwControl
0040107F mendorong esi; hService
00401080 call ds: ControlService; Kirim kode kontrol untuk layanan Win32

Listing 10-3L: Panggilan untuk ControlService dari Lab10-01.exe

Melihat Lab10-01.sys di IDA Pro


Sebelum kita mencoba untuk menganalisis driver dengan WinDbg, kita bisa buka
driver di IDA Pro untuk menguji DriverEntryfungsi. Ketika kami pertama kali membuka
pengemudi dan arahkan ke titik masuk, kami melihat kode pada Listing 10-4L.

Listing 10-4L: Kode di entry point dari Lab10-01.sys

Fungsi ini adalah titik masuk dari pengemudi, tapi itu bukan DriverEntryfungsi.
compiler menyisipkan kode pembungkus sekitarDriverEntry. Yang asliDriverEntry Fungsi
terletak di sub_10906 .
Seperti ditunjukkan pada Listing 10-5L, tubuh utama dari DriverEntry Fungsi muncul
untuk memindahkan nilai offset ke lokasi memori, tetapi sebaliknya tidak membuat
panggilan fungsi atau berinteraksi dengan sistem.

00010906 mov edi, edi 00010908 dorongan


EBP
00010909 mov EBP, esp
0001090B mov eax, [EBP + ARG_0]
0001090E mov dword ptr [eax + 34h], offset loc_10486
00010915 xor eax, eax
00010917 pop EBP
00010918 retn 8

Listing 10-5L: The DriverEntry rutin untuk Lab10-01.sys

Menganalisis Lab10-01.sys di WinDbg


Sekarang, kita dapat menggunakan WinDbg untuk memeriksa Lab10-01.sys untuk
melihat apa yang terjadi ketika ControlServicedipanggil untuk membongkar Lab10-01.sys.
Kode di user-space beban executable Lab10-10.sys dan kemudian segera membongkar
itu. Jika kita menggunakan debugger kernel sebelum menjalankan executable
berbahaya, pengemudi tidak akan belum berada di memori, jadi kita tidak akan mampu
untuk memeriksanya. Tetapi jika kita menunggu sampai setelah eksekusi berbahaya
selesai mengeksekusi, pengemudi akan sudah telah diturunkan dari memori.
Untuk menganalisis Lab10-01.sys dengan WinDbg ketika sedang dimuat dalam
memori, kami akan memuat dieksekusi ke WinDbg dalam mesin virtual. Kami
mengatur breakpoint antara waktu bahwa driver dimuat dan dibongkar,
diControlService sebut, dengan perintah berikut:

Kemudian kita mulai program dan menunggu sampai breakpoint terkena. Ketika
breakpoint terkena, kita disajikan dengan informasi berikut di WinDbg:

Breakpoint 0 hit
eax = 0012ff1c ebx = 7ffdc000 ecx = 77defb6d edx = 00000000 esi = 00.144.048 edi = 00144f58 eip
= 00.401.080 esp = 0012ff08 EBP = 0012ffc0 iopl = 0 nv up ei pl nz na pe nc cs = 001B ss = 0023 ds
= 0023 es = 0023 fs = 003b gs = 0000 EFL = 00.000.206 image00400000 + 0x1080:

Setelah program ini berhenti di breakpoint, kita bergerak dari mesin virtual untuk
menghubungkan debugger kernel dan mendapatkan informasi tentang Lab10-01.sys.
Kami membuka contoh lain dari WinDbg dan pilih FileDebug kerneldengan pipa
set untuk \\. \ pipe \ com_1 dan baud rate 115200 untuk menghubungkan contoh
WinDbg berjalan di mesin host untuk kernel dari mesin tamu. Kita tahu bahwa layanan
kami disebut Lab10-01, sehingga kita bisa mendapatkan objek pengemudi dengan
menggunakan! drvobj perintah, seperti yang ditunjukkan pada Listing 10-6L.

kd>! drvobj lab10-01


Sopir objek (8263b418) adalah untuk:
Memuat simbol untuk f7c47000 Lab10-01.sys -> Lab10-01.sys
*** ERROR: beban Modul selesai tetapi simbol tidak dapat dimuat untuk Lab10-01.sys
\ Driver \ Lab10-01
Daftar sopir Extension: (id, addr)

Perangkat daftar Object:

Listing 10-6L: Menemukan objek perangkat untuk Lab10-01

Output dari ! drvobj perintah memberikan kami alamat dari objek sopir di . Karena
tidak ada perangkat yang tercantum dalam daftar perangkat objek di, Kita tahu bahwa
driver ini tidak memiliki perangkat yang dapat diakses oleh aplikasi userspace.

CATATAN Untuk mengatasi kesulitan menemukan nama layanan, Anda bisa mendapatkan daftar
objek pengemudi sedang dalam kernel dengan ! Objek \ driver perintah.
Setelah kita memiliki alamat dari objek driver, kita bisa melihatnya menggunakan dt
perintah, seperti yang ditunjukkan pada Listing 10-7L.

kd> dt _DRIVER_OBJECT 8263b418 nt!


_DRIVER_OBJECT
+ 0x000 Jenis: 4
+ 0x002 Ukuran: 168
+ 0x004 DeviceObject: (null)
+ 0x008 Flags: 0x12
+ 0x00c DriverStart: 0xf7c47000 + 0x010 DriverSize:
0xe80
+ 0x014 DriverSection: 0x826b2c88
+ 0x018 DriverExtension: _DRIVER_EXTENSION 0x8263b4c0
+ 0x01c DriverName: _UNICODE_STRING "\ driver \ Lab10-01"
+ 0x024 HardwareDatabase: 0x80670ae0 _UNICODE_STRING "\ Registry \ MACHINE \
HARDWARE \ DESCRIPTION \ SYSTEM"
+ 0x028 FastIoDispatch: (null)
+ 0x02c DriverInit: 0xf7c47959 panjang 0
+ 0x030 DriverStartIo: (null)
+ 0x034 DriverUnload: 0xf7c47486 kekosongan 0
+ 0x038 MajorFunction:! [28] 0x804f354a lama nt IopInvalidDeviceRequest + 0

Listing 10-7L: Melihat objek driver Lab10-01.sys di WinDbg

Setelah mengatur breakpoint, kami kembali berjalan kernel kami. Kemudian


kami kembali ke versi WinDbg berjalan pada dieksekusi pada mesin virtual kami dan

melanjutkan itu juga. Segera, seluruh tamu OS membeku karena debugger kernel
telah memukul breakpoint kernel kami. Pada titik ini, kita bisa pergi ke debugger
kernel untuk melangkah melalui kode. Kami melihat bahwa program
panggilanRtlCreateRegistryKey berfungsi tiga kali untuk membuat beberapa kunci
registri, dan kemudian memanggil RtlWriteRegistryValue dua kali untuk mengatur
EnableFirewallnilai 0 di dua tempat. Ini menonaktifkan firewall Windows XP dari kernel
dengan cara yang sulit bagi program keamanan untuk mendeteksi.
Jika fungsi membongkar di 0xf7c47486 yang panjang atau kompleks, akan sulit
untuk menganalisa di WinDbg. Dalam banyak kasus, lebih mudah untuk menganalisis
fungsi dalam IDA Pro setelah Anda telah mengidentifikasi di mana fungsi terletak,
karena IDA Pro melakukan pekerjaan yang lebih baik dari menganalisis fungsi.
Namun, lokasi fungsi dalam WinDbg berbeda dari lokasi fungsi dalam IDA Pro, jadi
kami harus melakukan beberapa perhitungan manual untuk melihat fungsi dalam IDA
Pro. Kita harus menghitung offset fungsi dari awal berkas ini dimuat di WinDbg
menggunakanlm perintah, sebagai berikut:

kd> lm awal mengakhiri nama


modul ...
f7c47000 f7c47e80 Lab10_01 (tidak ada simbol) ...

Seperti yang Anda lihat, file tersebut dimuat pada 0xf7c47000 di , Dan dari awal, kita
tahu fungsi membongkar terletak di 0xf7c47486. Kami kurangi 0xf7c47000 dari
0xf7c47486 untuk mendapatkan offset (0x486), yang kemudian kita gunakan untuk
menavigasi ke fungsi membongkar di IDA Pro. Misalnya, jika alamat beban dasar di IDA
Pro adalah 0x00100000, maka kita arahkan ke alamat 0x00100486 untuk menemukan fungsi
membongkar di IDA Pro. Kita kemudian dapat menggunakan analisis statis dan IDA Pro
untuk mengkonfirmasi apa yang kita temukan di WinDbg.
Atau, kita dapat mengubah alamat dasar di IDA Pro dengan memilih
EditsegmenRebase Program dan mengubah nilai alamat dasar dari 0x00100000
ke 0xf7c47000.

CATATAN Jika Anda mencoba untuk menggunakan breakpoint tangguhan menggunakan bu $


iment (Lab10-01), Anda mungkin telah mengalami kesulitan karena WinDbg perubahan
tanda hubung untuk menegaskan ketika bertemu mereka dalam nama file. Perintah
yang benar untuk istirahat pada titik masuk dari pengemudi di laboratorium ini akan
menjadibu $ iment (Lab10_01). Perilaku ini tidak didokumentasikan di mana saja dan
mungkin tidak konsisten di seluruh versi WinDbg.
Lab 10-2 Solusi

Jawaban pendek
1. Program ini menciptakan file C: \ Windows \ System32 \ Mlwx486.sys. Anda
dapat menggunakan ProcMon atau alat pemantauan dinamis lain untuk melihat file
yang dibuat, tetapi Anda tidak dapat melihat file pada disk karena tersembunyi.
2. Program ini memiliki komponen kernel. Hal ini disimpan dalam bagian sumber
daya file, dan kemudian ditulis ke disk dan dimuat ke dalam kernel sebagai
layanan.
3. Program ini merupakan rootkit yang dirancang untuk menyembunyikan file.
Menggunakan hooking SSDT menimpa masuk keNtQueryDirectoryFile, Yang
digunakan untuk mencegah tampilan dari setiap file yang dimulai dengan Mlwx
(case-sensitive) dalam daftar direktori.

Analisis rinci
Melihat bagian impor dieksekusi ini, kita melihat impor untuk
CloseServiceHandle. CreateServiceA. OpenSCManagerA, dan StartServiceA, Yang
memberitahu kita bahwa program ini akan membuat dan memulai layanan. Karena
program ini juga panggilanCreateFile dan WriteFile, Kita tahu bahwa itu akan menulis
ke file di beberapa titik. Kami juga melihat panggilan keLoadResource dan
SizeOfResource, Yang memberitahu kita bahwa program ini akan melakukan sesuatu
dengan bagian sumber daya dari Lab10-02.exe.
Menyadari bahwa program mengakses bagian sumber daya, kita menggunakan
Resource Hacker untuk memeriksa bagian sumber daya. Di sana, kita melihat bahwa
file berisi header PE lain dalam bagian sumber daya, seperti yang ditunjukkan pada
Gambar 10-1L. Ini mungkin file lain dari kode berbahaya yang Lab10-02.exe akan
menggunakan.
Berikutnya, kita menjalankan program dan menemukan bahwa itu menciptakan
sebuah file dan layanan. Menggunakan ProcMon, kita melihat bahwa program ini
menciptakan sebuah file di C: \ Windows \ System32, dan bahwa hal itu menciptakan
sebuah layanan yang menggunakan file sebagai executable. File yang berisi kode kernel
yang akan dimuat oleh OS.
Kami berikutnya harus menemukan file yang program menciptakan untuk
menganalisis dan menentukan apa kode kernel lakukan. Namun, ketika kita melihat di
C: \ Windows \ System32, kami menemukan bahwa tidak ada ada. Kita bisa melihat di
ProcMon bahwa file tersebut dibuat, dan tidak ada panggilan yang akan menghapus file.
Berdasarkan fakta-fakta bahwa file tersebut tidak muncul tapi kami tidak melihat
bagaimana hal itu dihapus dan bahwa sopir yang terlibat, kita harus curiga bahwa kita
sedang berhadapan dengan rootkit.

Gambar 10-1L: Sebuah file executable yang disimpan di bagian sumber daya Lab10-02.exe
Menemukan Rootkit yang
Dalam rangka untuk terus menyelidiki, kami ingin memeriksa untuk melihat apakah

driver kernel kami dimuat. Untuk melakukan itu, kita menggunakansc perintah untuk
memeriksa status layanan yang menjalankan driver kernel kami, seperti ditunjukkan
pada Listing 10-8L.

C: \>sc query "486 WS driver"

SERVICE_NAME: 486 WS driver


TYPE: 1 KERNEL_DRIVER
NEGARA: 4 RUNNING
(Stoppable, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE: 0 (0x0)
SERVICE_EXIT_CODE: 0 (0x0)
CHECKPOINT: 0x0
WAIT_HINT: 0x0

Listing 10-8L: Menggunakan sc perintah untuk mendapatkan informasi tentang layanan

Kami query untuk nama layanan 486 WS driver di , Yang ditentukan dalam
panggilan untuk CreateServiceA. Kita lihat padabahwa layanan masih berjalan, yang
mengatakan kepada kita bahwa kode kernel dalam memori. Sesuatu yang
mencurigakan sedang terjadi karena pengemudi masih berjalan, tapi tidak pada disk.
Sekarang, untuk menentukan apa yang terjadi, kita menghubungkan debugger kernel
untuk mesin virtual kami, dan kami memeriksa untuk melihat apakah sopir itu
sebenarnya dimuat menggunakanlmperintah. Kami melihat entri yang cocok dengan
nama file yang telah dibuat oleh Lab10-02.exe:f7c4d000 f7c4dd80 Mlwx486 (ditangguhkan)
Kita sekarang yakin bahwa pengemudi dimuat ke memori dengan nama file
Mlwx486.sys, tetapi file tersebut tidak muncul pada disk, menunjukkan bahwa ini
mungkin rootkit.
Berikutnya, kita memeriksa SSDT untuk setiap entri yang dimodifikasi, seperti
ditunjukkan pada Listing 10-9L.

kd> dd DWO (KeServiceDescriptorTable) L100 ...


80501dbc 8060cb50 8060cb50 8053c02e 80606e68
80501dcc 80607ac8 f7c4d486 805b3de0 8056f3ca
80501ddc 806053a4 8056c222 8060c2dc 8056fc46 ...

Listing 10-9L: Sebuah kutipan dari SSDT dengan satu entri yang telah dimodifikasi oleh rootkit
Kita melihat bahwa entri di  di lokasi memori yang jelas di luar batas-batas
ntoskrnlmodul tetapi dalam pengemudi Mlwx486.sys dimuat. Untuk menentukan
fungsi normal digantikan, kita kembali mesin virtual kami sebelum rootkit tersebut
telah terpasang untuk melihat fungsi disimpan pada offset ke SSDT yang ditimpa.
Dalam hal ini, fungsi iniNtQueryDirectoryFile, Yang merupakan fungsi serbaguna yang
mengambil informasi tentang file dan direktori yang digunakan oleh FindFirstFile dan
FindNextFileuntuk melintasi struktur direktori. Fungsi ini juga digunakan oleh Windows
Explorer untuk menampilkan file dan direktori. Jika rootkit yang mengaitkan fungsi
ini, itu bisa menyembunyikan file, yang akan menjelaskan mengapa kita tidak dapat
menemukan Mlwx486.sys. Sekarang kita telah menemukan fungsi yang mengaitkan
SSDT, kita harus menganalisis apa fungsi yang melakukan.

Meneliti Hook Fungsi


Kita sekarang melihat lebih dekat pada fungsi yang disebut bukan NtQueryDirectoryFile,
Yang kita sebut PatchFunction. The berbahayaPatchFunctionharus bekerja dengan
antarmuka yang sama seperti fungsi semula, jadi kami periksa dulu dokumentasi fungsi
asli. Kami menemukan bahwaNtQueryDirectoryFilesecara teknis tidak tercatat menurut
Microsoft, tapi pencarian internet cepat akan memberikan semua informasi yang kita
butuhkan. ItuNtQueryDirectoryFile Fungsi adalah salah satu yang sangat fleksibel dengan
banyak parameter yang berbeda yang menentukan apa yang akan dikembalikan.
Sekarang, kita ingin melihat fungsi berbahaya untuk melihat apa yang sedang
dilakukan dengan permintaan. Kami mengatur breakpoint pada PatchFunction dan
discover bahwa hal pertama yang dilakukannya adalah panggilan asli
NtQueryDirectoryFile dengan semua parameter asli, seperti yang ditunjukkan pada Listing
10-10L.

f7c4d490 ff7530 mendorong dword ptr [EBP + 30h] f7c4d493


ff752c mendorong dword ptr [EBP + 2Taw] f7c4d496 ff7528
mendorong dword ptr [EBP + 28H] f7c4d499 ff7524 mendorong
dword ptr [EBP + 24h] ff7520 f7c4d49c mendorong dword ptr
[EBP + 20h] f7c4d49f 56 dorongan ff7518 esi f7c4d4a0
mendorong dword ptr [EBP + 18h] ff7514 f7c4d4a3 mendorong
dword ptr [EBP + 14h] ff7510 f7c4d4a6 mendorong dword ptr
[EBP + 10h] f7c4d4a9 ff750c mendorong dword ptr [EBP + 0Ch]
f7c4d4ac ff7508 mendorong dword ptr [ EBP + 8] f7c4d4af
e860000000 memanggil Mlwx486 + 0x514 (f7c4d514)

Listing 10-10L: daftar Majelis PatchFunction

CATATAN Ini mungkin tidak sepenuhnya jelas dari Listing 10-10L bahwa fungsi dipanggil adalah
NtQueryDirectoryFile. Namun, jika kita satu langkah di ataspanggilan fungsi, kita melihat
bahwa ia pergi ke bagian lain dari file yang melompat ke NtQueryDirectoryFile. Dalam
IDA Pro, panggilan ini akan diberi labelNtQueryDirectoryFile, Tapi disassembler termasuk
dalam WinDbg jauh lebih canggih. Idealnya, kita akan memiliki file untuk melihat di
IDA Pro sementara kita debugging, tapi kami tidak dapat menemukan file ini karena itu
tersembunyi.
Itu PatchFunction memeriksa parameter kedelapan, FileInformationClass, Dan jika itu adalah
nilai lain dari 3, ia mengembalikan NtQueryDirectoryFile'S nilai kembali asli. Hal ini juga
memeriksa nilai kembali dariNtQueryDirectoryFile dan nilai parameter kesembilan,
ReturnSingleEntry. PatchFunctionmencari parameter tertentu. Jika parameter tidak memenuhi
kriteria, maka fungsi ini persis sama dengan aslinyaNtQueryDirectoryFile. Jika parameter
melakukan memenuhi kriteria,PatchFunction akan mengubah nilai kembali, yang adalah apa
yang kita tertarik. Untuk menguji apa yang terjadi selama panggilan untuk PatchFunction
dengan parameter yang benar, kita menetapkan breakpoint pada PatchFunction.
Jika kita mengatur breakpoint pada PatchFunction, Akan merusak setiap kali fungsi
ini dipanggil, tapi kami tertarik hanya beberapa fungsi panggilan. Ini adalah waktu
yang tepat untuk menggunakan breakpoint kondisional sehingga breakpoint terkena
hanya ketika parameter untukPatchFunctionsesuai dengan kriteria kami. Kami mengatur
breakpoint padaPatchFunction, Namun breakpoint akan terkena hanya jika nilai
ReturnSingleEntry adalah 0, sebagai berikut:

kd> bp f7c4d486 ".if DWO (esp + 0x24) == 0 {} .else {gc}"

CATATAN Jika Anda memiliki Windows Explorer terbuka dalam sebuah direktori, Anda
mungkin melihat breakpoint ini memukul berulang-ulang di benang yang berbeda,
yang dapat mengganggu saat Anda sedang mencoba untuk menganalisis fungsi.
Untuk membuatnya lebih mudah untuk menganalisis, Anda harus menutup
semua dari Windows Explorer jendela dan menggunakan dir perintah di baris
perintah untuk memicu breakpoint.
Setelah kode menyaring panggilan yang menarik, kita melihat fungsi lain yang
disimpan pada offset 0xf7c4d590. Meskipun tidak secara otomatis diberi label oleh
WinDbg, kita dapat menentukan bahwa itu adalahRtlCompareMemorydengan melihat
pembongkaran atau melangkah ke fungsi panggilan. Kode pada Listing 10-11L
menunjukkan panggilan untukRtlCompareMemory di .

f7c4d4ca 6a08 dorongan 8 f7c4d4cc 681ad5c4f7 dorongan diimbangi Mlwx486 +


0x51a (f7c4d51a) f7c4d4d1 8d465e lea eax, [esi + 5EH] f7c4d4d4 50 dorongan eax
f7c4d4d5 32db xor bl, bl
f7c4d4d7 ff1590d5c4f7 panggilan dword ptr [Mlwx486 + 0x590 (f7c4d590)]
f7c4d4dd 83f808 CMP eax, 8 f7c4d4e0 7512 jne Mlwx486 + 0x4f4
(f7c4d4f4)

Listing 10-11L: Perbandingan nama file untuk menentukan apakah rootkit akan memodifikasi informasi
kembali dari NtQueryDirectoryFile

Kita sekarang dapat melihat apa PatchFunctionadalah membandingkan. Seperti


ditunjukkan pada Listing 1011L, parameter pertama yangRtlCompareMemory aku s eax,
Yang menyimpan offset di esi + 5EH di , Yang offset untuk nama file. Sebelumnya
pada pembongkaran kami, kami melihat bahwaesi adalah FileInformation, Yang berisi
informasi diisi oleh NtQueryDirectoryFile. Memeriksa dokumentasi
untukNtQueryDirectoryFile, Kita melihat bahwa ini adalah
FILE_BOTH_DIR_INFORMATIONstruktur, dan bahwa offset 0x5E adalah di mana nama file
disimpan sebagai string karakter lebar. (Kami juga bisa menggunakan WinDbg untuk
memberitahu kami apa yang disimpan di sana.)
Untuk melihat apa yang disimpan di lokasi esi + 5EH, Kita menggunakan
dbperintah, seperti yang ditunjukkan pada Listing 10-12L. Ini mengungkapkan bahwa
nama file adalah Installer.h.

kd> db esi + 5e
036a302e 49 00 6e 00 73 00 74 00-61 00 6c 00 6c 00 65 00 Installe
036a303e 00 68 00 72 00 00 00 00-00 00 f6 BB menjadi f0 6e 70 rh .......... np 036a304e c7 01 47 c0 db
46 25 75-cb 01 50 1e c1 f0 6e 70 .. G..F% u..P ... np 036a305e c7 01 50 1e c1 f0 6e 70-c7 01 00 00 00 00
00 00 ..P ... np ........

Listing 10-12L: Meneliti argumen pertama untuk RtlCompareMemory

Operan lain dari perbandingan adalah lokasi f7c4d51a tetap, dan kita dapat
menggunakan dbperintah untuk melihat itu juga. Daftar 10-13L menunjukkan bahwa
parameter kedua untukRtlCompareMemory menyimpan surat-surat Mlwx, yang
mengingatkan kita pada pengemudi Mlwx486.sys.

kd> db f7c4d51a f7c4d51a 4d 00 6c 77 00 78 00 00-00 00 00 00 00 00 00 00 Mlwx ........


f7c4d52a 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00. ............... f7c4d53a 00 00 00 00 00
00 00 00-00 00 00 00 00 00 00 00 ................

Listing 10-13L: Meneliti argumen kedua untuk RtlCompareMemory

Panggilan untuk RtlCompareMemorymenentukan ukuran 8 byte, yang mewakili


empat karakter dalam string karakter lebar. Kode ini membandingkan setiap file untuk
melihat apakah itu dimulai dengan empat karakter Mlwx. Kami sekarang memiliki ide
yang cukup baik bahwa driver ini bersembunyi file yang dimulai dengan Mlwx.

menyembunyikan File
Setelah menemukan yang nama file PatchFunction akan beroperasi pada, kita
menganalisis bagaimana hal itu akan mengubah nilai-nilai kembalinya
NtQueryDirectoryFile. Memeriksa dokumentasi untukNtQueryDirectoryFile, Kita melihat
FileInformation struktur dengan serangkaian FILE_BOTH_DIR_INFORMATIONstruktur. Field
pertama diFILE_BOTH_DIR_INFORMATION Struktur adalah offset yang menunjuk ke depan
FILE_BOTH_DIR_INFORMATION. Seperti ditunjukkan dalam Gambar 10-2L,PatchFunction
memanipulasi bidang ini untuk menyembunyikan file tertentu dari daftar direktori
dengan memindahkan offset maju ke titik ke entri berikutnya jika entry ini memiliki
nama file diawali dengan Mlwx.
Gambar 10-2L menunjukkan apa nilai pengembalian
NtQueryDirectoryFileSepertinya untuk direktori yang berisi tiga file. ada
satuFILE_BOTH_DIR_INFORMATIONstruktur untuk setiap file. Biasanya, struktur pertama
akan menunjuk kedua, dan yang kedua akan menunjuk ke ketiga, tapi rootkit telah
diubah struktur sehingga pertama struktur poin ke posisi ketiga, dengan demikian
menyembunyikan struktur tengah. Trik ini memastikan bahwa setiap file yang
dimulai dengan Mlwx yang dilewati dan tersembunyi dari daftar direktori.

FILE_BOTH_DIR_INFORMATION

FILE_BOTH_DIR_INFORMATION

FILE_BOTH_DIR_INFORMATION

Gambar 10-2L: Serangkaian


FILE_BOTH_DIR_INFORMATION struktur yang dimodifikasi sehingga struktur tengah
disembunyikan

Memulihkan File Tersembunyi


Setelah mengidentifikasi program yang menyembunyikan file, kita dapat mencoba
untuk mendapatkan file asli yang digunakan oleh pengemudi dalam rangka untuk
melakukan analisis tambahan. Ada beberapa cara untuk melakukan ini:

1. Menonaktifkan layanan yang dimulai pengemudi dan reboot. Ketika Anda reboot,
kode tersebut tidak akan berjalan dan file tidak akan tersembunyi.
2. Ekstrak file dari bagian sumber daya dari file executable yang diinstal itu.
3. Mengakses file meskipun itu tidak tersedia di daftar direktori. Hook
keNtQueryDirectoryFilemencegah file dari yang ditampilkan dalam daftar direktori,
tapi file masih ada. Misalnya, Anda bisa menyalin file menggunakan perintah
DOScopy Mlwx486.sys NewFilename.sys. File NewFilename.sys tidak akan
tersembunyi.

Semua pilihan ini cukup sederhana, tetapi yang pertama adalah yang terbaik
karena menonaktifkan pengemudi. Dengan sopir dinonaktifkan, Anda harus mencari
sistem anda untuk file yang dimulai dengan Mlwx dalam kasus ada file lain yang
tersembunyi oleh driver Mlwx486.sys. (Tidak ada satu pun dalam kasus ini.)
Mlwx486.sys membuka di IDA Pro, kita melihat bahwa sangat kecil, jadi kita
harus menganalisis semua itu memastikan bahwa pengemudi tidak melakukan apa
pun yang kita tidak sadar. Kami melihat bahwaDriverEntry panggilan rutin
RtlInitUnicodeString dengan KeServiceDescriptorTable dan NtQueryDirectoryFile, Dan
kemudian memanggil MmGetSystemRoutineAddressuntuk menemukan offset bagi
mereka dua alamat. Hal berikutnya mencari masuk dalam SSDT
untukNtQueryDirectoryFile dan menimpa yang masuk dengan alamat PatchFunction. Tidak
menciptakan perangkat, dan tidak menambahkan penangan fungsi untuk objek driver.

Lab 10-3 Solusi

Jawaban pendek
1. Program user-space load driver dan kemudian muncul iklan setiap 30 detik. Sopir
menyembunyikan proses dengan membatalkan tautan Proses Lingkungan Block
(PEB) dari sistem linked list.
2. Setelah program ini berjalan, tidak ada cara mudah untuk menghentikannya tanpa
reboot.
3. Komponen kernel merespon setiap DeviceIoControl permintaan dengan membatalkan
tautan proses yang membuat permintaan dari linked list dari proses untuk
menyembunyikan proses dari pengguna.

Analisis rinci
Kita mulai dengan beberapa analisis statis dasar pada file. Ketika kita menganalisis file
driver, kita melihat impor berikut:

IofCompleteRequest
IoDeleteDevice
IoDeleteSymbolicLink
RtlInitUnicodeString
IoGetCurrentProcess
IoCreateSymbolicLink
IoCreateDevice
KeTickCount

Impor untuk IoGetCurrentProcessadalah satu-satunya yang menyediakan banyak


informasi. (The impor lainnya hanya dibutuhkan oleh setiap driver yang menciptakan
sebuah perangkat yang dapat diakses dari ruang pengguna.) Panggilan
untukIoGetCurrentProcess memberitahu kita bahwa driver ini baik memodifikasi proses
yang berjalan atau membutuhkan informasi tentang hal itu.
Berikutnya, kita salin file driver ke C: \ Windows \ System32 dan double-klik
executable untuk menjalankannya. Kami melihat iklan pop-up, yang sama dengan
yang ada di Lab 7-2. Kami sekarang memeriksa apa yang terjadi pada sistem kami.
Pertama, kita periksa untuk melihat apakah layanan ini berhasil diinstal dan
memverifikasi bahwa berbahaya berkas Sys digunakan sebagai bagian dari layanan.
Secara bersamaan, kami melihat bahwa setelah sekitar 30 detik, program muncul
iklan lagi dan melakukannya sekitar sekali setiap 30 detik. Membuka Task Manager
dalam upaya untuk mengakhiri program ini, kami melihat bahwa program ini tidak
terdaftar. Dan itu tidak tercantum dalam Process Explorer baik.
Program ini terus membuka iklan, dan tidak ada cara mudah untuk
menghentikannya. Ini tidak dalam proses daftar, jadi kita tidak bisa menghentikannya
dengan membunuh proses. Kita juga tidak dapat melampirkan debugger untuk proses
karena program ini tidak muncul dalam proses daftar untuk WinDbg atau OllyDbg.
Pada titik ini, satu-satunya pilihan kami adalah untuk kembali ke snapshot terbaru
kami atau reboot dan berharap bahwa program ini tidak terus-menerus. Ini tidak, jadi
reboot berhenti itu.

Menganalisis Executable di IDA Pro


Sekarang untuk IDA Pro. navigasi kewinMain dan memeriksa fungsi panggilan, kita
lihat berikut:

OpenSCManager
CreateService
Memulai layanan
CloseServiceHandle
CreateFile
DeviceIoControl
OleInitialize
CoCreateInstance
VariantInit SysAllocString ecx
+ 0x2c

winMaindapat secara logis dibagi menjadi dua bagian. Bagian pertama, yang
terdiri dariOpenSCManager melalui DeviceIoControl, Termasuk fungsi untuk memuat
dan mengirim permintaan untuk driver kernel. Bagian kedua terdiri dari fungsi-
fungsi yang tersisa, yang menunjukkan penggunaan objek COM. Pada titik ini, kita
tidak tahu target panggilan untukecx + 0x2c, Tapi kami akan kembali ke nanti.
Melihat panggilan dalam detail, kita melihat bahwa program menciptakan
layanan yang disebut Proses Helper, yang memuat driver kernel C: \ Windows \
System32 \ Lab10-03.sys. Kemudian mulai layanan Helper Proses, yang beban
Lab10-03.sys dalam kernel dan membuka pegangan untuk \\. \ ProcHelper, yang
membuka pegangan ke perangkat kernel yang diciptakan oleh driver ProcHelper.
Kita perlu melihat hati-hati pada panggilan untuk DeviceIoControl, Ditunjukkan
pada Listing 10-14L, karena parameter input dan output lulus sebagai argumen
untuk itu akan dikirim ke kode kernel, yang kita perlu menganalisa secara terpisah.

0040108C lea ecx, [esp + 2Taw + BytesReturned]


00401090 mendorong 0; lpOverlapped
00401092 mendorong ecx; lpBytesReturned
00401093 mendorong 0; nOutBufferSize
00401095 mendorong 0; lpOutBuffer
00401097 mendorong 0; nInBufferSize
00401099 mendorong 0; lpInBuffer
0040109B mendorong 0ABCDEF01h; dwIoControlCode 004010A0 mendorong eax; hDevice
004010A1 panggilan ds: DeviceIoControl
Listing 10-14L: Panggilan untuk DeviceIoControl di Lab10-03.exe untuk lulus permintaan untuk driver
Lab10-03.sys

Perhatikan bahwa panggilan untuk DeviceIoControl memiliki lpOutBuffer di  dan


lpInBuffer di set ke NULL. Hal ini tidak biasa, dan itu berarti bahwa permintaan ini
mengirimkan tidak ada informasi untuk driver kernel dan driver kernel mengirimkan
tidak ada informasi kembali. Juga perhatikan bahwadwIoControlCode dari 0xABCDEF01
di diteruskan ke driver kernel. Kami akan kembali ini ketika kita melihat driver
kernel.
Sisa file ini hampir identik dengan contoh COM di Lab 7-2, kecuali bahwa
panggilan ke fungsi navigasi di dalam sebuah loop yang berjalan terus menerus dan
tidur selama 30 detik antara setiap panggilan.

Menganalisis Driver
Berikutnya, kita membuka file kernel dengan IDA Pro. Seperti ditunjukkan pada Listing
10-15L, kita melihat bahwa itu panggilanIoCreateDevice di  untuk menciptakan sebuah
perangkat bernama \ Device \ ProcHelper di .

0001071A push diimbangi aDeviceProchelp; "\\ Perangkat \\ ProcHelper"


0001071F lea eax, [EBP + var_C]
00010722 mendorong eax
00010723 panggilan edi; RtlInitUnicodeString
00010725 mov esi, [EBP + ARG_0]
00010728 lea eax, [EBP + VAR_4]
0001072B mendorong eax
0001072C mendorong 0
0001072E mendorong 100h
00010733 mendorong 22h
00010735 lea eax, [EBP + var_C]
00010738 mendorong eax
00010739 mendorong 0
0001073B mendorong esi
0001073C call ds: IoCreateDevice

Listing 10-15L: Lab10-03.sys menciptakan sebuah perangkat yang dapat diakses dari ruang pengguna

Seperti ditunjukkan pada Listing 10-16L, fungsi kemudian memanggil


IoCreateSymbolicLink di  untuk membuat symbolic link bernama \ DosDevices \
ProcHelper di  untuk program userspace untuk mengakses.

00010751 push diimbangi aDosdevicesPr_0; "\\ DosDevices \\ ProcHelper"


00010756 lea eax, [EBP + var_14]
00010759 mendorong eax
0001075A mov dword ptr [esi + 70h], offset loc_10666
00010761 mov dword ptr [esi + 34h], offset loc_1062A
00010768 panggilan edi; RtlInitUnicodeString
0001076A lea eax, [EBP + var_C]
0001076D mendorong eax
0001076E lea eax, [EBP + var_14]
00010771 mendorong eax
00010772 call ds: IoCreateSymbolicLink

Listing 10-16L: Lab10-03.sys menciptakan link simbolik untuk membuatnya lebih mudah untuk aplikasi
user-ruang untuk mengakses pegangan untuk perangkat
Menemukan Driver di Memory dengan WinDbg
Kami dapat menjalankan malware atau hanya memulai layanan untuk memuat driver
kernel kami ke dalam memori. Kita tahu bahwa objek perangkat di\ Device \ ProcHelper,
Jadi kita mulai dengan itu. Dalam rangka untuk mencari fungsi diProcHelper yang
dieksekusi, kita harus menemukan objek driver, yang dapat dilakukan dengan !
devobjperintah, seperti yang ditunjukkan pada Listing 10-17L. Output dari! devobj
memberitahu kita di mana DriverObject di  tersimpan.

kd> ! Devobj ProcHelper


objek perangkat (82af64d0) adalah untuk:
ProcHelper \ driver \ Process Helper DriverObject 82716a98
IRP saat 00000000 refcount 1 Jenis 00.000.022 Flags 00.000.040
DACL e15b15cc DevExt 00000000 DevObjExt 82af6588
ExtensionFlags (0000000000) antrian
Perangkat tidak sibuk.

Listing 10-17L: Menemukan objek perangkat untuk ProcHelper sopir


10
Itu DriverObjectmengandung pointer ke semua fungsi yang akan dipanggil saat
program user-space mengakses objek perangkat. ItuDriverObject disimpan dalam
struktur data yang disebut DRIVER_OBJECT. Kita dapat menggunakandt perintah untuk
melihat objek driver dengan label, seperti ditunjukkan pada Listing 10-18L.

! Kd> dt nt _DRIVER_OBJECT 82716a98 + 0x000


Jenis: 4
+ 0x002 Ukuran: 168
+ 0x004 DeviceObject: 0x82af64d0 _DEVICE_OBJECT
+ 0x008 Flags: 0x12
+ 0x00c DriverStart: 0xf7c26000 + 0x010 DriverSize:
0xe00
+ 0x014 DriverSection: 0x827bd598
+ 0x018 DriverExtension: 0x82716b40 _DRIVER_EXTENSION
+ 0x01c DriverName: _UNICODE_STRING "\ driver \ Process Helper"
+ 0x024 HardwareDatabase: 0x80670ae0 _UNICODE_STRING "\ Registry \ MACHINE \
HARDWARE \ DESCRIPTION \ SYSTEM"
+ 0x028 FastIoDispatch: (null)
+ 0x02c DriverInit: 0xf7c267cd panjang 0 + 0x030 DriverStartIo: (null)
+ 0x034 DriverUnload: 0xf7c2662a kekosongan 0
+ 0x038 MajorFunction: [28] 0xf7c26606 panjang 0

Listing 10-18L: Meneliti objek driver Lab10-03.sys menggunakan WinDbg

Kode ini berisi beberapa pointer fungsi catatan. Ini termasuk


DriverInit, yang DriverEntry rutin kami menganalisis di IDA Pro, dan DriverUnload, Yang
disebut ketika driver ini dibongkar. Ketika kita melihatDriverUnload di IDA Pro, kita
melihat bahwa ia menghapus link simbolik dan perangkat yang diciptakan oleh
DriverEntry program.
Menganalisis Fungsi utama Fungsi Table
Berikutnya, kami memeriksa tabel fungsi utama, yang sering di mana kode driver
yang paling menarik diimplementasikan. Windows XP memungkinkan 0x1C
mungkin kode fungsi utama, jadi kami melihat entri dalam tabel fungsi utama
menggunakanDD perintah:

kd> dd 82716a98 + 0x38 L1C


82716ad0 f7c26606 804f354a f7c26606 804f354a
82716ae0 804f354a 804f354a 804f354a 804f354a
82716af0 804f354a 804f354a 804f354a 804f354a
82716b00 804f354a 804f354a f7c26666 804f354a
82716b10 804f354a 804f354a 804f354a 804f354a
82716b20 804f354a 804f354a 804f354a 804f354a
82716b30 804f354a 804f354a 804f354a 804f354a

Setiap entri dalam tabel mewakili berbagai jenis permintaan bahwa pengemudi
dapat menangani, tapi seperti yang Anda lihat, sebagian besar entri dalam tabel adalah
untuk fungsi yang sama di 0X804F354A. Semua entri dalam tabel dengan nilai
0X804F354A merupakan jenis permintaan bahwa pengemudi tidak menangani.
Untuk memverifikasi ini, kita perlu mencari tahu apa fungsi yang melakukan. Kita
bisa melihat pembongkaran, tetapi karena fungsi Windows, namanya harus
memberitahu kami apa yang dilakukannya, seperti yang ditunjukkan di sini:

kd> ln 804f354a
(804f354a) nt IopInvalidDeviceRequest! | (804f3580)
nt! IopGetDeviceAttachmentBase
pertandingan yang sebenarnya:! nt IopInvalidDeviceRequest = <tidak
ada informasi jenis>

Fungsi di 0X804F354A bernama IopInvalidDeviceRequest, Yang berarti bahwa itu


menangani permintaan yang tidak valid yang driver ini tidak menangani. Fungsi yang
tersisa dari meja fungsi utama di offset 0, 2, dan 0xE mengandung fungsi yang kita
tertarik. Meneliti wdm.h, kami menemukan bahwa offset 0, 2, dan 0xE menyimpan
fungsi untukMembuat. Dekat, dan DeviceIoControl fungsi.
Pertama, kita melihat Membuat dan Dekatfungsi di offset 0 dan 2 dalam tabel fungsi
utama. Kami melihat bahwa kedua entri dalam utama titik fungsi meja untuk fungsi
yang sama (0xF7C26606). Melihat fungsi itu, kita melihat bahwa itu hanya
panggilanIofCompleteRequestdan kemudian kembali. Ini memberitahu OS bahwa
permintaan itu sukses, tapi tidak ada yang lain. Fungsi-satunya yang tersisa di meja
fungsi utama adalah salah satu yang menanganiDeviceIoControl permintaan, yang paling
menarik.
Melihat ke DeviceIoControl fungsi, kita melihat bahwa itu memanipulasi
PEB dari proses saat ini. Daftar 10-19L menunjukkan kode yang menanganiDeviceIoControl.

00010666 mov edi, edi


00010668 mendorong EBP
00010669 mov EBP, esp
0001066B panggilan ds: IoGetCurrentProcess
00010671 mov ecx, [eax + 8Ch]
00010677 add eax, 88h
0001067C mov edx, [eax]
0001067E mov [ecx], edx
00010680 mov ecx, [eax]
00010682 mov eax, [eax + 4] 00.010.685 mov [ecx + 4], eax
00010688 mov ecx, [EBP + IRP]; IRP
0001068B dan dword ptr [ecx + 18h], 0
0001068F dan dword ptr [ecx + 1Taw], 0
00010693 xor dl, dl; PriorityBoost
00010695 panggilan ds: IofCompleteRequest
0001069B XOR eax, eax
0001069D pop EBP
0001069E retn 8

Listing 10-19L: The kode driver yang menangani DeviceIoControl Permintaan


Hal pertama yang DeviceIoControl Fungsi dilakukannya adalah panggilan IoGetCurrentProcess
10 di , Yang mengembalikan EPROCESS struktur dari proses yang mengeluarkan panggilan
untuk DeviceIoControl. Fungsi kemudian mengakses data di offset 0x88 di, Dan kemudian
mengakses berikutnya DWORD pada offset 0x8C di .
Kami menggunakan dt perintah untuk menemukan bahwa LIST_ENTRY disimpan di
offset 0x88 dan 0x8C dalam struktur PEB, seperti ditunjukkan pada Listing 10-20L di
.

kd> dt nt! _EPROCESS


+ 0x000 Pcb: _KPROCESS
+ 0x06c ProcessLock: _EX_PUSH_LOCK
+ 0x070 CreateTime: _LARGE_INTEGER
+ 0x078 ExitTime: _LARGE_INTEGER
+ 0x080 RundownProtect: _EX_RUNDOWN_REF
+ 0x084 UniqueProcessId: Ptr32 Void

+ 0x090 QuotaUsage: [3] Uint4B
+ 0x09c QuotaPeak: [3] Uint4B ...

Listing 10-20L: Meneliti EPROCESS struktur dengan WinDbg

Sekarang kita tahu bahwa fungsi sedang mengakses LIST_ENTRY struktur, kita
melihat secara dekat bagaimana LIST_ENTRYsedang diakses. ItuLIST_ENTRY Struktur
adalah daftar ganda terkait dengan dua nilai: yang pertama adalah BERKEDIP, Yang
menunjuk ke entri sebelumnya dalam daftar, dan yang kedua adalah FLINK, Yang
menunjuk ke entri berikutnya dalam daftar. Kita melihat bahwa itu tidak hanya
membacaLIST_ENTRY struktur, tetapi juga mengubah struktur, seperti ditunjukkan pada
Listing 10-21L.

00010671 
00010677 add eax, 88h
0001067C 
0001067E 
00010680 
00010682 
00010685 

Listing 10-21L: DeviceIoControl kode yang mengubah EPROCESS struktur

Instruksi di memperoleh pointer ke entri berikutnya dalam daftar. Instruksi


dimemperoleh pointer ke entri sebelumnya dalam daftar. Instruksi di menimpa
BERKEDIPpointer dari entri berikutnya sehingga menunjuk ke entri sebelumnya.
Sebelum, yang BERKEDIPpointer dari entri berikutnya menunjuk ke entry ini. Instruksi
di menimpa BERKEDIPpointer sehingga melompati proses saat ini. Petunjuk di. ,
dan  melakukan langkah-langkah yang sama, kecuali untuk menimpa FLINK pointer
dari entri sebelumnya dalam daftar untuk melewati entry ini.
Daripada mengubah EPROCESS struktur dari proses saat ini, kode pada Listing 10-
21L perubahan EPROCESSstruktur dari proses di depannya dan di belakangnya dalam
linked list dari proses. Keenam petunjuk menyembunyikan proses saat ini dengan
membatalkan tautan dari linked list dari proses dimuat,
Gambar 10-3L: Sebuah proses yang dihapus dari daftar proses sehingga tersembunyi dari alat-alat
seperti Task Manager

Ketika OS berjalan normal, setiap proses memiliki pointer ke proses sebelum dan
setelah. Namun, pada Gambar 10-3L, Proses 2 telah disembunyikan oleh rootkit ini.
Ketika iterates OS selama linked list dari proses, proses tersembunyi selalu dilewati.
Anda mungkin bertanya-tanya bagaimana proses ini terus berjalan tanpa
masalah, meskipun itu tidak ada dalam daftar OS proses. Untuk menjawab ini, ingat
bahwa proses hanyalah sebuah wadah untuk berbagai benang untuk menjalankan
dalam. Benang dijadwalkan untuk mengeksekusi pada CPU. Selama benang masih
benar dicatat oleh OS, mereka akan dijadwalkan, dan proses akan terus berjalan
seperti biasa.

Lab 11-1 Solusi

Jawaban pendek
1. Ekstrak malware dan menjatuhkan msgina32.dll berkas ke disk dari bagian
sumber daya bernama TGAD.
2. malware menginstal msgina32.dll sebagai GINA DLL dengan menambahkannya
ke lokasi registri HKLM \ SOFTWARE \ CurrentVersion \ Winlogon Microsoft \ Windows NT \
\ GinaDLL, Yang menyebabkan DLL akan dimuat setelah sistem reboot.
3. malware mencuri kredensial pengguna dengan melakukan GINA intersepsi. File
msgina32.dll mampu mencegat semua kredensial pengguna dikirim ke sistem
untuk otentikasi.
4. The malware kayu curian mandat untuk% SystemRoot% \ System32 \
msutil32.sys. Username, domain, dan password login ke file dengan catatan
waktu.
5. Setelah malware dijatuhkan dan diinstal, harus ada reboot sistem untuk GINA
intersepsi untuk memulai. The malware log kredensial hanya ketika pengguna log
keluar, sehingga log out dan kembali untuk melihat kredensial Anda dalam file
log.

Analisis rinci
Dimulai dengan analisis statis dasar, kita melihat string GinaDLL dan PERANGKAT LUNAK\
\ Winlogon Microsoft \ Windows NT \ CurrentVersion, Yang membawa kita untuk menduga
bahwa ini mungkin GINA intersepsi malware. Meneliti impor, kita melihat fungsi
untuk memanipulasi registri dan penggalian bagian sumber daya. Karena kita melihat
sumber daya fungsi ekstraksi impor, kami memeriksa struktur file dengan
Gambar 11-1L: Lab11-01.exe di PEview menunjukkan bagian sumber daya TGAD

Memeriksa format file PE, kita melihat bagian sumber daya bernama TGAD.
Ketika kita klik bagian tersebut di PEview, kita melihat bahwaTGAD berisi file PE
tertanam.
Berikutnya, kita melakukan analisis dinamis dan memantau malware dengan
ProcMon dengan menetapkan filter untuk Lab11-01.exe. Ketika kami meluncurkan
malware, kita melihat bahwa hal itu menciptakan sebuah file bernama msgina32.dll
pada disk dalam direktori yang sama dari mana malware diluncurkan. malware
menyisipkan path ke msgina32.dll ke kunci registriHKLM \ SOFTWARE \ CurrentVersion \
Winlogon Microsoft \ Windows NT \ \ GinaDLL, Sehingga DLL akan dimuat oleh Winlogon

ketika sistem reboot.


Ekstrak TGAD bagian sumber daya dari Lab11-01.exe (menggunakan Resource Hacker)
dan membandingkannya dengan msgina32.dll, kita menemukan bahwa keduanya identik.
Berikutnya, kami memuat Lab11-01.exe ke IDA Pro untuk mengkonfirmasi
temuan kami. Kami melihat bahwautama fungsi panggilan dua fungsi: sub_401080
(Ekstrak TGAD bagian sumber daya untuk msgina32.dll) dan sub_401000(Set nilai
registri GINA). Kami menyimpulkan bahwa Lab11-01.exe adalah installer untuk
msgina32.dll, yang dimuat oleh Winlogon selama sistem startup.

Analisis msgina32.dll
Kami akan memulai analisis kami msgina32.dll dengan melihat output String, seperti
ditunjukkan pada Listing 11-1L.

GinaDLL
Software \ CurrentVersion \ Winlogon Microsoft \ Windows NT \
MSGina.dll
PBB% s DM% s PW% s OLD% s msutil32.sys

Listing 11-1L: Strings output msgina32.dll

String dalam daftar ini berisi apa yang tampaknya menjadi pesan log di , Yang
dapat digunakan untuk login kredensial pengguna jika ini adalah GINA intersepsi
malware. stringmsutil32.sys menarik, dan kami akan menentukan signifikansi nanti di lab.
Meneliti ekspor msgina32.dll, kita melihat banyak fungsi yang dimulai dengan
awalan WLX. Ingat dari Bab 11 yang GINA intersepsi malware harus berisi semua ekspor
DLL ini karena mereka diwajibkan oleh GINA. Kami akan menganalisis masing-masing
fungsi di IDA Pro.
Kita mulai dengan memuat malware ke IDA Pro dan menganalisis DllMain, Seperti
ditunjukkan pada Listing 11-2L.

1000105A CMP eax, DLL_PROCESS_ATTACH 1000105D JNZ


loc_100010B7 singkat ...
1000107E panggilan ds: GetSystemDirectoryW
10001084 lea ecx, [esp + 20Ch + LibFileName]
10001088 mendorong diimbangi String2; "\\ MSGINA"
1000108D mendorong ecx; lpString1
1000108E panggilan ds: lstrcatW
10001094 lea edx, [esp + 20Ch + LibFileName]
10001098 mendorong edx; lpLibFileName
10001099 sebut ds: LoadLibraryW
1000109F xor ecx, ecx
100010A1 mov hModule, eax

Listing 11-2L: DllMain dari msgina32.dll mendapatkan pegangan untuk msgina.dll

Seperti ditunjukkan dalam Listing 11-2L, DllMain cek pertama fdwReason


argumen di . Ini adalah argumen berlalu dalam untuk menunjukkan mengapa fungsi
entry-titik DLL sedang disebut. Pemeriksaan malware untukDLL_PROCESS_ATTACH,
Yang disebut ketika proses memulai atau ketika LoadLibrarydigunakan untuk memuat
DLL. Jika tertentuDllMain disebut selama DLL_PROCESS_ATTACH, Kode dimulai pada
disebut. Kode ini mendapat pegangan untuk msgina.dll di direktori sistem Windows
melalui panggilan keLoadLibraryW di .
CATATAN msgina.dll adalah DLL Windows yang mengimplementasikan GINA, sedangkan
msgina32.dll adalah penulis malware ini GINA intersepsi DLL. Nama msgina32 dirancang
untuk menipu.
malware menyimpan pegangan dalam variabel global yang IDA Pro telah bernama
hModule di . Penggunaan variabel ini memungkinkan ekspor DLL untuk benar memanggil
fungsi-fungsi di msgina.dll DLL Windows. Sejak msgina32.dll mencegat komunikasi antara
Winlogon dan msgina.dll, itu harus benar memanggil fungsi dalam msgina.dll sehingga
sistem akan terus beroperasi secara normal.
Berikutnya, kita menganalisa setiap fungsi ekspor. Kita mulai denganWlxLoggedOnSAS,
Seperti ditunjukkan pada Listing 11-3L.

10001350 WlxLoggedOnSAS proc dekat


10001350 mendorong diimbangi aWlxloggedons_0; "WlxLoggedOnSAS"
10001355 sub_10001000 panggilan
1000135A jmp eax

Listing 11-3L: WlxLoggedOnSAS ekspor hanya lewat untuk msgina.dll

Itu WlxLoggedOnSAS ekspor pendek dan hanya melewati ke benar WlxLoggedOnSASterkandung


dalam msgina.dll. Sekarang ada duaWlxLoggedOnSASfungsi: versi di Listing 11-3L di
msgina32.dll dan asli dalam msgina.dll. Fungsi di Listing 11-3L dimulai dengan melewati
stringWlxLoggedOnSAS untuk sub_10001000dan kemudian melompat ke hasilnya. Itusub_10001000
fungsi menggunakan hModule menangani (untuk msgina.dll) dan string lulus di (dalam hal ini,
WlxLoggedOnSAS) menggunakan GetProcAddress untuk menyelesaikan fungsi di msgina.dll.
malware tidak memanggil fungsi; itu hanya menyelesaikan alamatWlxLoggedOnSAS di
msgina.dll dan melompat ke fungsi, seperti yang terlihat pada . Dengan melompat
dan tidak meneleponWlxLoggedOnSAS, Kode ini tidak akan mendirikan sebuah stack
frame atau mendorong alamat pengirim ke stack. KapanWlxLoggedOnSAS di msgina.dll
disebut, itu akan kembali eksekusi langsung ke Winlogon karena alamat pengirim di
stack adalah sama dengan apa yang ada di stack ketika kode pada Listing 11-3L
disebut.
Jika kita terus menganalisis ekspor lain, kita melihat bahwa sebagian besar
beroperasi seperti WlxLoggedOnSAS (Mereka adalah pass-through fungsi), kecuali untuk
WlxLoggedOutSAS, Yang berisi beberapa kode tambahan. (WlxLoggedOutSAS disebut ketika
pengguna log keluar dari sistem.)
ekspor dimulai dengan memecahkan WlxLoggedOutSAS dalam msgina.dll
menggunakan GetProcAddressdan kemudian menyebutnya. ekspor juga berisi kode
yang ditunjukkan pada Listing 11-4L.

100014FC mendorong diimbangi aUnSDmSPwSOldS ; "UN% s DM% s PW% s OLD% s"


10001501 mendorong 0; dwMessageId
10001503 panggilan sub_10001570

Listing 11-4L: WlxLoggedOutSAS memanggil fungsi logging credential sub_10001570

Kode pada Listing 11-4L melewati sekelompok argumen dan format string di .
String ini akan diteruskan kesub_10001570, Yang disebut di .
Sepertinya sub_10001570mungkin fungsi logging untuk kredensial dicuri, jadi mari
kita memeriksanya untuk melihat apa yang dilakukannya. Daftar 11-5L menunjukkan
kode logging yang terkandung dalamsub_10001570.

1000158E panggilan _vsnwprintf


10001593 mendorong mengimbangi mode; Mode
10001598 mendorong diimbangi Nama file; "Msutil32.sys"
1000159D panggilan _wfopen
100015A2 mov esi, eax
100015A4 add esp, 18h
100015A7 tes esi, esi
100015A9 jz loc_1000164F
100015AF lea eax, [esp + 858h + Dest]
100015B3 mendorong edi
100015B4 lea ecx, [esp + 85Ch + Buffer]
100015B8 mendorong eax
100015B9 mendorong ecx; Penyangga
100015BA memanggil _wstrtime
100015BF add esp, 4
100015C2 lea edx, [esp + 860h + var_828]
100015C6 mendorong eax
100015C7 mendorong edx; Penyangga
100015C8 panggilan _wstrdate
100015CD add esp, 4
100015D0 mendorong eax
100015D1 mendorong diimbangi Format; "% S% s -% s"
100015D6 mendorong esi; Mengajukan
100015D7 panggilan fwprintf

Listing 11-5L: Fungsi credential-logging penebangan ke msutil32.sys

Panggilan untuk vsnwprintf di  mengisi format string disahkan pada oleh


WlxLoggedOutSASekspor. Berikutnya, malware membuka msutil32.sys file pada,
Yang dibuat di dalam C: \ Windows \ System32 \ karena itu adalah tempat Winlogon
tinggal (dan msgina32.dll berjalan dalam proses Winlogon). Di dan , Tanggal dan
waktu dicatat, dan informasi yang dicatat di . Anda sekarang harus menyadari
bahwa msutil32.sys digunakan untuk menyimpan kredensial login dan bahwa itu
bukan sopir, meskipun namanya bahwa itu adalah.
Kami memaksa malware untuk login kredensial dengan menjalankan Lab11-
01.exe, reboot mesin, dan kemudian login dan keluar dari sistem. Berikut ini adalah
contoh dari data yang terdapat dalam file log yang dibuat oleh malware ini:

09/10/11 15:00:04 - pengguna PBB DM MALWAREVM PW test123 OLD (null)


09/10/11 23:09:44 - hacker PBB DM MALWAREVM PW p @ ssword OLD (null)

Nama pengguna yang pemakai dan hacker, Password mereka test123 dan p @ ssword,
Dan domain adalah MALWAREVM.
Ringkasan
Lab 11-1 adalah interceptor installer GINA. malware menjatuhkan DLL pada sistem
dan menginstalnya untuk mencuri kredensial pengguna, dimulai setelah sistem reboot.
Setelah GINA interceptor DLL diinstal dan berjalan, log mandat untuk msutil32.sys
ketika pengguna log keluar dari sistem.

Lab 11-2 Solusi

Jawaban pendek
1. Lab11-02.dll berisi satu ekspor, bernama pemasang.
2. Jika Anda menjalankan malware dari baris perintah dengan menggunakan rundll32.exe
Lab11-02.dll, installer, Salinan malware dirinya ke direktori sistem Windows sebagai
spoolvxx32.dll dan menginstal sendiri terus-menerus di bawah AppInit_DLLs. malware
juga mencoba untuk membuka Lab11-02.ini dari direktori sistem Windows, tetapi tidak
menemukannya di sana.
3. Lab11-02.ini harus berada di% SystemRoot% \ System32 \ agar malware untuk berjalan
dengan baik.
4. malware menginstal sendiri dalam AppInit_DLLs nilai registri, yang menyebabkan
malware yang akan dimuat ke setiap proses yang juga memuat User32.dll.
5. malware ini menginstal hook inline dari Kirim fungsi.
6. Hook memeriksa apakah paket keluar adalah pesan email yang berisi RCPT TO:, Dan jika
string ini ditemukan, ia menambahkan tambahan RCPT TO baris yang berisi account email
berbahaya.
7. Target malware hanya Msimn.Exe, THEBAT.exe, dan outlook.exe karena semua adalah
klien email. malware tidak menginstal hook kecuali sedang berjalan di dalam salah satu
dari proses-proses ini.
8. File INI berisi alamat email terenkripsi. Setelah mendekripsi Lab11-02.ini, kita melihat
mengandung billy@malwareanalysisbook.com.
9. Lihat “Menangkap Lalu Lintas Jaringan” pada halaman 580 untuk metode kami
menangkap data menggunakan Wireshark, mail server palsu, dan Outlook Express.

Analisis rinci
Kita mulai dengan analisis statis dasar Lab11-02.dll. DLL hanya memiliki satu
ekspor, bernamapemasang. malware berisi impor untuk memanipulasi registri
(RegSetValueEx), Mengubah sistem file (CopyFile), Dan mencari melalui proses atau
benang daftar (CreateToolhelp32Snapshot). String yang menarik untuk Lab11-02.dll
ditunjukkan pada Listing 11-6L.

RCPT TO: <


THEBAT.EXE
Outlook.exe
Msimn.Exe
mengirim
wsock32.dll
SOFTWARE \ AppInit_DLLs Microsoft \ Windows NT \
CurrentVersion \ Windows spoolvxx32.dll
\ Lab11-02.ini

Listing 11-6L: string menarik di Lab11-02.dll

string AppInit_DLLs dan SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows


menunjukkan bahwa malware mungkin menggunakan AppInit_DLLsuntuk menginstal
sendiri untuk ketekunan. string\ Lab11-02.ini menunjukkan bahwa malware menggunakan
file INI yang disediakan di laboratorium ini.
Memeriksa isi Lab11-02.ini, kita melihat bahwa tampaknya berisi data dikodekan
atau dienkripsi. ItuKirim dan wsock32.dllstring mungkin menunjukkan bahwa malware
menggunakan fungsi jaringan, tapi itu tidak jelas sampai kita menggali lebih dalam.
Nama-nama proses (outlook.exe. Msimn.Exe, dan THEBAT.EXE) Adalah klien email, dan
menggabungkan mereka string dengan RCPT TO: menuntun kita untuk menduga bahwa
malware ini melakukan sesuatu dengan email.

CATATANRCPT adalah perintah SMTP untuk membangun penerima untuk pesan email.

Berikutnya, kita menggunakan alat dinamis dasar seperti ProcMon untuk memantau
malware. Kita mulai dengan mencoba untuk menginstal malware
menggunakanpemasang ekspor dengan perintah berikut:

Dalam ProcMon, kita menetapkan filter untuk rundll32.exe proses, dan melihat
malware membuat file bernama spoolvxx32.dll di direktori sistem Windows. Setelah
pemeriksaan lebih lanjut, kita melihat bahwa file ini identik dengan Lab11-02.dll.
Selanjutnya dalam ProcMon daftar, kita melihat malware menambahkan
spoolvxx32.dll ke daftarAppInit_DLLs(Menyebabkan malware yang akan dimuat ke
setiap proses yang memuat User32.dll). Akhirnya, kita melihat bahwa malware
mencoba untuk membuka Lab1102.ini dari direktori sistem Windows. Oleh karena
itu, kita harus menyalin
file INI ke direktori sistem Windows agar malware untuk mengaksesnya.
Kami bergerak analisis kami untuk IDA Pro untuk melihat lebih dalam ke malware.
Kita mulai dengan menganalisispemasangekspor. Sebuah grafik-referensi silang
daripemasang ditunjukkan pada Gambar 11-2L.

Gambar 11-2L: grafik Cross-referensi dari pemasang ekspor

Seperti yang Anda lihat, pemasangmenetapkan nilai dalam registri dan salinan file
ke direktori sistem Windows. Ini sesuai dengan apa yang kita lihat selama analisis
dinamis dan dikonfirmasi di pembongkaran. Itupemasang -satunya tujuan fungsi adalah
untuk menyalin malware untuk spoolvxx32.dll dan mengaturnya sebagai AppInit_DLLs
nilai.
Dalam Listing 11-7L, kami fokus pada DllMain, Yang dimulai dengan memeriksa
DLL_PROCESS_ATTACH, Seperti dengan lab sebelumnya. Tampaknya malware ini hanya
berjalan selamaDLL_PROCESS_ATTACH; jika tidak,DllMain kembali tanpa melakukan hal
lain.

1000161E CMP [EBP + fdwReason], DLL_PROCESS_ATTACH ...


10001651 panggilan _GetWindowsSystemDirectory
10001656 mov [EBP + lpFileName], eax
10001659 mendorong 104H; Menghitung
1000165E mendorong diimbangi aLab1102_ini; \\ Lab11-02.ini
10001663 mov edx, [EBP + lpFileName]
10001666 mendorong edx; dest
10001667 sebut strncat
1000166C add esp, 0Ch
1000166F mendorong 0; hTemplateFile
10001671 mendorong FILE_ATTRIBUTE_NORMAL; dwFlagsAndAttributes
10001676 mendorong OPEN_EXISTING; dwCreationDisposition
10001678 mendorong 0; lpSecurityAttributes
1000167A mendorong FILE_SHARE_READ; dwShareMode
1000167C mendorong GENERIC_READ; dwDesiredAccess
10001681 mov eax, [EBP + lpFileName]
10001684 mendorong eax; lpFileName
10001685 ds panggilan: CreateFileA

Listing 11-7L: Kode di DllMain yang mencoba untuk membuka Lab11-02.ini dari direktori sistem

Pada Listing 11-7L di , Kita melihat direktori sistem Windows diambil, serta
string untuk Lab11-02.ini di . Bersama-sama, membentuk jalur denganstrncat di .
malware mencoba untuk membuka file INI untuk membaca di. Jika file tidak dapat
dibuka,DllMain pengembalian.
Jika malware berhasil membuka file INI, membaca file ke dalam buffer global,
seperti ditunjukkan pada Listing 11-8L di .

100016A6 mendorong diimbangi byte_100034A0 ; lpBuffer


100016AB mov edx, [EBP + hObject]
100016AE mendorong edx; hFile
100016AF panggilan ds: ReadFile
100016B5 CMP [EBP + NumberOfBytesRead], 0
100016B9 JBE loc_100016D2 singkat
100016BB mov eax, [EBP + NumberOfBytesRead]
100016BE mov byte_100034A0 [eax], 0
100016C5 mendorong diimbangi byte_100034A0 100016CA
panggilan sub_100010B3

Listing 11-8L: Membaca dan mendekripsi file INI

Setelah panggilan untuk ReadFile, Cek malware untuk memastikan ukuran file
lebih besar dari 0 di . Berikutnya, buffer yang berisi isi file akan diteruskan
kesub_100010B3 di . sub_100010B3 terlihat seperti itu mungkin rutinitas decoding
karena fungsi pertama disebut setelah membuka pegangan ke file dikodekan
dicurigai, jadi kita akan menyebutnya maybeDecoder. Untuk menguji teori kami, kami
memuat malware ke OllyDbg dan mengatur breakpoint di 0x100016CA. (Pastikan
Anda menyalin file INI dan malware ke dalam direktori sistem Windows dan
mengubah nama spoolvxx32.dll DLL.) Setelah breakpoint terkena, kita
melangkahisebut maybeDecoder. Gambar 11-3L menunjukkan hasilnya.
Gambar 11-3L: OllyDbg menunjukkan isi diterjemahkan dari Lab11-02.ini

Di pada Gambar 11-3L, konten-alamat email yang didekripsi billy @


malwareanalysisbook.com-ditunjukkan oleh EAX. Alamat email ini disimpan dalam
variabel globalbyte_100034A0, Yang kita rename alamat email di IDA Pro untuk
membantu analisis masa depan.
Kami memiliki satu fungsi terakhir untuk menganalisis dalam DllMain: sub_100014B6.
Karena fungsi ini akan menginstal hook inline, kami akan mengubah nama
ituhook_installer. Ituhook_installer Fungsi rumit, jadi sebelum menyelam ke dalamnya,
kami memberikan gambaran tingkat tinggi dari apa yang kait inline ini tampak seperti
setelah instalasi pada Gambar 11-4L.
ws2_32.dllws2_32.dll ShareBatal

panggilan Kirim panggilan Gambar 11-


jmp
Kirim kode Kirim
4L: The fungsi Kirim fungsi
sebelum dan setelah hook diinstal tubuh
Kirim
Sisi kiri dari Gambar 11-4L kode
fungsi
menunjukkan apa panggilan biasa fungsi
ke
Kirimfungsi dalam ws2_32.dll
terlihat seperti. Sisi kanan gambar
menunjukkan
bagaimanahook_installer menginstal hook inline dari Kirimfungsi.
AwalKirimFungsi diganti dengan melompat ke kode berbahaya, yang menyebut
trampolin (ditampilkan dalam kotak-kanan bawah angka ini). trampolin hanya
menjalankan awalKirim fungsi (yang ditimpa dengan lompatan pertama) dan kemudian
melompat kembali ke aslinya Kirim fungsi, sehingga Kirim Fungsi dapat beroperasi
seperti yang terjadi sebelumnya hook dipasang.
Sebelum hook_installermenginstal hook, cek untuk melihat mana proses malware
berjalan dalam. Untuk melakukannya, panggilan tiga fungsi untuk mendapatkan nama
proses saat ini. Listing 11-9L berisi kode dari pertama fungsi-fungsi ini,sub_10001075.

1000107D mendorong Nama file offset; lpFileName


10001082 mov eax, [EBP + hModule]
10001085 mendorong eax; hModule
10001086 sebut ds: GetModuleFileNameA
1000108C mov ecx, [EBP + arg_4]
1000108F mov dword ptr [ecx], offset Nama file

Listing 11-9L: Memanggil GetModuleFileNameA untuk mendapatkan nama proses saat

Seperti yang Anda lihat, GetModuleFileNameA disebut di , Dan ia mengembalikan path


lengkap ke proses di mana DLL dimuat karena argumen hModulediatur ke 0 sebelum panggilan
untuk fungsi ini. Berikutnya, malware mengembalikan nama di arg_4(Pointer string yang
dilewatkan ke fungsi). String ini akan diteruskan ke dua fungsi lebih, yang mengurai nama file
dan mengubah semua karakter ke huruf besar.

CATATAN Malware yang menggunakan AppInit_DLLs sebagai mekanisme ketekunan biasanya


menggunakan GetModuleFileNameA. DLL berbahaya ini dimuat ke dalam hampir setiap proses
yang dimulai pada sistem. Karena penulis malware mungkin ingin menargetkan hanya proses
tertentu, mereka harus menentukan nama proses di mana kode jahat mereka sedang berjalan.
Berikutnya, nama proses saat ini dalam huruf besar dibandingkan dengan nama-
nama proses THEBAT.EXE. outlook.exe, dan Msimn.Exe. Jika string tidak sama salah satu
dari nama file tersebut, malware akan keluar. Namun, jika malware telah dimuat ke
salah satu dari tiga proses ini, kode berbahaya terlihat pada Listing 11-10L akan
mengeksekusi.

10001561 panggilan sub_100013BD


10001566 mendorong diimbangi dword_10003484; int
1000156B mendorong diimbangi sub_1000113D ; int
10001570 mendorong diimbangi aSend; "Kirim"
10001575 mendorong diimbangi aWsock32_dll; "Wsock32.dll"
1000157A panggilan sub_100012A3
1000157F add esp, 10h
10001582 panggilan sub_10001499

Listing 11-10L: Kode berbahaya yang menetapkan hook inline

Daftar 11-10L memiliki beberapa fungsi bagi kita untuk menganalisis.


Dalam, Kita melihat panggilan ke GetCurrentProcessId lalu sub_100012FE, Yang
kami mengubah nama untuk suspend_threads. Itususpend_threads fungsi panggilan
GetCurrentThreadId, Yang mengembalikan pengenal benang (TID) dari thread saat
eksekusi. Berikutnya,suspend_threads panggilan CreateToolhelp32Snapshotdan
menggunakan hasilnya untuk loop melalui semua TIDs untuk proses saat ini. Jika
TID bukanlah thread saat ini, makaSuspendThreaddisebut menggunakan TID
tersebut. Kita dapat menyimpulkan bahwa fungsi yang disebut di menunda semua
thread mengeksekusi dalam proses saat ini.
Sebaliknya, fungsi disebut di  tidak sebaliknya: Ini resume semua benang
menggunakan panggilan ke ResumeThread. Kami menyimpulkan bahwa kode pada
Listing 11-10L dikelilingi oleh dua fungsi yang menangguhkan dan kemudian
melanjutkan eksekusi. Perilaku ini biasa terjadi ketika malware membuat perubahan
yang dapat mempengaruhi eksekusi saat ini, seperti mengubah memori atau memasang
kait inline.
Berikutnya, kita meneliti kode panggilan di . fungsisub_100012A3Dibutuhkan
empat argumen, seperti yang ditunjukkan oleh serangkaian dorongan pada Listing 11-
10L. Karena fungsi ini disebut hanya dari lokasi ini, kita dapat mengubah nama semua
argumen untuk mencocokkan apa yang dilewatkan ke fungsi, seperti ditunjukkan
pada Listing 11-11L dimulai.

100012A3 sub_100012A3 proc dekat


100012A3
100012A3 lpAddress = dword ptr -8
100012A3 hModule = dword ptr -4
100012A3 wsock32_DLL = dword ptr 8
100012A3 send_function = dword ptr 0Ch
100012A3 p_sub_1000113D = dword ptr 10h
100012A3 p_dword_10003484 = dword ptr 14h
100012A3
100012A3 mendorong EBP
100012A4 mov EBP, esp
100012A6 sub esp, 8
100012A9 mov eax, [EBP + wsock32_DLL]
100012AC mendorong eax; lpModuleName 100012AD memanggil ds:
GetModuleHandleA ...
100012CF mov edx, [EBP + send_function]
100012D2 mendorong edx; lpProcName
100012D3 mov eax, [EBP + hModule]
100012D6 mendorong eax; hModule
100012D7 panggilan ds: GetProcAddress
100012DD mov [EBP + lpAddress], eax

Listing 11-11L: sub_100012A3 menyelesaikan Kirim fungsi

Dalam Listing 11-11L, kita melihat pegangan untuk wsock32.dll diperoleh dengan
menggunakan
GetModuleHandleA di . pegangan yang dilewatkan keGetProcAddress untuk
menyelesaikan Kirim fungsi pada . malware berakhir lewat alamatKirim Fungsi dan dua
parameter lainnya (sub_1000113D dan dword_10003484) untuk sub_10001203, Yang kami
berganti nama place_hook.
Sekarang, kita meneliti place_hookdan mengubah nama argumen sesuai dalam rangka
untuk membantu analisis kami. Daftar 11-12L menunjukkan awalplace_hook.

10001209 mov eax, [EBP + _sub_1000113D]


1000120C sub eax, [EBP + send_address]
1000120F sub eax, 5
10001212 mov [EBP + VAR_4], eax

Listing 11-12L: perhitungan Alamat untuk instruksi jump

Kode pada Listing 11-12L menghitung perbedaan antara alamat memori dari
Kirim fungsi dan awal sub_1000113D. Perbedaan ini memiliki tambahan 5 byte
dikurangi dari itu sebelum pindah keVAR_4 di . VAR_4 digunakan kemudian dalam
kode dan didahului dengan 0xE9 (Opcode untuk jmp), Membuat ini instruksi 5-byte
untuk melompat ke sub_1000113D.
Mari kita lihat bagaimana malware menginstal kode ini sebagai kail kemudian di
place_hook.
Awal Kirim Fungsi dimodifikasi oleh petunjuk yang ditampilkan pada Listing 11-13L.

10001271 mov edx, [EBP + send_address]


10001274 mov byte ptr [edx], 0E9h
10001277 mov eax, [EBP + send_address]
1000127A mov ecx, [EBP + VAR_4] 1000127D mov [eax +
1], ecx Listing 11-13L: The inline kait instalasi

Di , Kode salinan 0xE9 opcode ke awal Kirimfungsi. Setelah itu, itu salinanVAR_4
ke dalam memori hanya setelah 0xE9 di . Ingat dari Daftar 11-12L yangVAR_4
mengandung tujuan melompat, sub_1000113D. Kode pada Listing 11-13L
menempatkanjmp instruksi pada awal Kirim fungsi yang melompat ke fungsi dalam
DLL kami di sub_1000113D, Yang sekarang kita akan mengubah nama hook_function.
Sebelum kita meneliti hook_function, Mari kita membungkus analisis kami instalasi
inline kait. Listing menunjukkan 11-14Lplace_hook memanipulasi memori.

10001218 mendorong ecx; lpflOldProtect


10001219 mendorong PAGE_EXECUTE_READWRITE; flNewProtect
1000121B mendorong 5; dwSize
1000121D mov edx, [EBP + send_address]
10001220 mendorong edx; lpAddress
10001221 sebut ds: VirtualProtect
10001227 mendorong 0FFH; Ukuran
1000122C panggilan malloc
10001231 add esp, 4
10001234 mov [EBP + var_8], eax

Listing 11-14L: place_hook (sub_10001203) memanipulasi memori

Dalam Listing 11-14L, place_hook panggilan VirtualProtect di  pada awal Kirimkode


fungsi. Tindakan ini mengubah proteksi memori untuk mengeksekusi, membaca, dan
menulis akses, sehingga memungkinkan malware untuk memodifikasi instruksi
dariKirimfungsi. panggilan lain untukVirtualProtectpada akhir fungsi mengembalikan
pengaturan memori-perlindungan yang asli. Kemudian, segera setelah
meneleponVirtualProtect, Malware mengalokasikan 0xFF byte memori menggunakan
malloc dan menyimpan hasilnya dalam var_8 di . Karena memori ini dialokasikan
secara dinamis akan memainkan peran penting dalam instalasi kail kami sebagai
trampolin, kami akan mengubah namavar_8 untuk trampolin.

CATATAN Agar ini untuk mengeksekusi dengan baik, memori dikembalikan oleh panggilan
untuk malloc harus memori executable, yang mungkin tidak selalu menjadi kasus jika,
misalnya, Pencegahan Eksekusi Data (DEP) diaktifkan melalui / Noexecute = AlwaysOn
atau serupa.
Daftar 11-15L menunjukkan penciptaan kode trampolin itu.

10001246 mendorong 5; Ukuran


10001248 mov eax, [EBP + send_address]
1000124B mendorong eax; src
1000124C mov ecx, [EBP + trampolin]
1000124F menambahkan ecx, 5
10001252 mendorong ecx; dst
10001253 sebut memcpy
10001258 add esp, 0Ch
1000125B mov edx, [EBP + trampolin]
1000125E mov byte ptr [edx + 0Ah], 0E9h
10001262 mov eax, [EBP + send_address]
10001265 sub eax, [EBP + trampolin] 10.001.268 sub eax, 0Ah
1000126B mov ecx, [EBP + trampolin] 1000126E mov [ecx + 0Bh],
eax

Listing 11-15L: pembuatan trampolin untuk hook inline

Dalam Listing 11-15L, yang memcpy di  salinan 5 byte pertama dari


Kirimberfungsi dalam trampolin. Sejak malware menimpa 5 byte pertama
dariKiriminstruksi (Listing 11-13L), perlu memastikan bahwa petunjuk yang asli
disimpan. malware ini mengasumsikan bahwaKirim pertama beberapa petunjuk fungsi
ini menyelaraskan tepat pada 5 byte, yang mungkin tidak selalu menjadi kasus.
Berikutnya, malware menambahkan jmp instruksi untuk kode trampolin di  dan
. Di, yang 0xE9opcode ditambahkan. Di, Lokasi untuk melompat ditambahkan.
Lokasi melompat dihitung dengan mengurangkan lokasi trampolin dari lokasi Kirim
fungsi (yang berarti akan melompat kembali ke Kirim fungsi).
Akhirnya, place_hook berakhir dengan menetapkan variabel global
dword_10003484ke lokasi trampolin. Kami mengubah namadword_10003484 untuk
trampoline_function untuk membantu analisis.
Berikutnya, kita menganalisis hook_function (sub_1000113D), Yang akan memiliki
argumen yang sama seperti KirimFungsi karena diinstal sebagai kail. Kami memulai
analisis kami dengan mengklik kanan nama fungsi, memilih Set Fungsi Type, dan
memasuki berikut:int __stdcall hook_function (SOCKET s, char * buf, int len, int flag)
Fungsi kait mencari string RCPT TO: di buf. Jika string tidak ditemukan, malware
hanya panggilantrampoline_function, Yang menyebabkan Kirimuntuk beroperasi seperti
yang terjadi sebelumnya hook dipasang. Jika tidak, kode pada Listing 11-16L akan
mengeksekusi.

1000116D mendorong diimbangi aRcptTo_1; "RCPT TO: <"


10001172 lea ecx, [EBP + Dst]
10001178 mendorong ecx; Dst 10001179 panggilan memcpy ...
10001186 mendorong diimbangi EMAIL_ADDRESS; Src ...
10001198 lea edx, [EBP + eax + Dst]
1000119F mendorong edx; dst
100011A0 panggilan memcpy
100011A8 mendorong diimbangi Sumber; "> \ R \ n"
100011AD lea eax, [EBP + Dst]
100011B3 mendorong eax; dest
100011B4 panggilan strcat

Listing 11-16L: Membuat string untuk menambahkan penerima


11
Kode pada Listing 11-16L membangun string yang ditambahkan ke buffer
keluar. string ini dimulai denganRCPT TO: < di , diikuti oleh alamat email di , Dan
berakhir dengan > \ R \ n di . Itualamat emailnilai dalam hal ini adalah billy @
malwareanalysisbook.com (diekstraksi dari Lab11-02.ini, seperti yang dijelaskan
sebelumnya ketika kita melihat isi dari file itu). Kode ini menambahkan penerima
untuk semua pesan email keluar.

Tingkat Rendah Ringkasan Hook Operasi


Berikut adalah ringkasan dari operasi hook (juga digambarkan pada tingkat tinggi pada
Gambar 11-4L, ditampilkan sebelumnya):

 program panggilan Kirim fungsi.


 Instruksi pertama dari Kirim transfer fungsi eksekusi untuk sub_1000113D.
 sub_1000113D memanipulasi buffer keluar hanya jika mengandung RCPT TO tali.
 sub_1000113D panggilan kode trampolin terletak di heap dan ditunjuk oleh
dword_10003484.
 Kode trampolin mengeksekusi tiga instruksi asli pertama dari Kirim fungsi (yang
menimpa untuk menginstal hook).
 Kode trampolin melompat kembali ke Kirim Fungsi 5 byte dalam, sehingga Kirim
dapat berfungsi secara normal.

Meneliti Hook di OllyDbg


Kita bisa memeriksa hook inline menggunakan OllyDbg dengan menginstal malware
dan kemudian meluncurkan Outlook Express. (Outlook Express dibundel dengan
Microsoft Windows XP dan berjalan sebagai Msimn.Exe.) Kami melampirkan ke
proses menggunakan FileMelampirkandan memilih Msimn.Exe dari proses
daftar. Melampirkan proses segera berhenti semua benang. Jika kita memeriksa peta
memori, kita melihat bahwa spoolvxx32.dll dimuat dalam proses karena merupakan
AppInit_DLLs nilai.
Berikutnya, kita meneliti Kirim dengan menekan CTRL-G dan memasuki Kirimdalam
kotak teks. Gambar 11-5L menunjukkan awalKirim fungsi dengan jmp menghubungkan
ke sub_1000113D. (Jika Anda suka, Anda dapat mengatur breakpoint di melompat dan
menganalisis kode selama runtime.)
Gambar 11-5L: Meneliti hook inline untuk Kirim fungsi dalam
Msimn.Exe

Menangkap Lalu Lintas Jaringan


Untuk menangkap malware ini dalam tindakan dan melihat bagaimana memanipulasi
lalu lintas jaringan, mendirikan sebuah lingkungan yang aman sebagai berikut:

1. Hidupkan host-satunya jaringan di mesin virtual Anda.


2. Menginstal malware pada mesin virtual Anda dengan perintah rundll32.exe Lab11-02.exe,
installer.
3. Copy Lab11-02.ini ke C: \ Windows \ System32 \.
4. Peluncuran Wireshark dan mulai menangkap paket-paket pada interface jaringan mesin
virtual.
5. Mengatur Outlook Express untuk mengirim email ke sistem host.
6. Menjalankan mail server palsu pada mesin host dengan perintah ular sanca
-m smtpd -n -c DebuggingServer IP: 25, di mana AKU P adalah alamat IP dari host
mesin.
7. Kirim email dari Outlook Express.
8. Tinjau capture paket dalam Wireshark dan pilih Follow TCP Streaming pada pesan email.

Ringkasan
Lab 11-2 adalah DLL berbahaya yang ekspor pemasang, Yang menginstal malware
terus-menerus menggunakan AppInit_DLLs, Menyebabkan malware yang akan dimuat
ke sebagian proses. Pemeriksaan malware untuk melihat apakah itu dimuat ke klien
email dengan menggunakan daftar yang telah ditetapkan nama-nama proses untuk
menargetkan. Jika malware menentukan bahwa itu berjalan di dalam salah satu dari
proses-proses ini, akan bertindak sebagai rootkit mode pengguna dengan memasang
kait inline untukKirimfungsi. hook mengambil bentuk darijmp instruksi ditempatkan di
awal Kirimfungsi. hook mengeksekusi fungsi yang memindai setiap buffer data
diteruskan keKirim Fungsi dan mencari RCPT TO. Jika malware menemukanRCPT TO
string, ia menyisipkan tambahan RCPT TO mengandung alamat email diambil oleh
decoding Lab11-02.ini, pada dasarnya menyalin penulis malware pada setiap email
yang dikirim dari program email yang ditargetkan.

Lab 11-3 Solusi

Jawaban pendek
1. Lab11-03.exe mengandung string inet_epar32.dll dan net start cisvc, Yang berarti bahwa itu
mungkin dimulai layanan pengindeksan CiSvc. Lab11-03.dll mengandung stringC: \
WINDOWS \ System32 \ kernel64x.dll dan impor panggilan API GetAsyncKeyState dan
GetForegroundWindow, Yang membuat kita menduga itu adalah keylogger yang log ke
kernel64x.dll.
2. malware dimulai dengan menyalin Lab11-03.dll untuk inet_epar32.dll di direktori sistem
Windows. malware menulis data ke cisvc.exe dan mulai layanan pengindeksan. malware
juga muncul untuk menulis keystrokes ke C: \ Windows \ System32 \ kernel64x.dll.
3. malware terus-menerus menginstal Lab11-03.dll oleh trojanizing layanan pengindeksan
oleh entry-titik pengalihan. Ini pengalihan titik masuk untuk menjalankan shellcode, yang
beban DLL.
4. malware menginfeksi cisvc.exe untuk memuat inet_epar32.dll dan memanggil ekspor
zzz69806582.
5. Lab11-03.dll adalah keylogger polling dilaksanakan di ekspor zzz69806582.
6. The malware toko keystrokes dan jendela ke mana keystrokes dimasukkan ke C: \
Windows \ System32 \ kernel64x.dll.

Analisis rinci
Kita akan mulai analisa kita dengan memeriksa string dan impor untuk Lab11-03.exe
dan Lab11-03.dll. Lab11-03.exe mengandung stringinet_epar32.dll dan net start cisvc.
Itumulai bersih Perintah ini digunakan untuk memulai layanan pada mesin Windows,
tapi kami belum tahu mengapa malware tersebut akan memulai layanan
pengindeksan pada sistem, jadi kita akan menggali selama analisis mendalam.
Lab11-03.dll mengandung string C: \ WINDOWS \ System32 \ kernel64x.dll dan
impor panggilan API GetAsyncKeyState dan GetForegroundWindow, Yang membuat
kita menduga itu adalah keylogger yang log keystrokes untuk kernel64x.dll. DLL
juga mengandung ekspor bernama aneh:zzz69806582.
Berikutnya, kita menggunakan teknik analisis dinamis untuk melihat apa
malware melakukan pada saat runtime. Kami mendirikan ProcMon dan filter pada
Lab11-03.exe untuk melihat malware membuat C: \ Windows \ System32 \
inet_epar32.dll. DLL inet_epar32.dll identik dengan Lab11-03.dll, yang mengatakan
kepada kita bahwa salinan malware Lab11-03.dll ke direktori sistem Windows.
Lebih lanjut dalam output ProcMon, kita melihat malware membuka pegangan untuk
cisvc.exe, tapi kami tidak melihat WriteFile operasi.
Akhirnya, malware dimulai layanan pengindeksan dengan mengeluarkan
perintah net start cisvc. Menggunakan Process Explorer, kita melihat bahwa cisvc.exe
sekarang berjalan pada sistem. Karena kita menduga bahwa malware mungkin
logging keystrokes, kita buka notepad.exe dan masukkan sekelompok karakter. Kami
melihat bahwa kernel64x.dll dibuat. Mencurigai bahwa penekanan tombol login, kita
membuka kernel64x.dll di hex editor dan melihat output berikut:

Untitled - Notepad: 0x41


Untitled - Notepad: 0x41
Untitled - Notepad: 0x41
Untitled - Notepad: 0x41

keystrokes kami telah login ke kernel64x.dll. Kami juga melihat bahwa program di
mana kita diketik kami (Notepad) telah login bersama dengan data keystroke dalam
heksadesimal. (Malware tidak mengubah nilai-nilai heksadesimal ke string dibaca,
sehingga penulis malware mungkin memiliki script postprocessing untuk lebih mudah
membaca apa yang dimasukkan.)
Berikutnya, kita menggunakan teknik mendalam untuk menentukan mengapa
malware ini mulai layanan dan bagaimana keylogger adalah mendapatkan eksekusi.
Kita mulai dengan memuat Lab11-03.exe ke IDA Pro dan memeriksautama fungsi,
seperti ditunjukkan pada Listing 11-17L.

004012DB mendorong diimbangi NewFileName; "C: \\ WINDOWS \\ System32 \\ inet_epar32.dll"


004012E0 mendorong diimbangi ExistingFileName; "Lab11-03.dll"
004012E5 panggilan ds: CopyFileA
004012EB mendorong diimbangi aCisvc_exe; "Cisvc.exe"
004012F0 mendorong diimbangi Format; "C: \\ WINDOWS \\ system32 \\% s"
004012F5 lea eax, [EBP + FileName]
004012FB mendorong eax; dest
004012FC panggilan _sprintf
00401301 add esp, 0Ch
00401304 lea ecx, [EBP + FileName]
0040130A mendorong ecx; lpFileName
0040130B panggilan sub_401070
00401310 add esp, 4
00401313 mendorong diimbangi aNetStartCisvc; "Net start cisvc" sistem 00401318 panggilan

Listing 11-17L: Meninjau utama metode dari Lab11-03.exe

Di , Kita melihat bahwa utamaMetode dimulai dengan menyalin Lab11-03.dll


untuk inet_epar32.dll di C: \ Windows \ System32. Berikutnya, itu membangun stringC:
\ WINDOWS \ System32 \ cisvc.exe dan lolos ke sub_401070 di . Akhirnya, malware dimulai
layanan pengindeksan dengan menggunakansistem untuk menjalankan perintah net start
cisvc di .
Kami fokus pada sub_401070untuk melihat apa yang bisa lakukan dengan
cisvc.exe. Ada banyak kode membingungkan disub_401070, Jadi kita lihat tingkat
tinggi di fungsi ini menggunakan diagram referensi silang yang ditunjukkan pada
Gambar 11-6L.

Gambar 11-6L: grafik Cross-referensi untuk sub_401070

Menggunakan diagram ini, kita melihat bahwa sub_401070 peta file cisvc.exe ke
dalam memori untuk memanipulasi dengan panggilan ke CreateFileA.
CreateFileMappingA, dan MapViewOfFile. Semua fungsi ini membuka file untuk membaca
dan menulis akses.
The mulai alamat dari tampilan memori-dipetakan dikembalikan oleh MapViewOfFile
(berlabel lpBaseAddressoleh IDA Pro) adalah baik dibaca dan ditulis untuk. Setiap
perubahan yang dibuat untuk file ini akan ditulis ke disk setelah panggilan
keUnmapViewOfFile, Yang menjelaskan mengapa kita tidak melihat WriteFile fungsi dalam
output ProcMon.
Beberapa perhitungan dan pemeriksaan tampaknya dibuat pada header PE dari
cisvc.exe. Daripada menganalisa manipulasi kompleks, mari kita fokus pada data
ditulis ke file, dan kemudian ekstrak versi cisvc.exe ditulis ke disk untuk analisis.
Sebuah buffer ditulis ke file memori-dipetakan, seperti ditunjukkan pada Listing 11-18L.
11
0040127C mov edi, [EBP + lpBaseAddress]
0040127F menambahkan edi, [EBP + var_28]
00401282 mov ecx, 4EH
00401287 mov esi, offset byte_409030 0040128C rep movsd

Listing 11-18L: Menulis 312 byte shellcode ke cisvc.exe

Di , Lokasi dipetakan file tersebut akan dipindahkan ke EDI dan disesuaikan


oleh beberapa diimbangi menggunakan var_28. Berikutnya, ECX sarat dengan 0x4E,
jumlahDWORDs untuk menulis (movsd). Oleh karena itu, jumlah total byte adalah
0x4E * 4 = 312 byte dalam desimal. Akhirnya, byte_409030 dipindahkan ke ESI di ,
dan rep movsd salinan data pada byte_409030ke dalam file dipetakan. Kami
memeriksa data di 0x409030 dan melihat byte di sisi kiri Tabel 11-1L.
Tabel 11-1L: The Shellcode Ditulis untuk cisvc.exe

byte mentah Membongkar

00409030 unk_409030 db 55h 00409030 mendorong EBP


00409031 db 89H 00409031 mov EBP, esp
00409032 db 0E5h 00409033 sub esp, 40h
00409033 db 81h 00409039 jmp loc_409134
00409034 db 0ECh
00409035 db 40h

Sisi kiri dari tabel berisi byte baku, tetapi jika kita menempatkan kursor di
0x409030 dan tekan C di IDA Pro, kita mendapatkan pembongkaran ditampilkan di
sisi kanan meja. Ini adalah perakitan shellcode-buatan tangan itu, dalam hal ini,
digunakan untuk proses injeksi. Daripada menganalisis shellcode (demikian dapat
sedikit rumit dan berantakan), kami akan menebak apa itu didasarkan pada senar yang
dikandungnya.
Menjelang akhir 312 byte shellcode, kita melihat dua string:

00409139 aCWindowsSystem db 'C: \ WINDOWS \ System32 \ inet_epar32.dll', 0


0040915D aZzz69806582 db 'zzz69806582', 0

Munculnya jalan untuk inet_epar32.dll dan ekspor zzz69806582 menunjukkan bahwa


shellcode ini beban DLL dan memanggil ekspor.
Berikutnya, kita membandingkan biner cisvc.exe seperti yang ada setelah kami
menjalankan malware ke versi yang bersih yang ada sebelum malware dijalankan. (.
Kebanyakan hex editor menyediakan alat perbandingan) Membandingkan versi, kita
melihat dua perbedaan: penyisipan 312 byte shellcode dan hanya perubahan 2-byte di
header PE. Kami memuat kedua binari tersebut ke dalam PEview untuk melihat
apakah kita melihat perbedaan di header PE. Perbandingan ini ditunjukkan pada
Gambar 11-7L.

Gambar 11-7L: PEview dari versi asli dan Trojanized dari cisvc.exe

Bagian atas Gambar 11-7L menunjukkan cisvc.exe asli (bernama


cisvc_original.exe) dimuat ke PEview, dan bagian bawah menunjukkan cisvc.exe
Trojanized. Di dan , Kita melihat bahwa titik masuk berbeda dalam dua binari.
Jika kita memuat kedua binari ke IDA Pro, kita melihat bahwa malware telah
melakukan entry-titik pengalihan sehingga shellcode berjalan sebelum titik entri asli
setiap waktu yang cisvc.exe diluncurkan. Listing 11-19L menunjukkan potongan dari
shellcode dalam versi Trojanized dari cisvc.exe.
01001B0A panggilan dword ptr [EBP-4]
01001B0D mov [EBP-10h], eax
01001B10 lea eax, [ebx + 24h]
01001B16 mendorong eax
01001B17 mov eax, [EBP-10h]
01001B1A mendorong eax
01001B1B panggilan dword ptr [EBP-0Ch]
01001B1E mov [EBP-8], eax
01001B21 panggilan dword ptr [EBP-8]
01001B24 mov esp, EBP
01001B26 pop EBP
01001B27 jmp _wmainCRTStartup

Listing 11-19L: panggilan Penting dalam shellcode dalam Trojanized yang cisvc.exe

Sekarang kita memuat versi Trojanized dari cisvc.exe ke debugger dan mengatur
breakpoint di 0x1001B0A. Kami menemukan bahwa di, Panggilan malware
LoadLibraryuntuk memuat inet_epar32.dll ke dalam memori. Di, Panggilan malware
GetProcAddress dengan argumen zzz69806582untuk mendapatkan alamat dari fungsi
diekspor. Di, Panggilan malware zzz69806582. Akhirnya, malware melompat ke titik
masuk asli di, Sehingga layanan dapat berjalan seperti biasanya. Fungsi shellcode
ini cocok kecurigaan kami sebelumnya bahwa beban inet_epar32.dll dan panggilan
ekspor.

Analisis keylogger
Berikutnya, kita menganalisis inet_epar32.dll, yang sama dengan Lab11-03.dll. Kami memuat
Lab11-03.dllke IDA Pro dan mulai menganalisa file. Sebagian besar 11
kode berasal dari zzz69806582ekspor. ekspor ini mulai thread dan kembali, jadi kami
akan fokus pada analisis benang, seperti ditunjukkan pada Listing 11-20L.

1000149D push diimbangi Nama; "MZ"


100014A2 dorongan 1; bInitialOwner
100014A4 mendorong 0; lpMutexAttributes 100014A6 panggilan ds: CreateMutexA
...
100014BD mendorong 0; hTemplateFile
100014BF mendorong 80h; dwFlagsAndAttributes
100014C4 mendorong 4; dwCreationDisposition
100014C6 mendorong 0; lpSecurityAttributes
100014C8 mendorong 1; dwShareMode
100014CA mendorong 0C0000000h; dwDesiredAccess 100014CF mendorong FileName offset;
"C: \\ WINDOWS \\ System32 \\ kernel64x.dll"
100014D4 panggilan ds: CreateFileA

Listing 11-20L: mutex dan pembuatan berkas dilakukan oleh thread yang dibuat oleh zzz69806582

Di , Malware menciptakan mutex bernama MZ. mutex ini mencegah malware


dari berjalan lebih dari satu contoh dari dirinya sendiri, karena panggilan sebelumnya
untukOpenMutex (Tidak ditampilkan) akan mengakhiri benang jika mutex MZsudah ada.
Berikutnya, pada, Malware membuka atau menciptakan sebuah file bernama
kernel64x.dll untuk menulis.
Setelah mendapatkan pegangan untuk kernel64x.dll, malware set file pointer ke
akhir file dan panggilan sub_10001380, Yang berisi satu lingkaran. lingkaran ini berisi
panggilan keGetAsyncKeyState. GetForegroundWindow, dan WriteFile. Hal ini konsisten
dengan metode keylogging kita bahas di “Keylogger User-Space” pada halaman 239.
Ringkasan
Lab11-03.exetrojanizes dan kemudian mulai layanan pengindeksan Windows
(cisvc.exe). Shellcode trojan beban DLL dan memanggil fungsi diekspor yang
meluncurkan keylogger. ekspor menciptakan mutexMZ dan log semua penekanan
tombol untuk kernel64x.dll di direktori sistem Windows.

Anda mungkin juga menyukai