Bagaimana saya bisa menemukan struktur data yang mewakili tata letak tambang Minesweeper dalam memori?


94

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?


27
Ide yang bagus untuk tugas bagi siswa. Ini seperti laboratorium anatomi dengan penyapu ranjau sebagai kucing.
ojblass

3
Bagi pembaca internasional kami yang mungkin bingung, kapal penyapu ranjau adalah versi Amerika dari permainan menemukan bunga bahagia yang dikirimkan dengan windows vista. microsoft.blognewschannel.com/index.php/archives/2006/09/28/…
Kip

16
Selamat mencari bunga? O_o Kebenaran politik sudah terlalu jauh.
Eugene

10
Nah, versi penyapu ranjau adalah default setidaknya di Vista versi Swedia. Saya kira mereka default ke versi bunga-bahagia di tempat-tempat di mana ranjau sebenarnya cenderung meledakkan anak-anak.
JesperE

1
Jadi ... hanya mengklik beberapa kotak acak untuk melihat apakah itu tambang tidak membantu untuk ini, ya?
Smandoli

Jawaban:


125

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:

  • Saat Anda meluncurkan game
  • Saat Anda mengklik wajah bahagia
  • Saat Anda mengklik Game-> Baru atau tekan F2
  • Saat Anda mengubah tingkat kesulitan

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.

.text:0100225D                 mov     [ebp+WndClass.lpfnWndProc], offset mainWndProc
.text:01002264                 mov     [ebp+WndClass.cbClsExtra], edi
.text:01002267                 mov     [ebp+WndClass.cbWndExtra], edi
.text:0100226A                 mov     [ebp+WndClass.hInstance], ecx
.text:0100226D                 mov     [ebp+WndClass.hIcon], eax

.text:01002292                 call    ds:RegisterClassW

Tekan Enter pada nama fungsi (gunakan 'N' untuk mengganti namanya menjadi sesuatu yang lebih baik)

Sekarang lihatlah

.text:01001BCF                 mov     edx, [ebp+Msg]

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

.text:01001D5B                 sub     eax, 111h
.text:01001D60                 jz      short loc_1001DBC

Klik kanan pada 111h dan gunakan "Konstanta simbolik" -> "Gunakan konstanta simbolik standar", ketik WM_ dan Enter. Anda sekarang harus punya

.text:01001D5B                 sub     eax, WM_COMMAND
.text:01001D60                 jz      short loc_1001DBC

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

... menerima pesan WM_COMMAND atau WM_SYSCOMMAND. Kata urutan rendah dari parameter wParam berisi pengenal akselerator.

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.

.text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
.text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
.text:01001DC0                 mov     ecx, 210h
.text:01001DC5                 cmp     eax, ecx
.text:01001DC7                 jg      loc_1001EDC
.text:01001DC7
.text:01001DCD                 jz      loc_1001ED2
.text:01001DCD
.text:01001DD3                 cmp     eax, 1FEh
.text:01001DD8                 jz      loc_1001EC8

Gunakan menu konteks atau pintasan keyboard 'H' untuk menampilkan nilai desimal dan Anda dapat melihat lompatan kami

.text:01001DBC HandleWM_COMMAND:                       ; CODE XREF: mainWndProc+197j
.text:01001DBC                 movzx   eax, word ptr [ebp+wParam]
.text:01001DC0                 mov     ecx, 528
.text:01001DC5                 cmp     eax, ecx
.text:01001DC7                 jg      loc_1001EDC
.text:01001DC7
.text:01001DCD                 jz      loc_1001ED2
.text:01001DCD
.text:01001DD3                 cmp     eax, 510
.text:01001DD8                 jz      loc_1001EC8 ; here is our jump

Ini mengarah ke potongan kode yang memanggil beberapa proc dan keluar dari wndProc.

.text:01001EC8 loc_1001EC8:                            ; CODE XREF: mainWndProc+20Fj
.text:01001EC8                 call    sub_100367A     ; startNewGame ?
.text:01001EC8
.text:01001ECD                 jmp     callDefAndExit  ; default

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

.text:0100367A sub_100367A     proc near               ; CODE XREF: sub_100140C+CAp
.text:0100367A                                         ; sub_1001B49+33j ...
.text:0100367A                 mov     eax, dword_10056AC
.text:0100367F                 mov     ecx, uValue
.text:01003685                 push    ebx
.text:01003686                 push    esi
.text:01003687                 push    edi
.text:01003688                 xor     edi, edi
.text:0100368A                 cmp     eax, dword_1005334
.text:01003690                 mov     dword_1005164, edi
.text:01003696                 jnz     short loc_10036A4
.text:01003696
.text:01003698                 cmp     ecx, dword_1005338
.text:0100369E                 jnz     short loc_10036A4

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.

