मैं उस डेटा संरचना को कैसे प्राप्त कर सकता हूं जो मेमोरी में माइनस्वीपर के लेआउट का प्रतिनिधित्व करती है?


94

मैं रिवर्स इंजीनियरिंग के बारे में जानने की कोशिश कर रहा हूं, एक नमूना आवेदन के रूप में माइनस्वीपर का उपयोग कर रहा हूं। मैंने एक साधारण WinDbg कमांड पर यह MSDN आलेख पाया है जो सभी खानों को प्रकट करता है, लेकिन यह पुराना है, इसे किसी भी विवरण में नहीं समझाया गया है और वास्तव में वह नहीं है जिसकी मुझे तलाश है।

मैं आईडीए प्रो disassembler और WinDbg डिबगर है और मैंने उन दोनों में winmine.exe लोड किया है। क्या कोई इन कार्यक्रमों के लिए कुछ व्यावहारिक सुझाव प्रदान कर सकता है जो कि खदान क्षेत्र का प्रतिनिधित्व करने वाले डेटा संरचना के स्थान को खोजने के लिए है?

WinDbg में मैं ब्रेकप्वाइंट सेट कर सकता हूं, लेकिन मेरे लिए यह सोचना मुश्किल है कि ब्रेकपॉइंट को किस बिंदु पर और किस मेमोरी लोकेशन पर सेट किया जाए। इसी तरह, जब मुझे आईडीए प्रो में स्टेटिक कोड दिखाई देता है, तो मुझे यकीन नहीं है कि जहां मैं फंक्शन या डेटा संरचना ढूंढना शुरू कर दूं, जो कि खान क्षेत्र का प्रतिनिधित्व करता है।

क्या Stackoverflow पर कोई रिवर्स इंजीनियर है जो मुझे सही दिशा में इंगित कर सकता है?


27
छात्रों के लिए असाइनमेंट के लिए एक महान विचार क्या है। बिल्ली के रूप में खानों के साथ शरीर रचना विज्ञान प्रयोगशाला की तरह।
ojblass

3
हमारे अंतर्राष्ट्रीय पाठकों के लिए, जो भ्रमित हो सकते हैं, माइंसवीपर खुश फूल खोजने वाले गेम का विंडोज़ संस्करण है जो कि विंडोज़ विस्टा के साथ जहाज है। microsoft.blognewschannel.com/index.php/archives/2006/09/28/…
किप

16
खुश फूल खोजने का खेल? O_o राजनीतिक शुद्धता बहुत दूर चली गई है।
यूजीन

10
खैर, माइन्सवेपर संस्करण विस्टा के स्वीडिश संस्करण में कम से कम डिफ़ॉल्ट है। मुझे लगता है कि वे उन स्थानों पर खुश-फूलों के संस्करण के लिए डिफ़ॉल्ट हैं जहां खानों को वास्तव में बच्चों को टुकड़ों में उड़ाने के लिए करना है।
जेस्पर

1
तो ... बस कुछ यादृच्छिक वर्गों पर क्लिक करके देखें कि क्या वे खानों के लिए सहायक नहीं हैं, हुह?
स्मंदोली

जवाबों:


125

3 का भाग 1


यदि आप रिवर्स इंजीनियरिंग में गंभीर हैं - प्रशिक्षकों के बारे में भूल जाएं और इंजन को धोखा दें।

अच्छे रिवर्स इंजीनियर को पहले ओएस, कोर एपीआई फ़ंक्शंस, प्रोग्राम जनरल स्ट्रक्चर (रन लूप, विंडोज़ स्ट्रक्चर, इवेंट हैंडलिंग रूटीन), फ़ाइल फॉर्मेट (पीई) का पता होना चाहिए। पेटज़ोल्ड की क्लासिक्स "प्रोग्रामिंग विंडोज" मदद कर सकती है (www.amazon.com/exec/obidos/ISBN=157231995X) साथ ही ऑनलाइन MSDN।

