Get our toolbar!

Halaman

Minggu, 13 Januari 2013

Debugging DLL

Debugging DLL

OllyDbg 1.10 dapat men-debug DLL mandiri. Windows tidak dapat memulai DLL secara langsung, sehingga OllyDbg menggunakan executable kecil bernama loaddll.exe. Program ini disimpan sebagai sumber daya dikemas. Jika file Anda mencoba untuk membuka sebuah perpustakaan link dinamis, OllyDbg otomatis ekstrak loaddll.exe dan mulai itu, melewati nama perpustakaan sebagai parameter.
Dengan bantuan loaddll, Anda dapat memanggil fungsi-fungsi yang diekspor oleh perpustakaan debugged. Saya akan menjelaskan fitur ini pada contoh fungsi API Windows 'MessageBox dan wsprintf yang berada di user32.dll.

Contoh 1: MessageBox

1. Memuat DLL dalam cara yang sama seperti biasa. File exe. OllyDbg mengeluarkan peringatan:

Request to load DLL

Tentu saja, kita menjawab dengan "Ya". OllyDbg mulai loaddll, perpustakaan beban dan jeda pada breakpoint yang segera preceeds loop jendela utama. Alamat ini diberi label sebagai Firstbp. Kemudian OllyDbg menganalisis DLL dan menampilkan kode. Perhatikan bahwa Windows secara otomatis mengeksekusi kode DLL startup ketika DLL dimuat ke memori.

2. Dari menu utama, pilih "Debug | ekspor Panggil DLL". Dialog muncul adalah non-modal, sehingga Anda masih memiliki akses penuh ke semua fitur OllyDbg. Anda dapat menelusuri kode dan data, breakpoints set, memodifikasi memori dan sebagainya.

3. Pilih fungsi yang ingin Anda panggil. Kami akan mulai dengan MessageBox. Perhatikan bahwa nama ini adalah generik, pada kenyataannya ada versi ASCII MessageBoxA dan UNICODE versi MessageBoxW. Mari kita coba dengan yang kedua. Seperti yang kita pilih itu, persegi panjang ke kanan mengatakan: Jumlah argumen: 4. Analyzer menetapkan bahwa fungsi berakhir dengan RET 10 dan jumlah benar diakui parameter. RET nnn khas untuk fungsi-fungsi yang menggunakan konvensi pemanggilan PASCAL (parameter yang berlalu di stack, parameter pertama didorong terakhir, fungsi menghapus parameter setelah panggilan). Windows yang paling 'API fungsi PASCAL-gaya.

4. Mengatur jumlah argumen tumpukan. Dalam kasus kami ini tidak diperlukan, karena OllyDbg sudah tahu jumlah argumen dalam panggilan ke MessageBoxW. Tapi, tentu saja, Anda dapat mengganti keputusan ini kapan saja dengan mengklik kotak centang yang sesuai ke kiri.

5. Isi daftar argumen. Dialog ini mendukung hingga 10 parameter tumpukan. Parameter adalah setiap ekspresi yang valid yang tidak menggunakan register. Jika poin operan ke memori, Dump jendela ke kanan dari argumen menampilkan isi memori ini Loaddll.exe cadangan 10 buffer memori, 1 K masing-masing, dicap sebagai Arg1 .. Arg10, bahwa Anda dapat dengan bebas menggunakan untuk tujuan apapun.. Selain itu, dialog mendukung dua pseudovariables: menangani dari <Hwnd> orangtua jendela diciptakan oleh loaddll.exe dan menangani dari <Hinst> contoh loaddll 's. Untuk kenyamanan Anda, bila Anda menggunakan ekspor Panggilan untuk pertama kalinya, OllyDbg menambahkan mereka ke daftar sejarah.
MessageBoxW mengharapkan 4 parameter:
  • menangani jendela pemilik. Di sini, kita hanya pilih <Hwnd>;
  • alamat teks UNICODE dalam kotak pesan. Pilih Arg2 dan tekan Enter. Dump menampilkan isi buffer memori dalam format heksadesimal. Penyangga ini awalnya diisi dengan nol. Klik kanan pada Dump dan pilih "Text | UNICODE (32 chars)" presentasi. Pilih karakter pertama dan tekan Ctrl + E (atau, sebaliknya, pilih "Binary | Edit" dari menu). Pada, tipe window "Teks dalam kotak" muncul atau teks lainnya untuk menampilkan;
  • alamat judul UNICODE dari kotak pesan. Pilih Arg3 dan menulis "judul Kotak" dalam format UNICODE memori menunjuk;
  • gaya kotak pesan sebagai kombinasi dari konstanta MB_xxx. OllyDbg tahu mereka, ketik di sini MB_OK | MB_ICONEXCLAMATION.
