2011-09-04 25 views
9

Diğer kişilerle birlikte bir oyun için bir Savegameeditor yapmaya çalışıyoruz, ancak bazı problemlerle karşılaştık. Kayıt oyunu dosyaları, bunun için hangi sağlama toplamının kullanıldığını göremediğimiz bir tür sağlama toplamı içerir. Bildiğimiz artık tüm Till geçerli:Hangi Checksum kullanıldığını bulma

  • sağlama Savegame veri (dosyanın genelinde yayılır) 5 bayt, sağlama dışında tamamen aynıdır 32 bit
  • 9 Arasında farklı kaydedilmiş oyunlar vardır 1834565 - 1851372 arasında, ayrılmamış bir şekilde ayrıştırıldığında bulunmuştur. Her bir kaydedilen 5 byte'lık tasarrufun, artan bir sayı olduğu (çoğunlukla +8 civarında) olduğu, ancak sağlama toplamının lineair artırılmayacağına dikkat edin. 2 byte
  • Bazı toplamlarını çalıştı değiştirdi ve Sum32, addler32, DJB2 ve olmaya görünmüyordu sonuca vardık zaman
  • sağlama oyunu bozuk dosyayı beyan olarak, bağımlı konumlandırmak görünüyor CRC32, bunların hiçbiri, savegames'te bulunan checksum'lara yakın gelmiyordu. Kayıtlı oyuna dahil olan kontrol toplamına en yakın olan sağlama toplamı, baytları yalnızca imzasız bir uzunluğa ekliyor gibi görünüyor, ki bu da ~ 2507737 civarında bir değer döndürüyor.

Bu dosyalar için hangi sağlama toplamının kullanıldığını bulmak için daha iyi bir yol olup olmadığını veya birisi hangi sağlama toplamını kullanacağını öğrenmek için herhangi bir ipucu biliyorsa merak ediyorum. Şu anda bir C++ programında farklı sitelerde bulduğum bazı sağlama toplamlarını deniyorum. Belki de bilmeniz gereken önemli bir şey de, oyunun 2004'ten, diğer dosyalarda ise String-hashes için DJB2 kullanmasıdır. Diğer insanlara göre .exe, bir CRC32 denetimi kullanıyor gibi görünüyor.

Düzenleme 1: Bir süre sonra ben her kurtarmak değişir 2 byte dışında aynı dosyanın 924 farklı versiyonunu, başardı, ben de bu değişikliklere nasıl tepki bu dosyaların toplamlarını görmek lazım ve bunun hakkında bir liste yaptım. (Dosyada el ile değişiklik yapamayacağımı ve oyunun bunun için bir sağlama toplamı yaptığımı unutmayın, dosyayı her kaydettiğimde +2 değerini işaretli uzunluğa kadar değişen sayıya ekledim, bu yüzden listeyi oluşturdum.)

burada aşağıdaki listeden bir kısmını (924 üzerinden 50 kayıtları) bkz: Ben hala o değişen bayt ve sağlama arasında bir desen göremiyorum

>   The bytes   Checksum (as Hex and unsigned long) 
>   ----------------------------- 
>   0x 0 0x18 0x 0 0x13DFA 81402 
>   0x 0 0x19 0x 0 0x13F76 81782 
>   0x 0 0x1A 0x 0 0x1406D 82029 
>   0x 0 0x1B 0x 0 0x14114 82196 
>   0x 0 0x1C 0x 0 0x13EC5 81605 
>   0x 0 0x1D 0x 0 0x13790 79760 
>   0x 0 0x1E 0x 0 0x143C1 82881 
>   0x 0 0x1F 0x 0 0x13ED0 81616 
>   0x 2 0x18 0x 0 0x13D02 81154 
>   0x 2 0x19 0x 0 0x13ABD 80573 
>   0x 2 0x1A 0x 0 0x14271 82545 
>   0x 2 0x1B 0x 0 0x13E39 81465 
>   0x 2 0x1C 0x 0 0x140FC 82172 
>   0x 2 0x1D 0x 0 0x13FFE 81918 
>   0x 2 0x1E 0x 0 0x1413B 82235 
>   0x 2 0x1F 0x 0 0x13A5F 80479 
>   0x 4 0x18 0x 0 0x138F2 80114 
>   0x 4 0x19 0x 0 0x141AE 82350 
>   0x 4 0x1A 0x 0 0x13E91 81553 
>   0x 4 0x1B 0x 0 0x13F67 81767 
>   0x 4 0x1C 0x 0 0x13C6C 81004 
>   0x 4 0x1D 0x 0 0x13F4E 81742 
>   0x 4 0x1E 0x 0 0x13BB8 80824 
>   0x 4 0x1F 0x 0 0x1398D 80269 
>   0x 6 0x18 0x 0 0x146C0 83648 
>   0x 6 0x19 0x 0 0x139B5 80309 
>   0x 6 0x1A 0x 0 0x13FAC 81836 
>   0x 6 0x1B 0x 0 0x13E71 81521 
>   0x 6 0x1C 0x 0 0x14162 82274 
>   0x 6 0x1D 0x 0 0x13D55 81237 
>   0x 6 0x1E 0x 0 0x13BE8 80872 
>   0x 6 0x1F 0x 0 0x13B72 80754 
>   0x 8 0x18 0x 0 0x142FE 82686 
>   0x 8 0x19 0x 0 0x13E07 81415 
>   0x 8 0x1A 0x 0 0x14923 84259 
>   0x 8 0x1C 0x 0 0x13D3E 81214 
>   0x 8 0x1D 0x 0 0x14420 82976 
>   0x 8 0x1E 0x 0 0x13BEE 80878 
>   0x 8 0x1F 0x 0 0x145F5 83445 
>   0x 8 0x1F 0x 0 0x145F5 83445 
>   0x A 0x18 0x 0 0x13CB6 81078 
>   0x A 0x19 0x 0 0x142FB 82683 
>   0x A 0x1A 0x 0 0x13EB2 81586 
>   0x A 0x1B 0x 0 0x13C14 80916 
>   0x A 0x1C 0x 0 0x13915 80149 
>   0x A 0x1D 0x 0 0x14100 82176 
>   0x A 0x1E 0x 0 0x14310 82704 
>   0x A 0x1F 0x 0 0x13B34 80692 
>   0x C 0x18 0x 0 0x142AE 82606 
>   0x C 0x19 0x 0 0x14091 82065 