पहले आपको यह सोचना चाहिए कि माइनफील्ड इनिशियलाइज़ेशन रूटीन कहाँ कहा जा सकता है। मैंने निम्नलिखित के बारे में सोचा:

  • जब आप गेम लॉन्च करते हैं
  • जब आप खुश चेहरे पर क्लिक करते हैं
  • जब आप Game-> New पर क्लिक करते हैं या F2 दबाते हैं
  • जब आप स्तर कठिनाई को बदलते हैं

मैंने F2 त्वरक कमांड की जांच करने का फैसला किया।

त्वरक हैंडलिंग कोड खोजने के लिए आपको विंडो संदेश हैंडलिंग प्रक्रिया (WndProc) ढूंढनी है। इसे CreateWindowEx और RegisterClass कॉल द्वारा पता लगाया जा सकता है।

पढ़ने के लिए:

IDA, Imports विंडो खोलें, "CreateWindow *" ढूंढें, इसके लिए कूदें और "जंप xref से ऑपरेंड (X)" कमांड का उपयोग करके देखें कि यह कहाँ कहा जाता है। बस एक कॉल होनी चाहिए।

अब RegisterClass फ़ंक्शन के लिए ऊपर देखें और यह WndClass.lpfnWndProc का पैरामीटर है। मैंने अपने मामले में पहले से ही फंक्शन mainWndProc का नाम रखा है।

.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

फ़ंक्शन नाम पर हिट दर्ज करें (कुछ बेहतर करने के लिए इसका नाम बदलने के लिए 'एन' का उपयोग करें)

अब जरा गौर करें

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

यह संदेश आईडी है, जो F2 बटन प्रेस के मामले में WM_COMMAND मान होना चाहिए। आपको यह पता लगाना है कि 111h की तुलना में यह कहाँ है। यह IDA में edx को नीचे करके या WinDbg में सशर्त ब्रेकपॉइंट सेट करके और खेल में F2 दबाकर किया जा सकता है ।

किसी भी तरह से कुछ की ओर जाता है

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

111h पर राइट क्लिक करें और "सिंबोलिक निरंतर" -> "मानक प्रतीकात्मक स्थिरांक का उपयोग करें", WM_ टाइप करें और दर्ज करें। अब आपके पास होना चाहिए

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

यह संदेश आईडी मूल्यों का पता लगाने का एक आसान तरीका है।

त्वरक हैंडलिंग को समझने के लिए जाँच करें:

यह एक उत्तर के लिए काफी पाठ है। यदि आप रुचि रखते हैं तो मैं एक और पोस्ट लिख सकता हूं। लंबी कहानी लघु माइनफील्ड बाइट्स की एक सरणी के रूप में संग्रहीत [24x36], 0x0F से पता चलता है कि बाइट का उपयोग नहीं किया जाता है (छोटे क्षेत्र को खेलकर), 0x10 - खाली क्षेत्र, 0x80 - मेरा।

3 का भाग 2


ठीक है, चलो F2 बटन के साथ चलते हैं।

कीबोर्ड त्वरक का उपयोग करने के अनुसार जब F2 बटन को wndProc फ़ंक्शन दबाया जाता है

... WM_COMMAND या WM_SYSCOMMAND संदेश प्राप्त करता है। WParam पैरामीटर के कम-क्रम वाले शब्द में त्वरक का पहचानकर्ता होता है।

ठीक है, हमने पहले ही पाया है कि WM_COMMAND को संसाधित किया गया है, लेकिन संबंधित wParam पैरामीटर मान कैसे निर्धारित किया जाए? यह वह जगह है जहाँ संसाधन हैकर खेलने में आता है। इसे बाइनरी के साथ फ़ीड करें और यह आपको सब कुछ दिखाता है। मेरे लिए त्वरक तालिका की तरह।

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

आप यहां देख सकते हैं, कि F2 बटन wParam में 510 से मेल खाता है।