6. Set mendaftar argumen. Daftar argumen jarang dalam fungsi diekspor. Namun demikian, dukungan OllyDbg mendaftar argumen, juga.

7. Pilih opsi. Sembunyikan panggilan berarti bahwa kotak dialog harus menghilang dari layar ketika fungsi dijalankan. Opsi ini berguna saat eksekusi membutuhkan waktu yang signifikan, atau jika Anda mengatur breakpoints. Anda juga dapat menutup dialog secara manual. Bila fungsi disebut selesai eksekusi, OllyDbg otomatis akan membuka kembali ekspor Panggil. Jeda setelah panggilan berarti bahwa aplikasi debugged akan berhenti setelah eksekusi.
Jika semuanya dilakukan dengan benar, dialog akan terlihat seperti gambar ini:

Before call

8. Memanggil fungsi dengan menekan Call OllyDbg otomatis backup semua Dumps, memverifikasi dan menghitung parameter dan register, menghilangkan dialog dari layar dan kemudian memanggil MessageBoxW.. Seperti yang diharapkan, kotak pesan muncul di layar:

Message box

Bingo! Tekan OK. MessageBoxW kembali dan Call ekspor sukses laporan. Perhatikan bahwa sekembalinya EAX berisi 1. Ini adalah nilai numerik dari IDOK konstan ("OK ditekan"). Ini adalah sederhana, bukan?

Contoh 2: wsprintf

1. Pilih fungsi. Saya berharap, ekspor Panggilan masih terbuka? Seperti MessageBox, wsprintf juga memiliki dua bentuk: ASCII wsprintfA dan UNICODE wsprintfW. Kami akan bermain dengan bentuk ASCII nya. Seperti wsprintf menerima jumlah variabel argumen, menggunakan C konvensi pemanggilan. Perbedaan utama dari PASCAL adalah bahwa hal itu adalah tanggung jawab memanggil kode untuk membersihkan tumpukan dari parameter setelah panggilan. Fungsi C berakhir dengan RET dan Analyzer tidak dapat menentukan jumlah argumen.

2. Mengatur jumlah argumen tumpukan wsprintfA memiliki jumlah variabel argumen,. Berapa banyak - tergantung pada format string. Mari kita coba panggilan berikut:
wsprintf (Arg1, "Arg3 =% i, Arg4 =% 08X", 100,0 x12345678);
Seperti yang Anda lihat, kami memiliki 4 argumen, jadi klik pada kotak centang "4".

3. Isi daftar argumen.
  • Argumen pertama adalah buffer. Pilih <Arg1> dan mengubah format dump untuk ASCII (32 chars);
  • Argumen kedua adalah format string. Pilih <Arg2> dan mengubah dump untuk ASCII (32 karakter). Pilih karakter pertama, tekan Ctrl + E (biner edit) dan jenis format string di bidang ASCII;
  • Argumen ketiga adalah 100 konstanta desimal. Secara default, OllyDbg mengasumsikan format heksadesimal. Titik desimal di akhir desimal pasukan konstan;
  • Argumen keempat adalah konstanta heksadesimal, ketik saja seperti. OllyDbg menerima segala bentuk: 0x12345678, 12345678h atau hanya 12345678;
4. Memanggil fungsi. Jika semuanya dilakukan dengan benar, Anda akan mendapatkan hasil sebagai berikut:

Result of call to wsprintfA

