Simbol dan Modul Sintetis (WinDbg / DbgEng)

Publikasi ini akan fokus pada modul sintetik dan simbol mesin debugging Windows (mesin debugger). Yaitu, tentang entitas yang dapat ditambahkan secara buatan ke debugger untuk mewarnai alamat memori.



Modul sintetis


Secara umum, modul dalam kerangka mesin debugger adalah area terus menerus dari memori virtual: alamat dasar modul (alamat byte pertama dari file yang diproyeksikan) dan ukurannya. Untuk setiap jenis debugging (live debugging / dump analysis, mode pengguna / mode kernel, dll.), Debugger memiliki mekanisme sendiri untuk membaca dan mengikuti perkembangan daftar modul yang dimuat. Cara termudah untuk memaksa daftar modul yang dimuat diperbarui adalah perintah .reload dengan opsi / s .


Jika kita berbicara, misalnya, tentang debugging langsung dari proses mode pengguna, maka daftar modul yang dimuat dibangun sesuai dengan tiga daftar utama pemuat : daftar urutan pemuatan modul (InLoadOrderModuleList), daftar modul dalam memori (InMemoryOrderModuleList) dan daftar prioritas inisialisasi (InInitializationOrderModuleList). Di satu sisi, itu ( hampir ) tidak ada yang mencegah kita mengambil data sewenang-wenang (dari file PE pada disk, misalnya) dan menandainya dalam memori untuk dieksekusi dengan tangan kita sendiri. Di sisi lain, teknik untuk menghapus DLL dimuat dengan cara biasa dari tiga daftar loader di atas (menyembunyikan modul) telah lama dikenal.


Dalam kedua kasus, saat men-debug situasi ini, akan berguna untuk menandai area modul tersembunyi. Untuk ini, modul sintetis cocok. Sebagai percobaan praktis, Anda bisa membuat WinDbg menjatuhkan modul yang dimuat dari daftar internalnya dengan perintah .reload yang sama , tetapi dengan opsi / u .


Selanjutnya, dalam kualitas daftar yang terdaftar, saya akan menggunakan debugging biasa dari proses mode pengguna (notepad.exe). Pertama, ingat alamat dasar modul ntdll (0x07ffa8a160000) dan hitung ukurannya (0x01e1000):


0:007> lm m ntdll Browse full module list start end module name 00007ffa`8a160000 00007ffa`8a341000 ntdll 0:007> ? 00007ffa`8a341000-00007ffa`8a160000 Evaluate expression: 1970176 = 00000000`001e1000 

Pertimbangkan daftar fungsi RtlFreeSid sederhana dari modul ntdll, yang memanggil fungsi RtlFreeHeap dari modul ini, secara bersamaan mengingat alamat karakter RtlFreeSid dan RtlFreeHeap (0x7ffa8a1cbc20 dan 0x7ffa8a176df0):


 0:007> uf ntdll!RtlFreeSid ntdll!RtlFreeSid: 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call ntdll!RtlFreeHeap (00007ffa`8a176df0) 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Juga, menurut daftar, mudah untuk menghitung ukuran fungsi ntdll! RtlFreeSid:


 0:007> ? 00007ffa`8a1cbc51 - 0x07ffa8a1cbc20 Evaluate expression: 49 = 00000000`00000031 

Dan ukuran fungsi ntdll! RtlFreeHeap tidak penting untuk percobaan kami, jadi untuk kesederhanaan Anda dapat mengambilnya sama dengan satu byte.


Sekarang simulasikan menyembunyikan modul ntdll:


 0:007> .reload /u ntdll Unloaded ntdll 

Bidang pekerjaan ini dengan alamat fungsi ntdll! RtlFreeSid di debugger tidak begitu informatif (dan Anda sudah dapat mengakses awal fungsi hanya dengan alamat virtual):


 0:007> uf 00007ffa`8a1cbc20 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call 00007ffa`8a176df0 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Untuk menambahkan modul sintetis, Anda perlu memanggil antarmuka program IDebugSymbols3 :: AddSyntheticModule . Tidak ada perintah bawaan untuk melakukan panggilan ini (sejauh yang saya tahu). Mikhail I. Izmestev menyarankan bahwa ada mekanisme yang sama -. Reload yang sama, tetapi dengan nama, alamat dan parameter ukuran: "Module = Address, Size" (dan, mungkin, ini diterapkan pada modul sintetis).


