2011-09-04 14 views
9

कुछ अन्य लोगों के साथ हम एक गेम के लिए सेवगामेडिटर बनाने की कोशिश कर रहे हैं, लेकिन हम कुछ समस्याओं में आ गए। सेवगाम फ़ाइलों में एक प्रकार का चेकसम होता है, जिसमें से हम यह नहीं ढूंढ सकते कि इसके लिए कौन से चेकसम का उपयोग किया जाता है। अब सब हम जानते हैं कि जब तक है:कौन सा चेकसम का उपयोग किया जाता है

  • चेकसम 32 बिट
  • बीच 9 विभिन्न बचाया खेल, जहां savegame डेटा 5 बाइट्स (जो फ़ाइल करवाते फैले हुए हैं), चेकसम बिल्कुल समान है 1834565 - 1851372 के बीच पाया गया है, जब एक unsinged लंबे के रूप में पार्स किया गया है। ध्यान दें कि प्रत्येक 5 बाइट्स को बचाने से प्रत्येक बचाया जाता है (ज्यादातर लगभग +8 तक), लेकिन चेकसम लाइनरियर नहीं बढ़ता है।
  • चेकसम निर्भर स्थिति, के रूप में खेल भ्रष्ट के रूप में फ़ाइल वाणी लगता है जब 2 बाइट्स बंद कर रहे हैं
  • मैं कुछ चेकसम की कोशिश की, और निष्कर्ष पर पहुंचा है कि यह Sum32, addler32, DJB2 और होने के लिए नहीं मालूम था सीआरसी 32, क्योंकि उनमें से कोई भी savegames में शामिल चेकसम के करीब आना प्रतीत नहीं होता था। ऐसा लगता है कि चेकसम जो कि savegames में शामिल चेकसम के सबसे नज़दीक आता है, वह सभी बाइट्स को एक हस्ताक्षरित लंबे समय तक जोड़ रहा है, जो ~ 2507737 के आसपास एक मूल्य देता है।

मैं सोच रहा था कि इन फ़ाइलों के लिए कौन से चेकसम का उपयोग किया जाता है, या किसी को यह पता लगाने के लिए कोई बेहतर तरीका है कि कौन से चेकसम का उपयोग किया जाता है। मैं वर्तमान में कुछ चेकसमों की कोशिश कर रहा हूं जो मुझे सी ++ प्रोग्राम में विभिन्न साइटों पर मिलीं। शायद यह जानना भी महत्वपूर्ण है कि गेम 2004 से है, और अन्य फाइलों में यह स्ट्रिंग-हैश के लिए डीजेबी 2 का इस्तेमाल करता है। अन्य लोगों के मुताबिक .exe एक सीआरसी 32 चेक का उपयोग कर रहा है।

संपादित करें 1: कुछ समय के बाद मैं 2 बाइट्स जो प्रत्येक को बचाने के अलग-अलग छोड़कर एक ही फ़ाइल के 924 विभिन्न संस्करणों पाने में कामयाब रहे, और मैं भी इन फ़ाइलों में से चेकसम को देखने के लिए कि यह कैसे उन परिवर्तनों पर प्रतिक्रिया व्यक्त की है, और मैंने इसके बारे में एक सूची बनाई। (ध्यान दें कि मैं फ़ाइल में मैन्युअल रूप से परिवर्तन नहीं कर सकता हूं और गेम सिर्फ इसके लिए एक चेकसम बनाता है, हर बार जब मैंने फ़ाइल को सहेज लिया है तो यह अलग-अलग नंबर वाले अनगिनत लंबे समय तक +2 जोड़ा गया है, इसलिए मैंने सूची बनाई है।)

यहाँ नीचे दी गई सूची का एक हिस्सा (924 में से 50 रिकॉर्ड) देखें:

>   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 

मैं अब भी उन अलग बाइट्स, और checksum के बीच एक पैटर्न नहीं देख सकते हैं, इसलिए यदि किसी और को शायद देखता है मैं सोच रहा था उन लोगों के बीच एक पैटर्न? या शायद उनके बीच पैटर्न खोजने के लिए एक तकनीक। अगर कोई मेरी मदद कर सकता है, तो मैं पूरी सूची (माइक्रोसॉफ्ट एक्सेल या टीXT प्रारूप के रूप में) को भी पोस्ट कर सकता हूं