Karakter disorot dalam dump Arg1 adalah yang dimodifikasi oleh panggilan. Dalam register EAX, wsprintf kembali jumlah karakter dalam string output: 0x17 (desimal 23.).

Rincian dan sumber

loaddll. exe adalah aplikasi Win32 kompak ditulis dalam Assembler. Silahkan lihat pada kode sumbernya di sini . Eksekusi dimulai pada MULAI. Loaddll mendapatkan baris perintah, melompat nama executable (harus diambil dalam tanda kutip ganda!), Ekstrak path ke DLL dan lolos ke LoadLibrary. Pada kesalahan, ia menempatkan pointer ke pesan kesalahan pada lokasi tetap dan keluar dengan kode 0x1001. Pada keberhasilan, menciptakan jendela utama sederhana dan jeda pada Firstbp. Breakpoint ini diatur oleh OllyDbg pada startup.
Semua komunikasi dengan OllyDbg dilakukan melalui daerah penghubung 128-byte. Daerah ini harus dimulai di alamat 0x420020 segera setelah keyphrase. Beberapa kata pertama berisi alamat di loaddll.exe digunakan oleh OllyDbg untuk mengatur breakpoints dan parameter, diikuti dengan alamat fungsi untuk memanggil, isi register, jumlah argumen dan argumen itu sendiri. Jumlah argumen dibatasi hingga 10. Jika argumen adalah pointer ke memori, Anda dapat menggunakan 10 buffer data, 1 Kbyte masing-masing, yaitu sebagai Arg1, Arg2, ..., Arg10. Ini dan beberapa nama lainnya yang diekspor dan dengan demikian dikenal OllyDbg.
Ketika loaddll melewati jendela utama loop (WINLOOP), terus-menerus memeriksa apakah alamat fungsi diekspor dalam PROCADR tidak 0. Jika hal ini terjadi, loaddll menghemat isi ESP dan EBP dan mendorong 16 nol ke dalam stack. Hal ini diperlukan untuk menghindari kecelakaan jika pengguna menentukan valid sejumlah argumen. Kemudian mendorong argumen dan register set. Pada Prepatch alamat ada 16 NOP s yang dapat Anda gunakan untuk patch kecil. Jika Anda memerlukan lebih banyak ruang, Anda dapat melompat ke Patcharea 2 Kbytes panjang. Perhatikan bahwa OllyDbg tidak ekstrak loaddll.exe dari sumber daya jika file dengan nama ini sudah ada.
Pada CallDLL ekspor disebut. Perintah ini diikuti oleh 16 NOP s. Kemudian rutin menghemat register dimodifikasi dan offset ESP setelah panggilan. Jika Anda menyediakan nomor yang tidak valid argumen untuk PASCAL-fungsi gaya, OllyDbg akan dapat melaporkan kesalahan ini kepada Anda. Akhirnya, loaddll mengembalikan ESP dan EBP, nol PROCADR dan istirahat di INT3 di alamat Selesai. Ketika titik ini tercapai, OllyDbg tahu eksekusi itu selesai.
Perlakukan LOADDLL.ASM sebagai freeware. Saya tidak akan protes jika Anda menggunakan program ini sebagai bagian keseluruhan atau (tanpa hak cipta) dalam program Anda sendiri. Tapi jangan berani menggunakan Bug Hijau (LOADDLL.RC) dalam proyek-proyek yang tidak berhubungan dengan OllyDbg! Itu saja untuk saat ini, nikmatilah!
Download Ollydbg 1.10 disini
Download Cmdline 1.10 disini
Download Plugin 1.10    disini
Download Ollydbg 2.00 disini 

Lihat sumber asli artikel klik DISINI

2 komentar:

  1. Pendatang baru ingin belajar, Gan cara merubah suatu software.Trus menentukan stingnya harus gmana? apa perlu software lagi? Ke whimawan56@gmail.com Gan email ana. Tpi yg bagus lgi dishare di blog ana yakin banyak yg pengin belajar.

    BalasHapus
  2. mana ngarti dia. pake translator yak..

    BalasHapus