.muat ulang ntdll = 00007ff8`470e1000,001e1000
 0:007> .reload ntdll=00007ff8`470e1000,001e1000 *** WARNING: Unable to verify timestamp for ntdll *** ERROR: Module load completed but symbols could not be loaded for ntdll 0:007> uf 00007ff8`4714bc20 ntdll+0x6ac20: 00007ff8`4714bc20 4053 push rbx 00007ff8`4714bc22 4883ec20 sub rsp,20h 00007ff8`4714bc26 488bd9 mov rbx,rcx 00007ff8`4714bc29 33d2 xor edx,edx 00007ff8`4714bc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ff8`4714bc34 4c8bc3 mov r8,rbx 00007ff8`4714bc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ff8`4714bc3b e8b0b1faff call ntdll+0x15df0 (00007ff8`470f6df0) 00007ff8`4714bc40 33c9 xor ecx,ecx 00007ff8`4714bc42 85c0 test eax,eax 00007ff8`4714bc44 480f45d9 cmovne rbx,rcx 00007ff8`4714bc48 488bc3 mov rax,rbx 00007ff8`4714bc4b 4883c420 add rsp,20h 00007ff8`4714bc4f 5b pop rbx 00007ff8`4714bc50 c3 ret 

Kita akan menggunakan ekstensi debugger, dan di sini pykd akan datang untuk menyelamatkan . Dalam rilis terbaru (pada saat penulisan) 0.3.4.3 , fungsi untuk mengelola modul sintetik ditambahkan: addSyntheticModule (...) (yang diperlukan dalam kasus kami) dan removeSyntheticModule (...).


Menggunakan alamat dasar dan ukuran modul yang sebelumnya disimpan, kami menambahkan informasi tentang modul ntdll tersembunyi ke debugger (jika terjadi kesalahan, pengecualian akan dilemparkan, oleh karena itu eksekusi diam adalah tanda keberhasilan, peringatan pencetakan dapat diabaikan):


 0:007> !py Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> addSyntheticModule(0x07ffa8a160000, 0x01e1000, 'ntdll') *** WARNING: Unable to verify timestamp for ntdll >>> exit() 

Sekarang daftar disassembler telah menjadi sedikit lebih informatif:


 0:007> uf 00007ffa`8a1cbc20 ntdll+0x6bc20: 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call ntdll+0x16df0 (00007ffa`8a176df0) 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Lebih tepatnya, kita melihat bahwa fungsi di dalam modul ntdll memanggil fungsi lain di dalam modul yang sama.


Simbol sintetis


Daftar, setelah menambahkan modul sintetis, telah menjadi lebih informatif, tetapi masih tidak fasih seperti yang asli. Tidak memiliki karakter (dalam kasus kami, nama-nama fungsi RtlFreeSid dan RtlFreeHeap). Untuk memperbaikinya, diperlukan panggilan lagi, tetapi dari antarmuka program yang berbeda - IDebugSymbols3 :: AddSyntheticSymbol . Pykd lagi siap membantu kami dengan ini:


 0:007> !py Python 2.7.15 (v2.7.15:ca079a3ea3, Apr 30 2018, 16:30:26) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> addSyntheticSymbol(0x07ffa8a1cbc20, 0x31, 'RtlFreeSid') <pykd.syntheticSymbol object at 0x0000014D47699518> >>> addSyntheticSymbol(0x07ffa8a176df0, 1, 'RtlFreeHeap') <pykd.syntheticSymbol object at 0x0000014D476994A8> >>> exit() 

Hasilnya sangat mirip dengan yang ketika menggunakan simbol dari file pdb ntdll:


 0:007> uf 00007ffa`8a1cbc20 ntdll!RtlFreeSid: 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call ntdll!RtlFreeHeap (00007ffa`8a176df0) 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Fitur entitas sintetis


Perlu dicatat bahwa pembuatan simbol sintetik diperbolehkan dalam modul apa pun yang ada, dan tidak hanya pada simbol sintetis. Artinya, Anda dapat menambahkan simbol ke modul dengan file pdb yang dapat diakses , dan ke modul yang kami tidak memiliki file dengan informasi debug. Tetapi Anda tidak dapat membuat karakter di luar modul. Artinya, untuk menandai alamat memori yang berubah-ubah di luar batas modul yang ada, Anda harus terlebih dahulu membuat modul sintetis yang membungkus, dan kemudian (jika perlu, karena nama modul mungkin cukup untuk pewarnaan ) buat simbol sintetis di dalamnya.


Perlu juga disebutkan bahwa modul dan simbol sintetis dapat dihilangkan dengan gerakan tangan yang ceroboh :


  • memuat kembali simbol debug modul menghapus semua simbol sintetik dari modul ini;
  • memuat kembali semua modul akan menghapus semua modul sintetis.

! synexts


Meskipun penggunaan pykd nyaman di sebagian besar kasus (terutama mengingat keberadaan bootstarpper ), kadang-kadang Anda bisa masuk ke situasi di mana Anda harus menghabiskan banyak upaya untuk menggunakan pykd. Sebagai contoh, saya pernah perlu men-debug dari mesin host'ovy tempat Windows XP bekerja. Ternyata, pykd belum mendukung XP untuk beberapa waktu, dan saya membutuhkan karakter dan modul sintetik. Tampak bagi saya bahwa untuk tugas ini lebih mudah untuk merakit ekstensi kecil terpisah yang akan menyelesaikan berbagai tugas yang diperlukan daripada mengembalikan dukungan XP penuh untuk pykd. Akibatnya, proyek terpisah ! Synexts dibuat.


Ini adalah ekstensi sederhana yang memiliki dua ekspor tersedia untuk pengguna:


  • ! synexts.addsymbol - membuat simbol sintetis dalam setiap modul yang ada;
  • ! synexts.addmodule - membuat modul sintetis dalam daftar internal mesin debugging.

Untuk menunjukkan, kami mensimulasikan menyembunyikan modul ntdll lagi:


 0:007> .reload /u ntdll Unloaded ntdll 0:007> uf 00007ffa`8a1cbc20 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call 00007ffa`8a176df0 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Sekali lagi, kami mengembalikan pengetahuan tentang modul dan simbol dalam bentuk entitas sintetis, tetapi sudah menggunakan ekstensi! Synexts:


 0:007> !synexts.addmodule ntdll C:\Windows\System32\ntdll.dll 00007ffa`8a160000 0x01e1000 *** WARNING: Unable to verify timestamp for C:\Windows\System32\ntdll.dll Synthetic module successfully added 0:007> !synexts.addsymbol RtlFreeSid 00007ffa`8a1cbc20 31 Synthetic symbol successfully added 0:007> !synexts.addsymbol RtlFreeHeap 00007ffa`8a176df0 1 Synthetic symbol successfully added 

Diasumsikan bahwa Anda telah menyalin pustaka synexts.dll yang telah dikompilasi (sesuai dengan kedalaman bit yang digunakan oleh WinDbg) ke direktori winext debugger:


 0:007> .chain Extension DLL search Path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\WINXP;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\arcade;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\pri;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64;<…> Extension DLL chain: pykd.pyd: image 0.3.4.3, API 1.0.0, built Thu Jan 10 19:56:25 2019 [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\pykd.pyd] synexts: API 1.0.0, built Fri Jan 18 17:38:17 2019 [path: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext\synexts.dll] <…> 

Dan lagi kita melihat hasil menambahkan karakter sintetis ke modul sintetis:


 0:007> uf 00007ffa`8a1cbc20 ntdll!RtlFreeSid: 00007ffa`8a1cbc20 4053 push rbx 00007ffa`8a1cbc22 4883ec20 sub rsp,20h 00007ffa`8a1cbc26 488bd9 mov rbx,rcx 00007ffa`8a1cbc29 33d2 xor edx,edx 00007ffa`8a1cbc2b 65488b0c2560000000 mov rcx,qword ptr gs:[60h] 00007ffa`8a1cbc34 4c8bc3 mov r8,rbx 00007ffa`8a1cbc37 488b4930 mov rcx,qword ptr [rcx+30h] 00007ffa`8a1cbc3b e8b0b1faff call ntdll!RtlFreeHeap (00007ffa`8a176df0) 00007ffa`8a1cbc40 33c9 xor ecx,ecx 00007ffa`8a1cbc42 85c0 test eax,eax 00007ffa`8a1cbc44 480f45d9 cmovne rbx,rcx 00007ffa`8a1cbc48 488bc3 mov rax,rbx 00007ffa`8a1cbc4b 4883c420 add rsp,20h 00007ffa`8a1cbc4f 5b pop rbx 00007ffa`8a1cbc50 c3 ret 

Source: https://habr.com/ru/post/id436644/


All Articles