+0

तो शायद यह वास्तव में एक चेकसम मॉड्यूलस है, जिसका प्रारंभिक मूल्य ~ 2507737 :-) 2, 4, 8 बाइट्स के ब्लॉक को स्वैप करने का प्रयास करें जो 2 से गठबंधन हैं, 4 और 8 बाइट सीमा। – xanatos

+0

आपके उत्तर के लिए धन्यवाद, मैंने बड़े ब्लॉक को स्वैप करने का प्रयास किया, दुर्भाग्यवश मुझे फ़ाइल को भ्रष्ट के रूप में घोषित करने वाली गेम की एक ही त्रुटि मिलती है, इसलिए मुझे लगता है कि यह अब सुनिश्चित है कि चेकसम स्थिति निर्भर है। हालांकि, मुझे एक फ़ाइल मिली जहां प्रत्येक 2 बाइट अलग-अलग होते हैं, और फ़ाइल थोड़ी छोटी होती है, इसलिए मुझे उस फ़ाइल से कुछ और जानकारी मिल सकती है, जैसे ही मुझे अधिक जानकारी मिलती है, मैं इसे बता दूंगा। – LeopardGL

+2

यह मत भूलना कि [कई सीआरसी वेरिएंट] हैं (http://en.wikipedia.org/wiki/CRC32#Commonly_used_and_standardized_CRCs)। साथ ही, आपको बाइनरी या हेक्साडेसिमल में किसी भी प्रकार के बिटवाई ऑपरेशंस को स्पष्ट करने के लिए चेकसम लिखना चाहिए। – phihag

उत्तर

6

सबसे आसान तरीका, वास्तव में, OllyDbg जैसे डीबगर को पकड़ने के लिए, चेकसमिंग कोड का पता लगाएं , और रिवर्स-इंजीनियर इसे। यह नहीं कहना कि यह आसान है, क्योंकि यह शायद कठिन है। लेकिन मेरी राय में रिवर्स-इंजीनियरिंग केवल संख्याओं को देखकर सरल चेकसम केवल असंभवता पर सीमाबद्ध है, जब तक कि आपके पास उच्च गुणवत्ता वाले स्वाभाविक मित्र नहीं हैं, तो पैटर्न – पैटर्न को देखने के लिए शायद तब भी नहीं।

आप निश्चित रूप से भाग्यशाली हो सकते हैं कि भ्रष्टाचार का पता लगाने के लिए एक मानक, जाने-माने चेकसम का उपयोग किया जाए। लेकिन अगर उनका लक्ष्य छेड़छाड़ को रोकने के लिए था (और यह काफी संभावना है) तो अगर उनके पास कोई सुराग है तो वे मानक चेकसम का उपयोग नहीं करते थे।

यहाँ मैं अपने आप को साथ मनोरंजक कर रहा हूँ एक crackme से चेकसम एल्गोरिथ्म है:

checksum algorithm

मैं निश्चित रूप से बस इसके आउटपुट को देखकर यह अनुमान लगाया कोड नहीं हो सकता था:

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

इस कोड में एक अलग चेकसम एल्गोरिदम है जो or 0xFFFFFF00 के साथ इसे पूरी तरह से समाप्त किए बिना साइन-एक्सटेंशन का उपयोग करता है - क्या आपने अपनी खोज में ऐसा ऑपरेशन माना होगा? खोज स्थान अनुमान लगाने के लिए बहुत बड़ा है ...

+0

आपके उत्तर के लिए धन्यवाद, मेरी टिप्पणी देर हो गई है, लेकिन मैंने इस पर काफी समय बिताया है। असेंबली देखकर मुझे कुछ नियम मिलते हैं जो इंगित करते हैं कि फ़ाइल की शुरुआत में हेडर को हटाना, और फ़ाइल के अंत में चेकसम भी काम करेगा, और ऐसा हुआ। तो हेडर और चेकसम को हटाकर मैंने वास्तव में चेकसम एल्गोरिदम खोजने की आवश्यकता को छोड़ दिया। हर कोई जिसने बहुत धन्यवाद करने में आपकी मदद की! – LeopardGL

+0

@LeopardGL बधाई हो! :) –

संबंधित मुद्दे

 संबंधित मुद्दे