Nasıl bellek mayın Tarlası mayın düzeni temsil eden bir veri yapısı bulabilirim?
Tersine mühendislik, örnek bir uygulama olarak mayın Tarlası kullanarak öğrenmeye çalışıyorum. Tüm mayınları gösteren basit bir komut WinDbg MSDN article bunu buldum ama aradığım şey eski, herhangi bir ayrıntılı olarak açıklanmıştır değil, gerçekten değil.
IDA Pro disassembler WinDbg debugger var ve ikisini de içine winmine.exe yükledim. Biri benimkini alanını temsil eden bir veri yapısının yer bulmak açısından bu programlardan biri için bazı pratik ipuçları sağlayabilir?
WinDbg kesme noktası ayarlamak edebilirim, ama benim konum bellek ne bir kesme noktası ayarlamak için ne hayal etmek zordur. IDA kod statik Pro baktığım zaman, benzer şekilde, benim bile alanını temsil eden bir işlev ya da veri yapısı bulmak için nereden başlayacağımdan emin değilim.
Doğru yönde bana gelin bu Stackoverflow üzerinde herhangi bir Ters Mühendisleri var mı?
CEVAP
Bölüm 1 / 3
Eğer tersine mühendislik konusunda ciddi iseniz - eğitici unutup motorları hile.
İyi ters mühendislik ilk işletim sistemi, çekirdek API işlevleri, program genel yapısı döngü, windows yapılar, olay yordamları çalıştırmak (), dosya biçimi (PE) tanımak gerekir. Petzold klasikleri "Windows Programlama" yardımcı olabilir (www.amazon.com/exec/obidos/ISBN=157231995X) yanı sıra online MSDN.
İlk nerede mayın tarlası başlatma yordamı çağrılabilir düşünmelisin. Aşağıdaki düşündüm:
- Ne zaman oyunu başlatmak
- Mutlu yüz ' ı tıklatın
- Sen Oyun -^ ' ı tıklatın . Yeni veya F2 tuşuna basın
- Zorluk düzeyini değiştirmek
F2 hızlandırıcı komuta kontrol etmek için karar verdi.
Hızlandırıcı işleme kodunu bulmak için pencere yordamı ileti (Nedenle) kullanım bulmak. Gönderilen mesaj içersinde ve RegisterClass çağrıları tarafından izlenebilmesi.
Okumak için:
- http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx gönderilen mesaj içersinde
- http://msdn.microsoft.com/en-us/library/ms633586(VS.85).aspx RegisterClass
- Petzold "Windows ve Mesajlar" . Bölüm 3
IDA, İthalat pencereyi aç," atlamak ve "işlenen (X)" komutu nerede olduğunu görmek için. Atlamak xref "Kuyruk* bul Sadece bir telefon olmalı.
Şimdi RegisterClass fonksiyonu yukarıdaki arayın ve parametre Parametre.lpfnWndProc. Zaten benim durumumda işlevi mainWndProc adında.
.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
Fonksiyonun adını Girin vurmak ('N' daha iyi bir şey için yeniden adlandırın
Şimdi de bir bak
.text:01001BCF mov edx, [ebp Msg]
Bu F2 tuşuna basınız durumunda WM_COMMAND değer içermelidir ileti kimliği. 111h göre nerede olduğunu bulmak için. Oyunda WinDbg ve F2 tuşuna basarak setting conditional breakpoint IDA içinde edx izleme ile ya da yapılabilir.
Ya da böyle bir şeye yol açıyor
.text:01001D5B sub eax, 111h
.text:01001D60 jz short loc_1001DBC
111h ve kullanımı ile ilgili "sabit" ->Sembolik sağ tıklayın "Kullanım standart sembolik sabit" yazın WM_ ve Girin. Geri gelmiş olması lazım
.text:01001D5B sub eax, WM_COMMAND
.text:01001D60 jz short loc_1001DBC
İleti kimliği değerleri bulmak için kolay bir yol.
Hızlandırıcı işleme onay anlamak için:
- Using Keyboard Accelerators
- Resource hacker (http://angusj.com/resourcehacker/)
Tek bir cevap için bir metin bu oldukça fazla. Eğer ilgileniyorsanız mesaj bir kaç tane yazabilirim. Uzun lafın kısası mayın tarlası bayt dizisi olarak saklanan [24x36], 0x0F bayt (küçük oyun alanı), 0x10 - 0x80 - mayın tarlası boş değil kullanılan olduğunu gösterir.
3, Bölüm 2
Tamam, hadi git F2 tuşu ile bırakın.
F2 düğmesine basıldığında Using Keyboard Accelerators göre işlev nedenle
... bir WM_COMMAND ya da WM_SYSCOMMAND alır mesaj. En düşük sıralı sözcük her iki parametre içerir hızlandırıcı tanımlayıcısını.
Tamam, biz zaten WM_COMMAND işlenmiş olduğu, ancak karşılık gelen her iki parametre değerini belirlemek için nasıl bulundu? Bu Resource hacker devreye giriyor. İkili ile onu besleyeceğim, sana her şeyi gösterir. Gibi Hızlandırıcılar benim için bir masa.
F2 düğmesi her iki 510 karşılık gelen burada görebilirsiniz.
Şimdi kod dönelim, WM_COMMAND işler. Farklı sabitleri ile her iki karşılaştırır.
.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
Ya da 'H' klavye ondalık değerleri görüntülemek için kısayol ve bizim atlama görebilirsiniz . bağlam menüsünü kullanın
.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
Bazı proc ve çıkışları nedenle çağıran kod yığın yol açar.
.text:01001EC8 loc_1001EC8: ; CODE XREF: mainWndProc 20Fj
.text:01001EC8 call sub_100367A ; startNewGame ?
.text:01001EC8
.text:01001ECD jmp callDefAndExit ; default
Yeni bir oyun başlatır işlevi nedir? Bu son bölümde öğrenin! Bizi izlemeye devam edin.
Bölüm 3 3
Hadi bu işlevi ilk bölümünde bir göz atın
.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
İki değer () dword_10056AC, uValue ses kayıtları ve diğer iki değerleri () dword_1005164, dword_1005338 göre ecx okuyun.
Gerçek değerler WinDBG kullanarak bir göz ('bp 01003696'; break "p ses; p ecx') - benim için mayın tarlası boyutları gibi görünüyorlardı. Özel mayın tarlası oynamaktan boyutu ilk çift yeni boyutlar ve ikinci mevcut boyutları olduğunu gösterdi. Hadi yeni isimler ayarlayın.
.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
Daha sonra yeni değerler mevcut ve yordam denir üzerine
.text:010036A7 mov currentMineFieldWidth, eax
.text:010036AC mov currentMineFieldHeight, ecx
.text:010036B2 call sub_1002ED5
Ve o zaman gördüm
.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
Mayın tarlası dizi buldum tamamen emindim. 360h bayt uzunluğu dizi ınıts hangi döngüsünün neden (dword_1005340 ) 0xF.
Neden 360h = 864? Bazı ipuçları aşağıda satır alır 32 bayt ve 864 olabilir bölü 32, dizi tutabilir 27*32 hücre (gerçi UI sağlar max 24*30 alan, bir bayt doldurma etrafında dizi için sınırlar).
Aşağıdaki kod oluşturur. üst ve alt sınırları (0x10 bayt) mayın tarlası. Bu karmaşa içinde döngü tekrarında ;) görebilirsiniz umarım kağıt ve kalem kullanmak zorunda kaldım
.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
Ve yordam kalan sol ve sağ sınırları çizer
.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
WinDBG komutları akıllı kullanımı serin mayın tarlası dökümü (özel boyutu 9x9) sağlayabilir. Sınırları göz atın!
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, galiba konuyu kapatmak için başka bir yazı gerekir
Nasıl Symfony2 geçerli kullanıcıyı tem...
Nasıl bellek hextile/altıgen bir ızgar...
Nasıl veri yapısı okumak için .NSArray...
Nasıl Sturm ile Waldo bulabilirim?...
Veri bağlama Nasıl çalışır?AngularJS :...