Saya mencoba mempelajari tentang rekayasa balik, menggunakan Minesweeper sebagai aplikasi sampel. Saya telah menemukan artikel MSDN ini pada perintah WinDbg sederhana yang mengungkapkan semua tambang tetapi sudah lama, tidak dijelaskan secara detail dan sebenarnya bukan yang saya cari.
Saya memiliki IDA Pro disassembler dan debugger WinDbg dan saya telah memuat winmine.exe ke keduanya. Dapatkah seseorang memberikan beberapa tip praktis untuk salah satu program ini dalam hal menemukan lokasi struktur data yang mewakili bidang tambang?
Di WinDbg saya dapat mengatur breakpoints, tetapi sulit bagi saya untuk membayangkan di titik mana untuk mengatur breakpoint dan di lokasi memori apa. Demikian pula, ketika saya melihat kode statis di IDA Pro, saya tidak yakin harus mulai dari mana untuk menemukan fungsi atau struktur data yang mewakili bidang tambang.
Apakah ada Insinyur Terbalik di Stackoverflow yang dapat mengarahkan saya ke arah yang benar?
sumber
Jawaban:
Bagian 1 dari 3
Jika Anda serius dalam rekayasa balik - lupakan trainer dan cheat engine.
Reverse engineer yang baik harus terlebih dahulu mengenal OS, fungsi API inti, struktur umum program (apa itu run loop, struktur windows, rutinitas penanganan acara), format file (PE). "Pemrograman Windows" klasik Petzold dapat membantu (www.amazon.com/exec/obidos/ISBN=157231995X) serta MSDN online.
Pertama, Anda harus memikirkan di mana rutinitas inisialisasi ladang ranjau dapat dipanggil. Saya berpikir untuk mengikuti:
Saya memutuskan untuk memeriksa perintah akselerator F2.
Untuk menemukan kode penanganan akselerator, Anda akan menemukan prosedur penanganan pesan jendela (WndProc). Itu dapat dilacak dengan panggilan CreateWindowEx dan RegisterClass.
Untuk membaca:
Buka IDA, jendela Impor, cari "CreateWindow *", lompat ke sana dan gunakan perintah "Jump xref to operand (X)" untuk melihat di mana ia dipanggil. Seharusnya hanya ada satu panggilan.
Sekarang lihat di atas untuk fungsi RegisterClass dan parameternya WndClass.lpfnWndProc. Saya sudah menamai fungsi mainWndProc dalam kasus saya.
Tekan Enter pada nama fungsi (gunakan 'N' untuk mengganti namanya menjadi sesuatu yang lebih baik)
Sekarang lihatlah
Ini adalah id pesan, yang jika menekan tombol F2 harus berisi nilai WM_COMMAND. Anda akan menemukan di mana ia dibandingkan dengan 111h. Ini dapat dilakukan baik dengan menelusuri edx di IDA atau dengan mengatur breakpoint bersyarat di WinDbg dan menekan F2 di game.
Either way mengarah ke sesuatu seperti
Klik kanan pada 111h dan gunakan "Konstanta simbolik" -> "Gunakan konstanta simbolik standar", ketik WM_ dan Enter. Anda sekarang harus punya
Ini adalah cara mudah untuk mengetahui nilai id pesan.
Untuk memahami penanganan akselerator, lihat:
Cukup banyak teks untuk satu jawaban. Jika Anda tertarik, saya dapat menulis beberapa posting lagi. Singkat cerita ladang ranjau disimpan sebagai array byte [24x36], 0x0F menunjukkan bahwa byte tidak digunakan (bermain bidang yang lebih kecil), 0x10 - bidang kosong, 0x80 - tambang.
Bagian 2 dari 3
Oke, mari kita lanjutkan dengan tombol F2.
Menurut Menggunakan Akselerator Keyboard saat tombol F2 ditekan fungsi wndProc
Ok, kami sudah menemukan di mana WM_COMMAND diproses, tetapi bagaimana menentukan nilai parameter wParam yang sesuai? Di sinilah Resource Hacker berperan. Beri makan dengan biner dan itu menunjukkan semuanya. Seperti tabel akselerator bagi saya.
teks alt http://files.getdropbox.com/u/1478671/2009-07-29_161532.jpg
Anda dapat melihat di sini, bahwa tombol F2 sesuai dengan 510 di wParam.
Sekarang mari kembali ke kode, yang menangani WM_COMMAND. Ini membandingkan wParam dengan konstanta yang berbeda.
Gunakan menu konteks atau pintasan keyboard 'H' untuk menampilkan nilai desimal dan Anda dapat melihat lompatan kami
Ini mengarah ke potongan kode yang memanggil beberapa proc dan keluar dari wndProc.
Apakah itu fungsi yang memulai permainan baru? Temukan itu di bagian terakhir! Tetap disini.
Bagian 3 dari 3
Mari kita lihat bagian pertama dari fungsi itu
Ada dua nilai (dword_10056AC, uValue) yang dibaca ke register eax dan ecx dan dibandingkan dengan dua nilai lainnya (dword_1005164, dword_1005338).
Lihatlah nilai aktual menggunakan WinDBG ('bp 01003696'; saat break 'p eax; p ecx') - mereka tampak seperti dimensi ladang ranjau bagi saya. Bermain dengan ukuran lapangan ranjau khusus menunjukkan bahwa pasangan pertama adalah dimensi baru dan dimensi kedua saat ini. Mari tentukan nama baru.
Beberapa saat kemudian nilai baru menimpa arus dan subrutin dipanggil
Dan ketika saya melihatnya
Saya benar-benar yakin bahwa saya menemukan array ladang ranjau. Penyebab siklus yang terdiri dari larik panjang 360h byte (dword_1005340) dengan 0xF.
Mengapa 360h = 864? Ada beberapa petunjuk di bawah bahwa baris membutuhkan 32 byte dan 864 dapat dibagi dengan 32, sehingga array dapat menampung 27 * 32 sel (meskipun UI mengizinkan bidang maks 24 * 30, ada satu bantalan byte di sekitar array untuk batas).
Kode berikut menghasilkan batas atas dan bawah ladang ranjau (0x10 byte). Saya harap Anda dapat melihat iterasi loop dalam kekacauan itu;) Saya harus menggunakan kertas dan pena
Dan subrutin lainnya menggambar batas kiri dan kanan
Penggunaan cerdas perintah WinDBG dapat memberi Anda tempat pembuangan ladang ranjau yang keren (ukuran khusus 9x9). Lihat perbatasannya!
Hmm, sepertinya saya perlu postingan lain untuk menutup topik
sumber
Sepertinya Anda mencoba membongkar sumber tetapi yang perlu Anda lakukan adalah melihat ruang memori dari program yang sedang berjalan. Hex editor HxD memiliki fitur yang memungkinkan Anda melakukannya.
Setelah Anda berada di ruang memori, itu masalah mengambil snapshot dari memori saat Anda bermain-main dengan papan. Pisahkan apa yang berubah versus apa yang tidak. Saat Anda merasa memiliki pegangan di mana struktur data terletak di memori hex, coba edit saat berada di memori dan lihat apakah papan berubah sebagai hasilnya.
Proses yang Anda inginkan tidak berbeda dengan membangun 'pelatih' untuk video game. Itu biasanya didasarkan pada menemukan di mana nilai-nilai seperti kesehatan dan amunisi hidup dalam memori dan mengubahnya dengan cepat. Anda mungkin dapat menemukan beberapa tutorial bagus tentang cara membuat pelatih game.
sumber
Lihat artikel proyek kode ini, ini sedikit lebih mendalam daripada posting blog yang Anda sebutkan.
http://www.codeproject.com/KB/trace/minememoryreader.aspx
Edit
Dan artikel ini, meskipun bukan tentang penyapu ranjau secara langsung, memberi Anda panduan langkah demi langkah yang baik tentang berburu melalui memori menggunakan WinDbg:
http://www.codingthewheel.com/archives/extracting-hidden-text-with-windbg
Edit 2
Sekali lagi, ini bukan tentang penyapu ranjau, tetapi ini pasti memberi saya beberapa bahan untuk dipikirkan untuk debugging memori saya, ada banyak tutorial di sini:
http://memoryhacking.com/forums/index.php
Juga, unduh CheatEngine (disebutkan oleh Nick D.) dan selesaikan tutorial yang menyertainya.
sumber
Persis!
Nah, Anda bisa mencari rutinitas seperti random () yang akan dipanggil selama pembuatan tabel tambang. Buku ini banyak membantu saya ketika saya bereksperimen dengan rekayasa balik. :)
Secara umum, tempat yang baik untuk menetapkan break point adalah panggilan ke kotak pesan, panggilan untuk memutar suara, timer, dan rutinitas win32 API lainnya.
BTW, saya memindai penyapu ranjau sekarang dengan OllyDbg .
Pembaruan: nemo mengingatkan saya pada alat yang hebat, Mesin Curang oleh Eric "Dark Byte" Heijnen.
Cheat Engine (CE) adalah alat yang hebat untuk menonton dan memodifikasi ruang memori proses lainnya. Di luar fasilitas dasar itu , CE memiliki lebih banyak fitur khusus seperti melihat memori yang dibongkar dari suatu proses dan memasukkan kode ke dalam proses lain.
(nilai sebenarnya dari proyek itu adalah Anda dapat mengunduh kode sumber -Delphi- dan melihat bagaimana mekanisme tersebut diterapkan - Saya melakukannya beberapa tahun yang lalu: o)
sumber
Artikel yang cukup bagus tentang topik ini dapat ditemukan di Uninformed . Ini mencakup pembalikan Minesweeper (sebagai pengantar untuk merekayasa balik aplikasi Win32) dengan sangat detail dan ada di sekitar sumber yang cukup bagus.
sumber
Situs web ini mungkin lebih membantu:
http://www.subversity.net/reversing/hacking-minesweeper
Cara umum untuk melakukan ini adalah:
Menanggapi Bounty
Nah, pada bacaan kedua, sepertinya Anda menginginkan panduan tentang cara menggunakan debugger seperti WinDBG daripada pertanyaan biasa tentang cara merekayasa balik. Saya telah menunjukkan kepada Anda situs web yang memberi tahu Anda nilai-nilai yang perlu Anda cari, jadi pertanyaannya adalah, bagaimana Anda mencarinya?
Saya menggunakan Notepad dalam contoh ini karena saya tidak menginstal Minesweeper. Tapi idenya sama.
Anda mengetik
Tekan "?" Lalu "s" untuk melihat bantuan.
Setelah menemukan pola memori yang diinginkan, Anda dapat menekan alt + 5 untuk menampilkan penampil memori untuk tampilan yang bagus.
WinDBG membutuhkan waktu untuk membiasakan diri, tetapi sama baiknya dengan debugger lain di luar sana.
sumber
Poin yang bagus untuk memulai penelusuran di debugger adalah di mouse ke atas. Jadi temukan prosedur jendela utama (saya pikir alat seperti spyxx dapat memeriksa properti windows dan alamat event handler adalah salah satunya). Masuk ke dalamnya dan temukan di mana ia menangani peristiwa mouse - akan ada sakelar, jika Anda dapat mengenalinya di assembler (lihat nilai WM_XXX untuk mouse di windows.h).
Letakkan breakpoint di sana dan mulailah melangkah masuk Di suatu tempat antara waktu Anda melepaskan tombol mouse dan layar diperbarui, pemenang akan mengakses struktur data yang Anda cari.
Bersabarlah, cobalah untuk mengidentifikasi apa yang sedang dilakukan pada waktu tertentu, tetapi jangan repot-repot melihat terlalu jauh ke dalam kode yang Anda curigai tidak menarik untuk tujuan Anda saat ini. Mungkin diperlukan beberapa kali proses debugger untuk menyelesaikannya.
Pengetahuan tentang alur kerja aplikasi win32 normal juga membantu.
sumber
Tambang mungkin akan disimpan dalam semacam larik dua dimensi. Ini berarti bahwa itu adalah array pointer atau array gaya C tunggal boolean.
Setiap kali formulir menerima peristiwa mouse-up, struktur data ini direferensikan. Indeks akan dihitung menggunakan koordinat mouse, mungkin menggunakan pembagian integer. Itu berarti Anda mungkin harus mencari
cmp
instruksi yang sama atau serupa, di mana salah satu operan dihitung menggunakan offset danx
, di manax
adalah hasil kalkulasi yang melibatkan pembagian integer. Offset kemudian akan menjadi penunjuk ke awal struktur data.sumber
Cukup masuk akal untuk mengasumsikan bahwa informasi tentang tambang diletakkan secara berdekatan dalam memori setidaknya untuk baris (yaitu, itu adalah larik 2D, atau larik-larik). Jadi, saya akan mencoba membuka beberapa sel yang berdekatan di baris yang sama, membuat proses dump memori saat saya pergi, dan kemudian membedakannya dan mencari setiap perubahan berulang di wilayah memori yang sama (yaitu 1 byte diubah pada langkah pertama, berikutnya byte berubah menjadi nilai yang sama persis pada langkah berikutnya, dll).
Ada juga kemungkinan bahwa itu adalah array bit yang dikemas (3 bit per tambang harus cukup untuk merekam semua kemungkinan status - tertutup / terbuka, milik saya / tidak ada tambang, ditandai / tidak ditandai), jadi saya akan memeriksanya juga ( polanya juga akan berulang, meski lebih sulit dikenali). Tapi itu bukan struktur yang nyaman untuk ditangani, dan menurut saya penggunaan memori bukanlah penghambat bagi Minesweeper, jadi kecil kemungkinan hal semacam ini akan digunakan.
sumber
Meskipun tidak sepenuhnya merupakan "alat rekayasa terbalik", dan lebih merupakan mainan yang bahkan orang idiot seperti saya bisa gunakan, lihat Cheat Engine . Itu membuatnya agak mudah untuk melacak bagian memori mana yang telah berubah, kapan, dan bahkan memiliki ketentuan untuk melacak bagian memori yang diubah melalui pointer (meskipun Anda mungkin tidak membutuhkannya). Sebuah tutorial interaktif yang bagus disertakan.
sumber