अब कोड पर वापस आते हैं, जो WM_COMMAND को संभालता है। यह विभिन्न स्थिरांक के साथ wParam की तुलना करता है।

.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

दशमलव मान प्रदर्शित करने के लिए संदर्भ मेनू या 'H' कीबोर्ड शॉर्टकट का उपयोग करें और आप हमारी छलांग देख सकते हैं

.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

यह कोड चंक की ओर जाता है जो कुछ खरीद को कॉल करता है और wndProc से बाहर निकलता है।

.text:01001EC8 loc_1001EC8:                            ; CODE XREF: mainWndProc+20Fj
.text:01001EC8                 call    sub_100367A     ; startNewGame ?
.text:01001EC8
.text:01001ECD                 jmp     callDefAndExit  ; default

क्या वह फ़ंक्शन जो नए गेम की शुरुआत करता है? कि पिछले भाग में पता लगाएं! बने रहें।

3 का भाग 3

आइए उस फ़ंक्शन के पहले भाग पर एक नज़र डालें

.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

वहाँ दो मूल्यों (dword_10056AC, uValue) रजिस्टरों eax और ecx में पढ़ा है और एक और दो मूल्यों (dword_1005164, dword_1005338) की तुलना में हैं।

WinDBG ('bp 01003696' का उपयोग करके वास्तविक मानों पर एक नज़र डालें, 'p eax; p ecx' पर) - वे मेरे लिए माइनफील्ड आयामों की तरह लग रहे थे। कस्टम माइनफील्ड आकार के साथ खेलने से पता चला कि पहली जोड़ी नए आयाम और दूसरी - वर्तमान आयाम हैं। नए नाम निर्धारित करते हैं।

.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

थोड़ा बाद में नए मान वर्तमान और सबरूटीन को अधिलेखित करते हैं

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

और जब मैंने देखा

.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

मुझे पूरी तरह से यकीन था कि मुझे माइनफ़ील्ड ऐरे मिला है। चक्र का कारण जो 0xF के साथ 360h बाइट्स लंबाई सरणी (dword_1005340) को सम्मिलित करता है।

360h = 864 क्यों? नीचे कुछ संकेत हैं कि पंक्ति 32 बाइट्स लेती है और 864 को 32 से विभाजित किया जा सकता है, इसलिए सरणी 27 * 32 सेल पकड़ सकती है (हालांकि यूआई अधिकतम 24 * 30 फ़ील्ड की अनुमति देता है, सीमाओं के लिए सरणी के चारों ओर एक बाइट पैडिंग है)।

निम्नलिखित कोड मेरा शीर्ष और निचला बॉर्डर (0x10 बाइट) उत्पन्न करता है। मुझे आशा है कि आप उस गड़बड़ में लूप पुनरावृत्ति देख सकते हैं;) मुझे कागज और कलम का उपयोग करना था

.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

और बाकी सबरूटीन बाएँ और दाएँ सीमाओं को खींचता है

.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 कमांड का स्मार्ट उपयोग आपको कूल माइनफील्ड डंप (कस्टम आकार 9x9) प्रदान कर सकता है। सीमाओं की जाँच करें!

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  ................................

हम्म, ऐसा लगता है कि मुझे विषय को बंद करने के लिए एक और पोस्ट की आवश्यकता होगी


1
@ स्टानिस्लाव, अच्छा जवाब स्टानिस्लाव। यदि आप इसे विस्तार से बता सकते हैं, तो कृपया ऐसा करें। ये लंबे, जानकारीपूर्ण उत्तर सबसे अच्छे हैं। शायद आप पर कुछ और कैसे आप myfield डेटा संरचना पर शून्य?
किंग्नस्टार

@Stanislav, मैंने आपका उत्तर स्वीकार कर लिया है क्योंकि 250 प्रतिनिधि इनाम समाप्त हो रहा था। बधाई हो!
किंगस्टीनर

