Mayın Tarlası mayın düzenini gösteren veri yapısını bellekte nasıl bulabilirim?


94

Mayın Tarlası'nı örnek bir uygulama olarak kullanarak tersine mühendislik hakkında bilgi edinmeye çalışıyorum. Bu MSDN makalesini , tüm madenleri ortaya çıkaran basit bir WinDbg komutunda buldum , ancak eski, hiçbir ayrıntıda açıklanmadı ve gerçekten aradığım şey bu değil.

Ben IDA Pro Çözücü ve WinDbg hata ayıklayıcısını ve ben ikisini de içine winmine.exe yükledim. Maden sahasını temsil eden veri yapısının yerini bulma açısından bu programlardan herhangi biri için bazı pratik ipuçları verilebilir mi?

WinDbg'de kesme noktaları belirleyebilirim, ancak hangi noktada bir kesme noktası ve hangi bellek konumunda ayarlayacağımı hayal etmek benim için zor. Benzer şekilde, statik kodu IDA Pro'da görüntülediğimde, mayın alanını temsil eden işlevi veya veri yapısını nerede bulmaya başlayacağımı bile bilmiyorum.

Stackoverflow'da beni doğru yöne yönlendirebilecek Ters Mühendisler var mı?


27
Öğrenciler için bir ödev için ne harika bir fikir. Kedi olarak mayın tarama gemisi ile anatomi laboratuvarı gibi.
ojblass

3
Mayın Tarlası, uluslararası okuyucularımız için Windows Vista ile gelen mutlu çiçek bulma oyununun Amerikan versiyonu. microsoft.blognewschannel.com/index.php/archives/2006/09/28/…
Kip

16
Mutlu çiçek bulma oyunu? O_o Siyasi doğruluk çok ileri gitti.
Eugene

10
Mayın tarama gemisi sürümü, en azından Vista'nın İsveç sürümünde varsayılandır. Sanırım mayınların aslında çocukları parçalara ayırma eğiliminde olduğu yerlerde mutlu çiçekler versiyonunu kullanıyorlar.
JesperE

1
Öyleyse ... bazı rastgele karelere tıklamak, mayın olup olmadıklarını görmek için bu işe yaramaz, ha?
Smandoli

Yanıtlar:


125

Bölüm 1/3


Tersine mühendislik konusunda ciddiyseniz - eğitmenleri ve hile motorlarını unutun.

İyi bir tersine mühendis ilk önce işletim sistemini, temel API işlevlerini, program genel yapısını (çalıştırma döngüsü, Windows yapıları, olay işleme rutinleri), dosya formatını (PE) öğrenmelidir. Petzold'un klasikleri "Programlama Pencereleri" (www.amazon.com/exec/obidos/ISBN=157231995X) ve ayrıca çevrimiçi MSDN yardımcı olabilir.

Öncelikle mayın tarlası başlatma rutininin nerede çağrılabileceğini düşünmelisiniz. Aşağıdakileri düşündüm:

  • Oyunu başlattığınızda
  • Mutlu yüze tıkladığında
  • Oyun-> Yeni'ye tıkladığınızda veya F2'ye bastığınızda
  • Seviye zorluğunu değiştirdiğinizde

F2 hızlandırıcı komutunu kontrol etmeye karar verdim.

Hızlandırıcı işleme kodunu bulmak için, pencere mesajı işleme prosedürünü (WndProc) bulmalısınız. CreateWindowEx ve RegisterClass çağrıları tarafından izlenebilir.

Okumak:

IDA, İçe Aktarma penceresini açın, "CreateWindow *" u bulun, ona atlayın ve nerede çağrıldığını görmek için "xref ile işlenene (X) atla" komutunu kullanın. Sadece bir arama olmalı.

Şimdi RegisterClass işlevi ve WndClass.lpfnWndProc parametresi için yukarıya bakın. Benim durumumda zaten mainWndProc ismini verdim.

.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

İşlev adına Enter tuşuna basın (daha iyi bir adla yeniden adlandırmak için 'N' kullanın)

Şimdi şuna bir bak

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