.text:0100367A startNewGame    proc near               ; CODE XREF: handleButtonPress+CAp
.text:0100367A                                         ; sub_1001B49+33j ...
.text:0100367A                 mov     eax, newMineFieldWidth
.text:0100367F                 mov     ecx, newMineFieldHeight
.text:01003685                 push    ebx
.text:01003686                 push    esi
.text:01003687                 push    edi
.text:01003688                 xor     edi, edi
.text:0100368A                 cmp     eax, currentMineFieldWidth
.text:01003690                 mov     dword_1005164, edi
.text:01003696                 jnz     short loc_10036A4
.text:01003696
.text:01003698                 cmp     ecx, currentMineFieldHeight
.text:0100369E                 jnz     short loc_10036A4

Beberapa saat kemudian nilai baru menimpa arus dan subrutin dipanggil

.text:010036A7                 mov     currentMineFieldWidth, eax
.text:010036AC                 mov     currentMineFieldHeight, ecx
.text:010036B2                 call    sub_1002ED5

Dan ketika saya melihatnya

.text:01002ED5 sub_1002ED5     proc near               ; CODE XREF: sub_1002B14:loc_1002B1Ep
.text:01002ED5                                         ; sub_100367A+38p
.text:01002ED5                 mov     eax, 360h
.text:01002ED5
.text:01002EDA
.text:01002EDA loc_1002EDA:                            ; CODE XREF: sub_1002ED5+Dj
.text:01002EDA                 dec     eax
.text:01002EDB                 mov     byte ptr dword_1005340[eax], 0Fh
.text:01002EE2                 jnz     short loc_1002EDA

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

.text:01002EE4                 mov     ecx, currentMineFieldWidth
.text:01002EEA                 mov     edx, currentMineFieldHeight
.text:01002EF0                 lea     eax, [ecx+2]
.text:01002EF3                 test    eax, eax
.text:01002EF5                 push    esi
.text:01002EF6                 jz      short loc_1002F11    ; 
.text:01002EF6
.text:01002EF8                 mov     esi, edx
.text:01002EFA                 shl     esi, 5
.text:01002EFD                 lea     esi, dword_1005360[esi]
.text:01002EFD
.text:01002F03 draws top and bottom borders
.text:01002F03 
.text:01002F03 loc_1002F03:                            ; CODE XREF: sub_1002ED5+3Aj
.text:01002F03                 dec     eax
.text:01002F04                 mov     byte ptr MineField?[eax], 10h ; top border
.text:01002F0B                 mov     byte ptr [esi+eax], 10h       ; bottom border
.text:01002F0F                 jnz     short loc_1002F03
.text:01002F0F
.text:01002F11
.text:01002F11 loc_1002F11:                            ; CODE XREF: sub_1002ED5+21j
.text:01002F11                 lea     esi, [edx+2]
.text:01002F14                 test    esi, esi
.text:01002F16                 jz      short loc_1002F39

Dan subrutin lainnya menggambar batas kiri dan kanan

.text:01002F18                 mov     eax, esi
.text:01002F1A                 shl     eax, 5
.text:01002F1D                 lea     edx, MineField?[eax]
.text:01002F23                 lea     eax, (MineField?+1)[eax+ecx]
.text:01002F23
.text:01002F2A
.text:01002F2A loc_1002F2A:                            ; CODE XREF: sub_1002ED5+62j
.text:01002F2A                 sub     edx, 20h
.text:01002F2D                 sub     eax, 20h
.text:01002F30                 dec     esi
.text:01002F31                 mov     byte ptr [edx], 10h
.text:01002F34                 mov     byte ptr [eax], 10h
.text:01002F37                 jnz     short loc_1002F2A
.text:01002F37
.text:01002F39
.text:01002F39 loc_1002F39:                            ; CODE XREF: sub_1002ED5+41j
.text:01002F39                 pop     esi
.text:01002F3A                 retn

Penggunaan cerdas perintah WinDBG dapat memberi Anda tempat pembuangan ladang ranjau yang keren (ukuran khusus 9x9). Lihat perbatasannya!

0:000> db /c 20 01005340 L360
01005340  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005360  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005380  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053a0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053c0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010053e0  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005400  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005420  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005440  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005460  10 0f 0f 0f 0f 0f 0f 0f-0f 0f 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
01005480  10 10 10 10 10 10 10 10-10 10 10 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054a0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054c0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................
010054e0  0f 0f 0f 0f 0f 0f 0f 0f-0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f  ................................

Hmm, sepertinya saya perlu postingan lain untuk menutup topik


