SORU
31 Mayıs 2009, Pazar


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
24 Temmuz 2009, Cuma


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:

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:

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.

alt text

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • circuschina

    circuschina

    16 Mart 2007
  • infodirt

    infodirt

    11 Mart 2009
  • Kat Krazy

    Kat Krazy

    12 Kasım 2010