Bu, F2 düğmesine basılması durumunda WM_COMMAND değerini içermesi gereken mesaj kimliğidir. 111h ile karşılaştırıldığında nerede olduğunu bulmalısınız. IDA'da edx'i takip ederek veya WinDbg'de koşullu kesme noktası ayarlayarak ve oyunda F2'ye basarak yapılabilir.

Her iki şekilde de şöyle bir şeye yol açar

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

111h'ye sağ tıklayın ve "Sembolik sabit" -> "Standart sembolik sabit kullan" seçeneklerini kullanın, WM_ ve Enter yazın. Şimdi sahip olmalısın

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

Mesaj kimliği değerlerini bulmanın kolay bir yoludur.

Hızlandırıcı işlemeyi anlamak için kontrol edin:

Tek bir cevap için oldukça fazla metin var. Eğer ilgilenirsen birkaç yazı daha yazabilirim. Uzun lafın kısa mayın tarlası bir bayt dizisi olarak depolanır [24x36], 0x0F, baytın kullanılmadığını gösterir (daha küçük bir alanla oynuyor), 0x10 - boş alan, 0x80 - benim.

Bölüm 2/3


Tamam, F2 butonu ile devam edelim.

Klavye Hızlandırıcılarının Kullanılmasına Göre F2 düğmesine basıldığında wndProc işlevi

... bir WM_COMMAND veya WM_SYSCOMMAND mesajı alır. WParam parametresinin düşük sıralı sözcüğü, hızlandırıcının tanımlayıcısını içerir.

Tamam, WM_COMMAND'in nerede işlendiğini zaten bulduk, ancak karşılık gelen wParam parametre değeri nasıl belirlenir? Kaynak korsanının devreye girdiği yer burasıdır . İkili ile besleyin ve size her şeyi gösterir. Benim için hızlandırıcı tablosu gibi.

alt text http://files.getdropbox.com/u/1478671/2009-07-29_161532.jpg

Burada F2 düğmesinin wParam'da 510'a karşılık geldiğini görebilirsiniz.

Şimdi WM_COMMAND'i işleyen koda geri dönelim. WParam'ı farklı sabitlerle 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

Ondalık değerleri görüntülemek için bağlam menüsünü veya 'H' klavye kısayolunu kullanın ve atladığımızı görebilirsiniz

.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'u çağıran ve wndProc'dan çıkan kod yığınına 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 oyunu başlatan işlev bu mu? Bunu son bölümde öğrenin! Bizi izlemeye devam edin.

Bölüm 3/3

Bu fonksiyonun ilk kısmına bir göz atalım

.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

Eax ve ecx yazmaçlarında okunan ve diğer iki değerle karşılaştırılan (dword_1005164, dword_1005338) iki değer (dword_10056AC, uValue) vardır.

WinDBG'yi kullanarak gerçek değerlere bir göz atın ('bp 01003696'; mola sırasında 'p eax; p ecx') - bunlar benim için mayın tarlası boyutları gibi göründü. Özel mayın tarlası boyutuyla oynamak, ilk çiftin yeni boyutlar ve ikinci - mevcut boyutlar olduğunu gösterdi. Yeni isimler koyalım.

.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

Biraz sonra yeni değerler mevcutun üzerine yazılır ve alt rutin çağrılır

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

Ve onu gördüğümde

.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ı dizisini bulduğumdan tamamen emindim. 0xF ile 360h bayt uzunluk dizisini (dword_1005340) başlatan döngünün nedeni.

Neden 360h = 864? Bu satırın altında 32 bayt alan bazı ipuçları vardır ve 864 32'ye bölünebilir, böylece dizi 27 * 32 hücre tutabilir (UI maksimum 24 * 30 alana izin verse de, sınırlar için dizinin etrafında bir bayt dolgusu vardır).

Aşağıdaki kod mayın tarlası üst ve alt sınırları (0x10 bayt) oluşturur. Umarım bu karışıklıkta döngü yinelemesini görebilirsiniz;) 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 alt yordamın geri 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ının akıllıca kullanılması, mayın tarlası dökümü (özel boyut 9x9) sağlayabilir. Sınırları kontrol edin!

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, konuyu kapatmak için başka bir gönderiye ihtiyacım var gibi görünüyor