, böylece başkası belki görür diye merak ettim bunlar arasında bir desen? Ya da belki aralarındaki kalıpları bulmak için bir teknik. Birisi bana bu konuda yardımcı olabilir, ben de tam liste (Microsoft Excel veya TXT biçiminde)

+0

O zaman belki de bir başlangıç ​​değeri olan bir sağlama toplamı modülü, ~ 2507737 :-) 2'ye hizalanmış 2, 4, 8 baytlık blokları değiştirmeyi deneyin, 4 ve 8 bayt sınırı. – xanatos

+0

Cevabınız için teşekkürler, daha büyük blokları değiştirmeyi denedim, maalesef dosyanın bozuk olduğunu bildiren oyunun aynı hatasını almaya devam ediyorum, bu yüzden sağlama toplamının konuma bağlı gibi göründüğünden eminim. Yine de, sadece 2 baytın her birinin kaydettiği farklı bir dosya buldum ve dosya biraz daha küçük, bu yüzden bu dosyadan biraz daha fazla bilgi edinebilirim, daha fazla bilgi edinir öğrenmez bildiririm. – LeopardGL

+2

[Çok fazla CRC türü var] olduğunu unutmayın (http://en.wikipedia.org/wiki/CRC32#Commonly_used_and_standardized_CRCs). Ayrıca, herhangi bir bitsel işlemi açık yapmak için ikili veya onaltılı olarak sağlama toplamları yazmalısınız. – phihag

cevap

6

Bir bağlantı gönderebilir, en kolay yolu, gerçekten, OllyDbg gibi bir hata ayıklayıcıyı yakalamak olabilir, sağlama toplamı kodunu bulun ve tersine mühendislik. Bu kolay olduğunu söylemek için değil, çünkü muhtemelen oldukça zor olacak. Ama benim görüşüme göre tersine mühendislik bile sayıları bakarak sadece basit checksums imkansız sınır, belki de o zaman bile değil – desenleri görmek için insanüstü yetenekleri ile yüksek fonksiyonlu bir otist arkadaşınız varsa.

Elbette, yolsuzluğu tespit etmek için standart, iyi bilinen bir sağlama toplamı kullanan bir oyuna sahip olduğunuz için şanslı olabilirsiniz. Ama eğer hedefleri kurcalamayı önlemekse (ve bu oldukça muhtemel), eğer herhangi bir ipucu varsa standart bir sağlama toplamı kullanmazlardı.İşte

Ben kendimi eğlenceli olduğum bir crackme bir sağlama algoritması var:

checksum algorithm

Kesinlikle sadece kendi çıkışlarına bakarak bu kodu tahmin olamazdı

:

uint sum = 0; 
for (uint i = 0; i < 478; i++) 
    sum = rol((((buf[i + 22] | 0xFFFFFF00u) + i)^(478 - i)) - sum + 0x272E4745u, 3); 

Bu kodda, or 0xFFFFFF00 ile tamamen yok etmeksizin işaret uzantısı kullanan ayrı bir sağlama toplamı algoritması vardır - aramanızda böyle bir işlem düşünür miydiniz? Arama alanı, tahmin etmek için sadece çok büyük ...

+0

Cevabınız için teşekkürler, yorumum geç kaldı, ancak oldukça zaman harcadım. Derlemeyi izleyerek, dosyanın başındaki başlığın silinmesini ve dosyanın sonunda yer alan kontrol toplamının da işe yarayacağını gösteren bazı kurallar buldum. Böylece, başlık ve sağlama toplamını silerek, aslında sağlama toplamı algoritmasını bulma ihtiyacını atladım. Çok teşekkür eden herkese teşekkür ederiz! – LeopardGL

+0

@LeopardGL Tebrikler! :) –