1
@ स्टानिस्लाव, मैंने आपके बहु-भाग के उत्तर को एक ही उत्तर में संपादित किया है। आपने अपने एकल उत्तर के आकार की सीमा नहीं देखी है और मुझे लगता है कि आमतौर पर एक उत्तर के बजाय कई उत्तर देना पसंद किया जाता है। अपने मूल उत्तर (यह एक) को संपादित करने के लिए स्वतंत्र महसूस करें और जैसा कि आप फिट देखते हैं, उस पर जोड़ें।
mmcdole

2
इसके अलावा, महाकाव्य जवाब स्टानिस्लाव। आपकी हार्डवर्क के लिए बहुत बहुत धन्यवाद!
mmcdole

15

ऐसा लगता है कि आप स्रोत को अलग करने की कोशिश कर रहे हैं, लेकिन आपको जो करने की ज़रूरत है वह रनिंग प्रोग्राम की मेमोरी स्पेस को देखने के लिए है। हेक्स संपादक एचएक्सडी में एक विशेषता है जो आपको बस यही देता है।

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

एक बार जब आप मेमोरी स्पेस में होते हैं, तो बोर्ड के साथ गड़बड़ करते समय यह मेमोरी का स्नैपशॉट लेने की बात होती है। अलग हो जाता है क्या बनाम क्या नहीं बदलता है। जब आपको लगता है कि आपके पास एक हैंडल है जहां डेटा संरचना हेक्स मेमोरी में है, तो इसे संपादित करने का प्रयास करें जबकि यह मेमोरी में है और देखें कि क्या परिणामस्वरूप बोर्ड बदलता है।

आप जो प्रक्रिया चाहते हैं, वह वीडियो गेम के लिए 'ट्रेनर' बनाने के विपरीत नहीं है। वे आमतौर पर यह खोजने पर आधारित होते हैं कि स्वास्थ्य और बारूद जैसे मूल्य स्मृति में रहते हैं और उन्हें मक्खी पर बदलते हैं। आप खेल प्रशिक्षकों का निर्माण करने के बारे में कुछ अच्छे ट्यूटोरियल पा सकते हैं।


2
ठीक है, आप ~ स्टैटिक डिससैम्प के माध्यम से ~ मेमोरी लोकेशन का पता लगा सकते हैं। आप असेंबली निर्देशों का पालन करके रैंड () फ़ंक्शंस की तलाश कर सकते हैं, जिसे माइन फ़ील्ड बनाने के लिए बुलाया जा रहा है और फिर वहां से ट्रेस करके यह देखने के लिए कि मैमोरी (और कैसे) में फ़ील्ड को किस स्थान पर स्टोर किया गया है।
1940 पर mmcdole

दोनों दृष्टिकोण चुनौतीपूर्ण हैं। मैंने अतीत में अनुप्रयोगों को अलग करने की कोशिश की है और मैंने पाया है कि यह बहुत दर्दनाक है। आप वास्तव में एक रैंड () फ़ंक्शन को कैसे देखते हैं?
जेम्स मैकमोहन

आपके उत्तर के लिए धन्यवाद nemo।
किंग्नस्टॉर

11

इस कोड परियोजना के लेख की जाँच करें, यह आपके द्वारा उल्लिखित ब्लॉग पोस्ट की तुलना में थोड़ी अधिक गहराई में है।

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

संपादित करें

और यह लेख, हालांकि सीधे माइन्सवेपर के बारे में नहीं है, आपको WinDbg का उपयोग करके मेमोरी के माध्यम से शिकार पर कदम गाइड द्वारा एक अच्छा कदम देता है:

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

संपादित करें २

फिर से, यह माइंसवेपर के बारे में नहीं है, लेकिन इसने मुझे निश्चित रूप से मेरी मेमोरी डिबगिंग के लिए कुछ भोजन दिया है, यहाँ ट्यूटोरियल का खजाना है:

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