1
@Stanislav, iyi cevap Stanislav. Herhangi bir ayrıntıya girebiliyorsanız, lütfen bunu yapın. Bu uzun, bilgilendirici cevaplar en iyisidir. Belki mayın tarlası veri yapısına nasıl odaklandığınıza dair biraz daha fazla bilgi?
KingNestor

@Stanislav, 250 replik ödülü bittiği için cevabını kabul ettim. Tebrikler!
KingNestor

1
@Stanislav, çok parçalı cevabını tek bir cevap olarak düzenledim. Tek cevabınızın boyut sınırına yaklaşmadınız ve sanırım birkaç cevap göndermek yerine tek bir cevaba sahip olmak tercih edilir. Orijinal cevabınızı (bu cevap) düzenleyin ve uygun gördüğünüz şekilde ekleyin.
mmcdole

2
Ayrıca destansı cevap Stanislav. Çalışkanlığın için çok teşekkürler!
mmcdole

15

Görünüşe göre kaynağı parçalarına ayırmaya çalışıyorsunuz ama yapmanız gereken, çalışan programın hafıza alanına bakmak. Hex editörü HxD , tam da bunu yapmanızı sağlayan bir özelliğe sahiptir.

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

Hafıza alanına girdikten sonra, anakartla uğraşırken hafızanın anlık görüntülerini alma meselesidir. Neyin değişip değişmediğini izole edin. Veri yapısının onaltılık bellekte nerede yattığını düşündüğünüzde, onu bellekteyken düzenlemeyi deneyin ve sonuç olarak panonun değişip değişmediğine bakın.

İstediğiniz süreç, bir video oyunu için bir 'eğitmen' oluşturmaktan farklı değildir. Bunlar genellikle sağlık ve cephane gibi değerlerin hafızada nerede yaşadığını bulmaya ve bunları anında değiştirmeye dayanır. Oyun eğitmenlerinin nasıl oluşturulacağı konusunda bazı iyi eğitimler bulabilirsiniz.


2
Peki, bellek konumunu statik sökme yoluyla bulabilirsiniz. Maden alanını oluşturmak için çağrılan rand () işlevleri gibi şeyleri arayan montaj talimatlarını takip edebilir ve ardından alanın bellekte hangi konumda depolandığını (ve nasıl) görmek için oradan geçebilirsiniz.
mmcdole

Her iki yaklaşım da zordur. Geçmişte uygulamaları sökmeye çalıştım ve çok acı verici buldum. Bir rand () işlevini tam olarak nasıl anlarsınız?
James McMahon

Cevabınız nemo için teşekkür ederiz.
KingNestor

11

Bu kod projesi makalesine göz atın, bahsettiğiniz blog gönderisinden biraz daha ayrıntılı.

http://www.codeproject.com/KB/trace/minememoryreader.aspx

Düzenle

Ve bu makale, doğrudan mayın tarama gemisi hakkında olmasa da, WinDbg kullanarak bellekte avlanma konusunda size adım adım iyi bir rehber sunar:

http://www.codingthewheel.com/archives/extracting-hidden-text-with-windbg

Düzenle 2

Yine, bu mayın tarama gemisi ile ilgili değil, ama kesinlikle hafıza hata ayıklamam için bana biraz yiyecek verdi, burada çok sayıda öğretici var:

http://memoryhacking.com/forums/index.php

Ayrıca, CheatEngine'i (Nick D. tarafından bahsedilmiştir) indirin ve birlikte gelen öğretici üzerinde çalışın.


9

"WinDbg'de kesme noktaları ayarlayabilirim, ancak hangi noktada bir kesme noktası ve hangi bellek konumunda ayarlayacağımı hayal etmek benim için zor. Benzer şekilde, statik kodu IDA Pro'da görüntülediğimde, nereden başlayacağımı bile bilmiyorum maden sahasını temsil eden işlevi veya veri yapısını bulmak için. "

Kesinlikle!