1
@Stanislav, jawaban yang bagus untuk Stanislav. Jika Anda dapat menguraikannya sama sekali, lakukanlah. Jawaban yang panjang dan informatif ini adalah yang terbaik. Mungkin sedikit lebih banyak tentang bagaimana Anda memusatkan perhatian pada struktur data ladang ranjau?
KingNestor

@Stanislav, saya telah menerima jawaban Anda karena bounty 250 rep telah berakhir. Selamat!
KingNestor

1
@Stanislav, saya telah mengedit jawaban multi-bagian Anda menjadi satu jawaban. Anda belum mendekati batas ukuran jawaban tunggal Anda dan menurut saya biasanya lebih disukai untuk memiliki satu jawaban daripada memposting beberapa. Jangan ragu untuk mengedit jawaban asli Anda (yang ini) dan menambahkannya sesuai keinginan Anda.
mmcdole

2
Juga, jawaban epik Stanislav. Terima kasih banyak atas kerja keras Anda!
mmcdole

15

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.

http://www.freeimagehosting.net/uploads/fcc1991162.png

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.


2
Nah, Anda ~ dapat ~ menemukan lokasi memori melalui pembongkaran statis. Anda dapat mengikuti instruksi perakitan dengan mencari hal-hal seperti fungsi rand () yang dipanggil untuk menghasilkan ladang ranjau dan kemudian menelusuri dari sana untuk melihat di lokasi mana field tersebut disimpan dalam memori (dan bagaimana).
mmcdole

Kedua pendekatan itu menantang. Saya sudah mencoba membongkar aplikasi di masa lalu dan saya merasa sangat menyakitkan. Bagaimana tepatnya Anda melihat fungsi rand ()?
James McMahon

Terima kasih atas jawaban Anda nemo.
KingNestor

11

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.


9

"Di WinDbg saya dapat mengatur breakpoint, tetapi sulit bagi saya untuk membayangkan di titik mana untuk menetapkan 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. "

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)


5

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.


4

Situs web ini mungkin lebih membantu:

http://www.subversity.net/reversing/hacking-minesweeper

Cara umum untuk melakukan ini adalah:

  1. Entah bagaimana mendapatkan kode sumber.
  2. Bongkar dan harap simbol sisa dapat membantu Anda.
  3. Tebak tipe datanya dan coba untuk memanipulasinya dan gunakan pemindai memori untuk membatasi kemungkinan.

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.

teks alt

Anda mengetik

s <options> <memory start> <memory end> <pattern>

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.

teks alt

WinDBG membutuhkan waktu untuk membiasakan diri, tetapi sama baiknya dengan debugger lain di luar sana.


1
"Entah bagaimana mendapatkan kode sumber" adalah pernyataan konyol karena Minesweeper dikirim tanpa sumber. Dan rekayasa balik dengan sumber bukanlah rekayasa balik ... itu analisis kode sumber.
mrduclaw

@mrduclaw ada aplikasi yang dapat mendekompilasi assembly menjadi bahasa sumber. Tidak ada istilah yang disebut "analisis kode sumber".
Tidak diketahui

1
@Tidak Diketahui Ada aplikasi yang mencoba merekonstruksi program dalam bahasa sumber dari biner terkompilasi yang diberikan. Tetapi Anda tidak bisa mendapatkan "kode sumber" dengan komentar dan kutipan penulis dari biner yang dikompilasi. Tentu, beberapa dari "pengurai" melakukan pekerjaan yang lebih baik daripada yang lain tetapi mereka tidak memberi Anda kode yang ditulis oleh pembuatnya (kode yang dioptimalkan untuk kompilator seringkali sangat berbeda dari kode pemrogram). Dan apakah Anda belum pernah melakukan pengujian jaminan kualitas? Apa yang dilakukan alat seperti PREfast dan Sparse? Analisis kode sumber statis.
mrduclaw

Analisis kode sumber statis dalam PREfast dan Sparse sama sekali berbeda dari membaca kode yang didekompilasi secara manual untuk meretasnya. Saya tidak berpikir ada orang yang akan mengacaukan kedua ide yang berbeda itu satu sama lain.
Tidak diketahui

@Tidak Diketahui Saya mengambil satu lebih jauh dan setuju bahwa Anda tidak boleh bingung dengan pembongkaran reverse engineering dengan melihat kode sumber (didekompilasi atau sebaliknya, jika Anda memiliki sumber, Anda melakukan analisis kode sumber). Itulah intinya. Jadi tolong, berhentilah membingungkan keduanya. :)
mrduclaw

0

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.


0

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 cmpinstruksi yang sama atau serupa, di mana salah satu operan dihitung menggunakan offset dan x, di mana xadalah hasil kalkulasi yang melibatkan pembagian integer. Offset kemudian akan menjadi penunjuk ke awal struktur data.


0

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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.