इसके अलावा, CheatEngine (Nick D. द्वारा उल्लिखित) डाउनलोड करें और इसके साथ आने वाले ट्यूटोरियल के माध्यम से काम करें।


9

"WinDbg में मैं ब्रेकप्वाइंट सेट कर सकता हूं, लेकिन मेरे लिए यह कल्पना करना मुश्किल है कि ब्रेकपॉइंट को किस बिंदु पर और किस मेमोरी लोकेशन पर सेट किया जाए। इसी तरह, जब मैं आईडीए प्रो में स्टेटिक कोड देखता हूं, तो मुझे यकीन नहीं है कि कहां से शुरू करना है। फ़ंक्शन या डेटास्ट्रक्चर खोजने के लिए जो खदान क्षेत्र का प्रतिनिधित्व करता है। "

बिल्कुल सही!

ठीक है, आप यादृच्छिक () की तरह दिनचर्या देख सकते हैं जो कि खानों की मेज के निर्माण के दौरान कहा जाएगा। जब मैं रिवर्स इंजीनियरिंग के साथ प्रयोग कर रहा था तब इस पुस्तक ने मेरी बहुत मदद की। :)

सामान्य तौर पर, ब्रेक पॉइंट सेट करने के लिए अच्छी जगहें संदेश बॉक्स, एक ध्वनि चलाने के लिए कॉल, टाइमर और अन्य win32 एपीआई दिनचर्या हैं।

BTW, मैं OllyDbg के साथ अभी खानों की स्कैनिंग कर रहा हूं

अपडेट: नीमो ने मुझे एरिक "डार्क बाइट" हाइजेन द्वारा एक महान उपकरण, चीट इंजन की याद दिला दी ।

चीट इंजन (सीई) अन्य प्रक्रियाओं को स्मृति स्थान को देखने और संशोधित करने के लिए एक महान उपकरण है। उस बुनियादी सुविधा से परे , सीई में और भी विशेष विशेषताएं हैं जैसे कि एक प्रक्रिया की डिसबेल्ड मेमोरी को देखना और कोड को अन्य प्रक्रियाओं में इंजेक्ट करना।

( उस परियोजना का वास्तविक मूल्य यह है कि आप स्रोत कोड डाउनलोड कर सकते हैं-डेल्फी - और देखें कि उन तंत्रों को कैसे लागू किया गया था - मैंने ऐसा कई साल पहले किया था: ओ)


5

इस विषय पर एक बहुत अच्छा लेख Uninformed में पाया जा सकता है । इसमें माइनस्वीपर (रिवर्स इंजीनियरिंग Win32 ऐप्स के लिए एक परिचय के रूप में) को बहुत शानदार विस्तार से शामिल किया गया है और यह सभी एक बेहतरीन संसाधन के आसपास है।


4

यह वेबसाइट अधिक उपयोगी हो सकती है:

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

ऐसा करने का सामान्य तरीका है:

  1. किसी तरह सोर्स कोड मिलता है।
  2. जुदा करना और बचे हुए प्रतीकों की आशा करना आपकी मदद कर सकता है।
  3. डेटा प्रकार का अनुमान लगाएं और संभावनाओं को सीमित करने के लिए इसे हेरफेर करने और मेमोरी स्कैनर का उपयोग करने का प्रयास करें।

बाउंटी के जवाब में

ठीक है, एक दूसरे पढ़ने पर, ऐसा प्रतीत होता है जैसे आप एक गाइड चाहते थे कि विनबीडीजी जैसे डिबगर का उपयोग कैसे किया जाए, बल्कि सामान्य सवाल कि कैसे इंजीनियर को उल्टा करना है। मैंने आपको पहले ही वेबसाइट दिखा दी है जो आपको उन मूल्यों को बताती है जिनकी आपको खोज करने की आवश्यकता है, इसलिए सवाल यह है कि आप इसे कैसे खोजते हैं?