Maden tablosunun yapımı sırasında çağrılacak random () gibi rutinleri arayabilirsiniz. Bu kitap , tersine mühendislik deneyimleri yaparken bana çok yardımcı oldu. :)

Genel olarak, kırılma noktalarını ayarlamak için iyi yerler, mesaj kutularına yapılan çağrılar, ses çalma çağrıları, zamanlayıcılar ve diğer win32 API rutinlerdir.

BTW, şu anda OllyDbg ile mayın tarama gemisi tarıyorum .

Güncelleme: nemo bana Eric "Dark Byte" Heijnen'den Cheat Engine adlı harika bir aracı hatırlattı .

Cheat Engine (CE), diğer işlemlerin bellek alanını izlemek ve değiştirmek için harika bir araçtır. Bu temel kolaylığın ötesinde CE, bir işlemin parçalanmış belleğini görüntüleme ve diğer işlemlere kod enjekte etme gibi daha özel özelliklere sahiptir.

( bu projenin gerçek değeri, kaynak kodunu indirebilmeniz ve bu mekanizmaların nasıl uygulandığını görebilmenizdir - bunu yıllar önce yaptım: o)


5

Bu konuyla ilgili oldukça iyi bir makale Uninformed'da bulunabilir . Tersine Mayın Tarlası'nı (tersine mühendislik Win32 uygulamalarına giriş olarak) oldukça ayrıntılı olarak kapsar ve oldukça büyük bir kaynaktır.


4

Bu web sitesi daha yararlı olabilir:

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

Bunu yapmanın genel yolu şudur:

  1. Bir şekilde kaynak kodunu al.
  2. Parçalarına ayırın ve artık sembollerin size yardımcı olmasını umun.
  3. Veri türünü tahmin edin ve onu değiştirmeye çalışın ve olasılıkları sınırlamak için bir bellek tarayıcı kullanın.

Bounty'ye yanıt olarak

Eh, ikinci bir okumada, tersine mühendislik nasıl yapılır sorusundan ziyade WinDBG gibi bir hata ayıklayıcının nasıl kullanılacağına dair bir kılavuz istiyormuşsunuz gibi görünüyor. Size aramanız gereken değerleri söyleyen web sitesini daha önce göstermiştim, yani soru şu ki, onu nasıl ararsınız?

Bu örnekte Mayın Tarlası yüklü olmadığından Not Defteri kullanıyorum. Ama fikir aynı.

alternatif metin

Yazıyorsun

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

Yardımı görmek için "?" Ve ardından "s" tuşuna basın.

İstediğiniz bellek modelini bulduğunuzda, güzel bir görüntü için bellek görüntüleyiciyi açmak için alt + 5 tuşlarına basabilirsiniz.

alternatif metin

WinDBG alışmak için biraz zaman alır, ancak oradaki diğer hata ayıklayıcılar kadar iyidir.


1
Mayın Tarlası kaynak olmadan gönderildiği için "Bir şekilde kaynak kodunu al" saçma bir ifadedir. Ve kaynakla tersine mühendislik, tersine mühendislik değil, kaynak-kod analizi.
mrduclaw

@mrduclaw, derlemeyi kaynak dile dönüştüren uygulamalar vardır. "Kaynak kod analizi" diye bir terim yoktur.
Unknown

1
@Unknown Belirli bir derlenmiş ikiliden bir kaynak dilde bir programı yeniden oluşturmaya çalışan uygulamalar vardır. Ancak, derlenmiş bir ikili dosyadan yazarın yorumları ve alıntılarıyla "kaynak kodu" alamazsınız. Elbette, bu "kod çözücülerin" bazıları diğerlerinden daha iyi iş çıkarır, ancak size yazarın yazdığı kodu vermezler (derleyici tarafından optimize edilmiş kod genellikle programcının kodundan çok farklıdır). Ve hiç kalite güvence testi yapmadınız mı? PREfast ve Sparse gibi araçlar ne işe yarar? Statik kaynak kodu analizi.
mrduclaw

PREfast ve Sparse'daki statik kaynak kodu analizi, kırmak için derlenmiş kodu manuel olarak okumaktan tamamen farklıdır. Kimsenin bu iki farklı fikri birbiriyle karıştıracağını sanmıyorum.
Unknown

@Unknown Bunu bir daha ileri götürüyorum ve tersine mühendislik sökme ile kaynak koduna bakmakla karıştırmamanız gerektiğini kabul ediyorum (kaynak kod analizi yapıyorsanız kaynağa sahipseniz derlenmiş veya başka türlü). Benim amacım buydu. Bu yüzden lütfen ikisini karıştırmayı bırakın. :)
mrduclaw

0

Hata ayıklayıcıda izlemeye başlamak için iyi bir nokta farenin yukarı kaldırılması olacaktır. Bu yüzden ana pencere prosedürünü bulun (spyxx gibi araçlar Windows özelliklerini inceleyebilir ve olay işleyici adresi bunlardan biridir). Buna girin ve fare olaylarını nerede işlediğini bulun - eğer bunu assembler'da tanıyabiliyorsanız bir anahtar olacaktır (windows.h'de mouse up için WM_XXX değerine bakın).

Oraya bir kesme noktası koyun ve devreye girmeye başlayın. Fare düğmesini bıraktığınız zaman ile ekranın güncellenmesi arasında bir yerde, victum, aradığınız veri yapısına erişecektir.

Sabırlı olun, herhangi bir zamanda ne yapıldığını belirlemeye çalışın, ancak mevcut hedefiniz için ilgi çekici olmadığından şüphelendiğiniz kodun derinliklerine bakma zahmetine girmeyin. Düzeltmek için hata ayıklayıcıda birkaç çalıştırma gerekebilir.

Normal win32 uygulamaları iş akışı bilgisi de yardımcı olur.


0

Madenler muhtemelen bir tür iki boyutlu dizide depolanacak. Bu, ya bir işaretçi dizisi ya da tek bir C tarzı boole dizisi olduğu anlamına gelir.

Form bir mouse-up olayı aldığında bu veri yapısına başvurulur. İndeks, muhtemelen tamsayı bölümü kullanılarak, fare koordinatı kullanılarak hesaplanacaktır. Bu cmp, işlenenlerden birinin bir ofset kullanılarak hesaplandığı ve tamsayı bölmesini içeren bir hesaplamanın sonucu xolduğu yerde muhtemelen bir veya benzer bir talimat aramanız gerektiği anlamına gelir x. Ofset daha sonra veri yapısının başlangıcına işaretçi olacaktır.


0

Madenler hakkındaki bilgilerin en azından satırlar için bellekte bitişik olarak yerleştirildiğini varsaymak oldukça mantıklıdır (yani bir 2D dizisi veya bir dizi dizisi). Böylece, aynı satırda birkaç bitişik hücre açmayı, işlemin bellek dökümlerini oluşturmayı ve ardından bunları farklılaştırıp aynı bellek bölgesinde yinelenen değişiklikleri ararım (yani, ilk adımda, sonraki adımda 1 bayt değişti) bayt, bir sonraki adımda aynı değere değiştirildi, vb.).

Ayrıca paketlenmiş bir bit dizisi olma olasılığı da vardır (mayın başına 3 bit, olası tüm durumları kaydetmek için yeterli olmalıdır - kapalı / açık, mayınlı / benimsiz, işaretli / işaretsiz), bu yüzden ben de buna dikkat ederim ( desenler, fark edilmesi daha zor olsa da tekrarlanabilir olacaktır). Ancak başa çıkmak için uygun bir yapı değil ve bellek kullanımının Mayın Tarlası için bir darboğaz olduğunu düşünmüyorum, bu yüzden bu tür bir şeyin kullanılması pek olası değil.


0

Tam anlamıyla bir "tersine mühendis aracı" ve benim gibi bir aptalın bile kullanabileceği bir oyuncak olmasa da, Cheat Engine'e bakın . Belleğin hangi bölümlerinin ne zaman değiştiğini izlemeyi biraz kolaylaştırır ve hatta değiştirilen bellek bölümlerini işaretçiler aracılığıyla izlemek için hükümler vardır (muhtemelen buna ihtiyacınız yoktur). Güzel bir interaktif öğretici dahildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.