मैं इस उदाहरण में नोटपैड का उपयोग कर रहा हूं क्योंकि मेरे पास माइनस्वीपर स्थापित नहीं है। लेकिन विचार एक ही है।

वैकल्पिक शब्द

आप लिखें

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

प्रेस "?" और फिर मदद देखने के लिए "s"।

एक बार जब आप अपनी इच्छित मेमोरी पैटर्न पा लेते हैं, तो आप अच्छे प्रदर्शन के लिए मेमोरी व्यूअर को लाने के लिए alt + 5 दबा सकते हैं।

वैकल्पिक शब्द

WinDBG कुछ करने के लिए इस्तेमाल किया जा रहा है, लेकिन यह वहाँ से बाहर किसी भी अन्य डिबगर के रूप में अच्छा है।


1
"किसी तरह स्रोत कोड प्राप्त करें" यह एक मूर्खतापूर्ण बयान है क्योंकि माइन्सवेपर को बिना स्रोत के भेजा जाता है। और स्रोत के साथ रिवर्स इंजीनियरिंग रिवर्स इंजीनियरिंग नहीं है ... यह स्रोत-कोड विश्लेषण है।
मृदुकॉव

@ मर्ड्यूक्लाव ऐसे अनुप्रयोग हैं जो असेंबली को स्रोत भाषा में अपघटित कर सकते हैं। "स्रोत-कोड विश्लेषण" नामक कोई शब्द नहीं है।
अज्ञात

1
@ ज्ञात ऐसे अनुप्रयोग हैं जो किसी दिए गए संकलित बाइनरी से एक स्रोत भाषा में एक कार्यक्रम को फिर से संगठित करने का प्रयास करते हैं। लेकिन आप संकलित बाइनरी से लेखक की टिप्पणियों और उद्धरणों के साथ "स्रोत कोड" प्राप्त नहीं कर सकते। निश्चित रूप से, उनमें से कुछ "डिकंपाइलर" दूसरों की तुलना में बेहतर काम करते हैं लेकिन वे आपको वह कोड नहीं दे रहे हैं जो लेखक ने लिखा था (कंपाइलर ऑप्टिमाइज्ड कोड अक्सर प्रोग्रामर के कोड से बहुत अलग होता है)। और क्या आपने कभी गुणवत्ता आश्वासन परीक्षण नहीं किया है? PREIFT और Sparse जैसे उपकरण क्या करते हैं? स्थैतिक स्रोत कोड विश्लेषण।
मृदुलाव जू

PREIFT और Sparse में स्टेटिक सोर्स कोड विश्लेषण इसे हैक करने के लिए मैन्युअल रूप से पढ़ने वाले डिकम्पोज्ड कोड से पूरी तरह से अलग है। मुझे नहीं लगता कि कोई भी उन दो अलग विचारों को एक दूसरे के रूप में भ्रमित करेगा।
अज्ञात

@ ज्ञात मैं इसे एक बार आगे ले जाता हूं और सहमत होता हूं कि आपको स्रोत कोड (विघटित या अन्यथा, यदि आपके पास स्रोत कोड विश्लेषण कर रहे हैं तो स्रोत है) को देखने के साथ रिवर्स इंजीनियरिंग डिस्सैम्प को भ्रमित नहीं करना चाहिए। यह मेरी पूरी बात थी। इसलिए कृपया, दोनों को भ्रमित करना बंद करें। :)
मृदुलाव

0

डीबगर में अनुरेखण शुरू करने के लिए एक अच्छा बिंदु माउस अप पर होगा। तो मुख्य विंडो प्रक्रिया ढूंढें (मुझे लगता है कि स्पाईएक्सएक्स जैसे उपकरण खिड़कियों के गुणों का निरीक्षण कर सकते हैं और घटना हैंडलर का पता उनमें से एक है)। इसे तोड़ो और यह पता लगाएं कि यह माउस घटनाओं को कैसे संभालता है - एक स्विच होगा, यदि आप इसे कोडांतरक में पहचान सकते हैं (विंडोज़ में माउस के लिए WM_XXX का मूल्य देखें।)।

वहां एक ब्रेकपॉइंट लगाएं और अंदर कदम रखना शुरू करें। कहीं-कहीं आपके द्वारा जारी किए गए माउस बटन और स्क्रीन को अपडेट किया जा रहा है, तो विजटम आप जिस डाटस्ट्रक्चर की तलाश कर रहे हैं, उस तक पहुंच होगी।

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

सामान्य win32 अनुप्रयोगों वर्कफ़्लो का ज्ञान भी मदद करता है।


0

खानों को शायद किसी तरह के द्वि-आयामी सरणी में संग्रहीत किया जाएगा। इसका मतलब यह है कि यह या तो पॉइंटर्स की एक सरणी है या बूलियन्स की एकल सी शैली सरणी है।

जब भी फ़ॉर्म को माउस-अप ईवेंट प्राप्त होता है, तो यह डेटा संरचना संदर्भित होती है। सूचकांक की गणना माउस समन्वय का उपयोग करके की जाएगी, शायद पूर्णांक विभाजन का उपयोग करके। इसका मतलब है कि आपको संभवतः cmpया इसी तरह के निर्देश की तलाश करनी चाहिए , जहां एक ऑपरेंड की गणना ऑफसेट का उपयोग करके की जाती है और xजहां xपूर्णांक विभाजन से संबंधित गणना का परिणाम होता है। ऑफसेट तो डेटा संरचना की शुरुआत के लिए सूचक होगा।


0

यह मान लेना काफी हद तक उचित है कि खानों के बारे में जानकारी कम से कम पंक्तियों के लिए स्मृति में रखी गई है (यानी यह एक 2D-सरणी, या एक सरणी-सरणियों)। इस प्रकार, मैं एक ही पंक्ति में कई आसन्न कोशिकाओं को खोलने की कोशिश करूँगा, जिससे मैं जाने पर प्रक्रिया की मेमोरी डंप बनाता हूं, और फिर उन्हें अलग करता हूं और एक ही मेमोरी क्षेत्र में किसी भी दोहराए जाने वाले परिवर्तनों की तलाश करता हूं (यानी 1 बाइट पहले कदम पर बदल गया, अगला बाइट अगले चरण, आदि पर एक ही मूल्य में बदल गया)।

यह भी संभावना है कि यह एक पैक बिट ऐरे है (3 बिट्स प्रति माइन सभी संभव राज्यों को रिकॉर्ड करने के लिए पर्याप्त होना चाहिए - बंद / खुला, मेरा / नहीं-मेरा, झंडी / गैर-ध्वजांकित), इसलिए मैं इसके लिए भी देखूंगा ( पैटर्न भी दुहराने योग्य होगा, हालाँकि स्पॉट के लिए कठिन)। लेकिन इससे निपटने के लिए एक सुविधाजनक संरचना नहीं है, और मुझे नहीं लगता कि मेमोरी का उपयोग माइनस्वीपर के लिए एक अड़चन थी, इसलिए यह संभावना नहीं है कि इस तरह का उपयोग किया जाएगा।


0

जबकि कड़ाई से एक "रिवर्स इंजीनियर टूल" नहीं है, और एक खिलौने का अधिक भी मेरे जैसे एक बेवकूफ का उपयोग कर सकता है, चीट इंजन की जांच करें । यह कुछ हद तक ट्रैक करना आसान बनाता है कि स्मृति के किन हिस्सों में बदलाव हुआ है, कब, और यहां तक ​​कि पॉइंटर्स के माध्यम से परिवर्तित मेमोरी पार्ट्स को ट्रैक करने के प्रावधान हैं (हालांकि आपको शायद इसकी आवश्यकता नहीं है)। एक अच्छा इंटरैक्टिव ट्यूटोरियल शामिल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.