उह, यहाँ वे मुझे एक हब पर नचा रहे हैं, और मेरे पास आपके लिए एक उत्कृष्ट लेख है, इसलिए सभी को नमस्कार!
परिचय
कभी आश्चर्य है कि आर्केड मशीनों में क्या है? क्या ओएस, क्या तकनीकों का उपयोग खेल विकसित करने के लिए किया जाता है? वे नकल और संशोधन से कैसे सुरक्षित हैं? यदि हाँ, तो इस विषय में आपका स्वागत है।
अंदर
तो हमारे मशीन के अंदर क्या है?
- PIUIO और JAMMA बोर्ड के साथ सामान्य x86 कंप्यूटर
- एम्पलीफायर, क्रॉसओवर और इक्वलाइज़र
- एलईडी पैनल
- बटन "टेस्ट", "सेवा" और तुल्यकारक knobs के साथ नियंत्रण कक्ष
- एलसीडी या CRT स्क्रीन
हम, ज़ाहिर है, मुख्य रूप से कंप्यूटर में रुचि रखते हैं।
कंप्यूटर के नवीनतम संस्करण के इनसाइड के कई संशोधन हैं:
मदरबोर्ड : गीगाबाइट GA-945GCM-S2L / Asrock G41M-S3
ग्राफिक्स : Geforce 8400GS / Geforce 9300GS
मेमोरी : DDR2 / DDR3 512 एमबी
प्रोसेसर : इंटेल सेलेरॉन
खेल स्वयं हार्ड ड्राइव पर स्थित है। इसमें
SafeNet MicroDog USB डोंगल शामिल है।
अध्ययन
कहाँ से शुरू करें? स्वाभाविक रूप से, हार्ड ड्राइव डंप को हटाने के साथ। यह लिनक्स में एक कमांड के साथ किया जाता है:
dd if=/dev/sdX of=./dump.bin bs=1M
और हम चाय पीने जाते हैं, क्योंकि इसमें लगभग 10-15 मिनट लगते हैं। Winchesters का उपयोग 160 और 250 गीगाबाइट पर किया जाता है।
रनिंग हार्ड ड्राइव पर कभी भी कुछ न करें! आपको हमेशा एक छवि का उपयोग करने की आवश्यकता है!प्रतिमा ले ली है। चलो
उस पर
cfdisk चलाते हैं।
हम क्या देखते हैं? Ext2 फ़ाइल सिस्टम के साथ दो विभाजन, और डिस्क की शुरुआत में संदिग्ध रूप से बहुत से असंबद्ध स्थान। फ़ाइल सिस्टम तुरंत इस विचार को जन्म दे सकता है कि अंदर कुछ यूनिक्स-जैसा है, उच्च संभावना के साथ, निश्चित रूप से, लिनक्स।
चलो इसे एक आभासी मशीन में चलाते हैं। मुझे
क्यूमू बहुत पसंद है, इसलिए मैं इसका इस्तेमाल करता हूं।
और कुछ नहीं। तो या तो qemu एक त्रुटि के साथ विफल रहता है जैसे:
qemu: fatal: Trying to execute code outside RAM or ROM at 0xa5ff00d8
या तो बस जमा देता है। ईमानदारी से, मुझे पता था कि इस गेम में हार्ड ड्राइव के लिए एक बंधन है, और यह स्पष्ट हो गया कि एल्गोरिथ्म काफी सरल है और डेटा अखंडता की जाँच नहीं करता है, लेकिन तुरंत डिक्रिप्ट किए गए डेटा पर नियंत्रण स्थानांतरित करता है, और एक आभासी मशीन के मामले में, बस कचरा करने के लिए।
इसके अलावा, मैंने, कुछ खोजों की प्रतीक्षा करने के बजाय, ब्याज की खातिर, यह देखने का फैसला किया कि ext2 फ़ाइल सिस्टम के साथ उन दो वर्गों पर क्या निहित है। और यहाँ है:
1 ├── [4.0K] game │ └── [ 25G] _00000.BIN ├── [4.3M] i ├── [ 16K] lost+found ├── [ 0] n ├── [8.5M] p ├── [7.8M] u └── [ 22M] x game/_00000.BIN: data i: data n: empty p: data u: data x: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped 2: ├── [ 16K] lost+found └── [144K] PIUFESTAEX.INI
ठीक है, "x" फ़ाइल को छोड़कर, अनुभाग 1 का सभी डेटा साधारण डेटा है, या इसे एन्क्रिप्ट किया गया है। केवल एक "एक्स" किसी तरह इस द्रव्यमान से बाहर खड़ा है - यह एक साझा पुस्तकालय है, जो शायद खेल द्वारा लोड किया जाता है (वास्तव में, नहीं)।
आगे क्या? खैर, वे हार्ड ड्राइव में ही चढ़ गए।
00000000 fa 33 c0 8e d0 bc 00 7c 8b f4 50 07 50 1f fb fc |.3.....|..PP..| 00000010 bf 00 06 b9 00 01 f3 a5 ea 1d 06 00 00 b6 00 b9 |................| 00000020 02 00 bf 05 00 bb 00 07 b8 01 02 57 cd 13 5f 73 |...........W.._s| 00000030 0c 33 c0 cd 13 4f 75 ed be 8a 06 eb 3b b9 03 00 |.3...Ou.....;...| 00000040 bf 05 00 bb 00 20 53 07 bb 00 00 b8 20 02 57 cd |..... S..... .W.| 00000050 13 5f 73 0c 33 c0 cd 13 4f 75 e8 be 8a 06 eb 18 |._s.3...Ou......| 00000060 b9 ff 3f be 00 08 33 ff ad 83 e6 bf 26 33 05 ab |..?...3.....&3..| 00000070 49 75 f5 ea 00 00 00 20 ac 3c 00 74 0b 56 bb 07 |Iu..... .<.tV.| 00000080 00 b4 0e cd 10 5e eb f0 eb fe 44 69 73 6b 20 49 |.....^....Disk I| 00000090 2f 4f 20 45 72 72 6f 72 00 00 00 00 00 00 00 00 |/O Error........| 000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000180 28 43 29 32 30 30 34 20 41 4e 44 41 4d 49 52 4f |(C)2004 XXXXXXXX| 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000001b0 00 00 00 00 00 00 00 00 9b f6 31 c9 00 00 00 00 |..........1.....| 000001c0 41 8f 83 fe ff ff cf ce 61 00 b1 a1 a9 03 00 fe |A.......a.......| 000001d0 ff ff 83 fe ff ff 6f 56 36 04 80 60 1f 00 00 00 |......oV6..`....| 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200 50 75 6d 70 20 49 74 20 55 70 3a 20 46 69 65 73 |Xxxx Xx Xx: Xxxx| 00000210 74 61 45 78 00 00 00 00 00 00 00 00 00 00 00 00 |xxXx............| 00000220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000300 20 20 20 20 20 20 20 20 20 20 20 20 36 56 4d 51 | 6VMQ| 00000310 57 54 34 37 43 43 34 36 20 20 20 20 53 54 33 31 |WT47CC46 ST31| 00000320 36 30 33 31 38 41 53 20 20 20 20 20 20 20 20 20 |60318AS | 00000330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | | 00000340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000400 0e a8 36 bd 22 ac ea 0e a9 36 bb 22 82 66 80 70 |..6."....6.".fp| 00000410 dc 7a 36 37 c8 5d 18 36 ae fa 83 3a 74 d8 35 29 |.z67.].6...:t.5)| 00000420 11 b9 2d 25 1f c8 7d 10 07 c8 7d 21 81 34 07 ae |..-%..}...}!.4..| ...
("X" के बजाय निर्माता का नाम और गेम का नाम था। मैंने उन्हें हटा दिया, ताकि इस विषय को इन आंकड़ों से गुगली न किया जा सके। यदि आप चाहते हैं, तो यह पता लगाने के लिए कि क्या था, मैंने HEX डेटा नहीं बदला है)यह क्या है मैं समझाता हूं।
0-1BE पर, MBR बूटलोडर सबसे सरल है, जो स्टेज डिस्क बूटलोडर को पहले डिस्क से लोड करता है, जो 400 पर शुरू होता है। सबसे दिलचस्प लाइन 300-32F पर स्थित है, जो हार्ड ड्राइव, फर्मवेयर संस्करण और मॉडल के सीरियल नंबर के समान है। लेकिन अनुमान लगाने के लिए क्या है, यह है;)
विवरण | डेटा |
सीरियल नंबर (20 बाइट्स) | (12 रिक्त स्थान) 6VMQWT47 |
फर्मवेयर संस्करण (8 बाइट्स) | CC46 (4 रिक्त स्थान) |
मॉडल का नाम (40 बाइट्स) | ST3160318AS (29 स्थान) |
मैं आसानी से चला गया: मैंने स्टेज 2-लोडर के एल्गोरिथ्म को अलग नहीं किया, लेकिन सिर्फ क्यूमू में थोड़ा कोड जोड़ा ताकि वह पर्यावरण चर DRIVE_MODEL, DRIVE_ERERIAL और DRIVE_VERSION से हार्ड ड्राइव डेटा ले। इसके अलावा, क्यूमू आपको अतिथि मशीन की मेमोरी को डंप करने की अनुमति देता है, जो हमारे लिए उपयोगी होगा।
valdikss@valaptop:~/ % DRIVE_SERIAL=" 6VMQWT47" DRIVE_VERSION="CC46 " DRIVE_MODEL="ST3160318AS" qemu-system-i386 disk.img -monitor stdio QEMU 1.4.1 monitor - type 'help' for more information (qemu) dump-guest-memory mem.bin (qemu) quit
विशुद्ध रूप से नेत्रहीन रूप से डेटा डिक्रिप्शन की शुद्धता को निर्धारित करना संभव था: यदि कर्नेल को सफलतापूर्वक अनपैक किया गया और शुरू किया गया, तो कर्सर इस समय स्क्रीन पर दिखाई देगा, यदि फ़ाइल सिस्टम सही ढंग से अनपैक किया गया था, तो वर्चुअल मशीन की स्क्रीन झपकी लेगी, और एक्स शुरू करने का प्रयास करेगा।
लिनक्सॉइड के रूप में, मैंने तुरंत Alt + FN संयोजनों का उपयोग करके किसी अन्य कंसोल पर स्विच करने का प्रयास किया, और मैं सफल रहा: दूसरे कंसोल पर, एक एक्स आउटपुट था।
क्यूमू में छवि सफलतापूर्वक लॉन्च की गई थी, यह पहले से ही अच्छा है, तो आगे क्या है? हमें किसी तरह फाइल सिस्टम लाने की जरूरत है। निश्चित रूप से, initrd या initramfs को कर्नेल के साथ लोड किया जाता है, जिसमें या तो सभी आवश्यक फाइलें स्थित होती हैं, या जो रूटफ्रेम को डिक्रिप्ट और जोड़ता है। क्या करें? आइए अपनी मेमोरी डंप पर वापस जाएं और अद्भुत
बिनवॉक उपयोगिता के साथ इसके माध्यम से
जाएं :
DECIMAL HEX DESCRIPTION ------------------------------------------------------------------------------------------------------------------- 0 0x0 ELF 32-bit LSB core file Intel 80386, version 1 (SYSV) 141888 0x22A40 Copyright string: " 1999-2003 XXXXXXXXxxx" 1649782 0x192C76 CramFS filesystem, little endian size 279239 CRC 0x42c70000, edition 20, 141723904 blocks, 1589959 files 3848752 0x3ABA30 CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files 17648271 0x10D4A8F mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit 17752783 0x10EE2CF mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit 17773455 0x10F338F mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit 17966760 0x11226A8 Copyright string: " (C) 1996-2009 the UPX Team. All Rights Reserved. $l Rights Reserved. $" 18179243 0x11564AB Copyright string: " (C) 2009 Free Software Foundation, Inc.ion, Inc." 18236316 0x116439C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 18261064 0x116A448 LZMA compressed data, properties: 0xBD, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes 18261104 0x116A470 LZMA compressed data, properties: 0xB8, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes 21033884 0x140F39C ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV) 21061669 0x1416025 ELF 32-bit LSB no file type, no machine, (GNU/Linux) 21088103 0x141C767 ELF 21152544 0x142C320 LZMA compressed data, properties: 0x6C, dictionary size: 16777216 bytes, uncompressed size: 838860800 bytes 21435292 0x147139C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 21525404 0x148739C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 21537692 0x148A39C ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV) 21554076 0x148E39C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 21615281 0x149D2B1 Copyright string: " (C) 2006 Free Software Foundation, Inc.ion, Inc." 21672860 0x14AB39C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 21926836 0x14E93B4 ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV) 110031566 0x68EF2CE gzip compressed data, was "cursor.pcf", from Unix, last modified: Fri Feb 13 07:15:31 2004 116417852 0x6F0653C CramFS filesystem, little endian size 4947968 version #2 CRC 0x86f06160, edition 16777216, 18 blocks, 0 files 121710143 0x741263F LZMA compressed data, properties: 0x87, dictionary size: 1048576 bytes, uncompressed size: 256 bytes 121721756 0x741539C ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV) 122005647 0x745A88F LZMA compressed data, properties: 0x87, dictionary size: 1048576 bytes, uncompressed size: 256 bytes 122594740 0x74EA5B4 LZMA compressed data, properties: 0x7E, dictionary size: 16777216 bytes, uncompressed size: 33554432 bytes 122614684 0x74EF39C CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files 129803164 0x7BCA39C CramFS filesystem, little endian size 4947968 version #2 sorted_dirs CRC 0x9c99ddde, edition 0, 2433 blocks, 235 files
ओह, बहुत सारी चीजें हैं!
वास्तव में, सभी LZMA प्रतिक्रियाएं झूठी हैं, जैसा कि उसके पास जादू की संख्या नहीं है, ईएलएफ के आधे भी नकली हैं। लेकिन 235 फ़ाइलों के साथ CramFS वास्तविक के समान है, और, उच्च संभावना के साथ, यह initrd के रूप में उपयोग किया जाता है।
मेमोरी से सही CramFS को पुनर्प्राप्त करना आसान है। CramFS फ़ाइल के रूप में आपकी हार्ड ड्राइव पर होने के बाद, हम इसे अनपैक करने का प्रयास करेंगे। मैंने
फर्मवेयर-मॉड-किट पैकेज से cramfs-2.0 का उपयोग किया।
valdikss@valaptop:~/ % cramfsck -x root cram1.bin cramfsck: crc error
खैर, आपको क्या उम्मीद थी? सोचा सब कुछ इतना सरल होगा?
अगर हम cramfsck में चेकसम चेक को पैच करते हैं, तो हम फ़ाइल सिस्टम को "सफलतापूर्वक" खोल सकते हैं:
फाइल सिस्टम ट्री ├── [4.0K] bin │ ├── [ 7] ash -> busybox │ ├── [130K] busybox │ ├── [ 7] cat -> busybox │ ├── [ 7] chmod -> busybox │ ├── [ 7] cp -> busybox │ ├── [ 7] df -> busybox │ ├── [ 7] dnsdomainname -> busybox │ ├── [ 7] echo -> busybox │ ├── [ 7] false -> busybox │ ├── [ 7] hostname -> busybox │ ├── [ 7] kill -> busybox │ ├── [ 7] ln -> busybox │ ├── [ 7] ls -> busybox │ ├── [ 7] mkdir -> busybox │ ├── [ 7] mknod -> busybox │ ├── [ 7] mount -> busybox │ ├── [ 7] mv -> busybox │ ├── [ 7] netstat -> busybox │ ├── [ 7] ping -> busybox │ ├── [ 7] ps -> busybox │ ├── [ 7] pwd -> busybox │ ├── [ 7] rm -> busybox │ ├── [ 7] sh -> busybox │ ├── [ 7] sleep -> busybox │ ├── [ 7] sync -> busybox │ ├── [ 7] true -> busybox │ ├── [ 7] umount -> busybox │ ├── [ 7] uname -> busybox │ └── [ 7] vi -> busybox ├── [4.0K] dev │ ├── [ 0] console │ ├── [ 0] null │ ├── [ 0] tty1 │ └── [ 0] tty2 ├── [4.0K] etc │ ├── [4.0K] init.d │ │ ├── [ 90] mnttab │ │ ├── [ 754] once │ │ ├── [ 412] rcS │ │ └── [ 244] run │ ├── [ 151] inittab │ └── [4.0K] X11 │ └── [ 23] xorg.conf -> /usr/lib/xorg/xorg.conf ├── [4.0K] lib │ ├── [111K] ld-2.10.1.so │ ├── [ 12] ld-linux.so.2 -> ld-2.10.1.so ... │ ├── [ 78K] libz.so.1.2.3 │ └── [4.0K] modules │ └── [ 25K] atkbd.ko ├── [4.0K] mnt │ ├── [4.0K] 0 │ │ └── [ 0] invalid │ ├── [4.0K] 1 │ │ └── [ 0] invalid │ └── [4.0K] hd ├── [1.1M] piu ├── [4.0K] proc ├── [4.0K] sbin │ ├── [ 14] halt -> ../bin/busybox │ ├── [ 14] ifconfig -> ../bin/busybox │ ├── [ 14] init -> ../bin/busybox │ ├── [ 14] insmod -> ../bin/busybox │ ├── [ 14] lsmod -> ../bin/busybox │ ├── [ 14] mdev -> ../bin/busybox │ ├── [ 14] poweroff -> ../bin/busybox │ ├── [ 14] reboot -> ../bin/busybox │ └── [ 14] route -> ../bin/busybox ├── [4.0K] SETTINGS ├── [4.0K] sys ├── [ 4] tmp -> /var ├── [4.0K] usr │ ├── [4.0K] bin │ │ ├── [ 18K] amixer │ │ ├── [ 17] du -> ../../bin/busybox │ │ ├── [ 17] env -> ../../bin/busybox │ │ ├── [ 17] free -> ../../bin/busybox │ │ ├── [ 17] less -> ../../bin/busybox │ │ ├── [4.4K] mountrd │ │ ├── [4.6K] mount_tab │ │ ├── [ 17] telnet -> ../../bin/busybox │ │ ├── [ 25K] usbdaemon │ │ ├── [ 4] X -> Xorg │ │ ├── [ 14K] xinit │ │ └── [1.7M] Xorg │ ├── [4.0K] lib │ ├── [4.0K] sbin │ │ └── [ 17] setlogcons -> ../../bin/busybox │ ├── [4.0K] share │ │ ├── [4.0K] alsa │ │ │ ├── [8.8K] alsa.conf │ │ │ ├── [4.0K] cards │ │ │ │ ├── [ 669] AACI.conf │ │ │ │ ├── [ 687] aliases.alisp │... │ │ │ │ ├── [ 839] VXPocket.conf │ │ │ │ └── [1.3K] YMF744.conf │ │ │ ├── [4.0K] init │ │ │ │ ├── [1.8K] 00main │ │ │ │ ├── [6.9K] default │ │ │ │ ├── [1.4K] hda │ │ │ │ ├── [ 391] help │ │ │ │ ├── [ 932] info │ │ │ │ └── [ 11K] test │ │ │ └── [4.0K] pcm │ │ │ ├── [ 805] center_lfe.conf ... │ │ │ └── [ 978] surround71.conf │ │ └── [4.0K] X11 │ │ └── [4.0K] xkb │ │ ├── [4.0K] compiled │ │ │ └── [ 11K] server.xkm │ │ └── [4.0K] rules │ │ ├── [ 34K] base │ │ ├── [ 31K] evdev │ │ └── [ 4] xorg -> base │ └── [ 4] var -> /var └── [4.0K] var
यह सब, ऐसा लगता है, आपको लगता है? /Etc/init.d/run जैसी पाठ फ़ाइलें सामान्य प्रतीत होती हैं। लेकिन कोई निष्पादन योग्य फ़ाइल और कोई लाइब्रेरी लॉन्च नहीं की जाती है। पहले तो मैंने सोचा कि खेल एक संशोधित कर्नेल या संशोधित परिवाद का उपयोग करता है। मैंने निष्पादन योग्य फ़ाइलों को पैच किया, देखा कि वे लगभग कैसे हैलो दुनिया से अलग हैं, क्योंकि वे सभी या तो एक
विभाजन दोष के साथ समाप्त हो गए, या, और भी बदतर, सी
अवैध हार्डवेयर निर्देश ।
एक संदर्भ "हैलो वर्ल्ड" संकलित किया, क्योंकि शुरुआत से ही, __libc_start_main के कॉल के साथ, यह गलत दिशा में कहीं उड़ गया। फिर उसने झुंड पर पाप किया, क्योंकि कुछ को पीटा गया था, जैसा कि यह था, और मैंने सुझाव दिया कि शायद संशोधन इसमें था, लेकिन नहीं, पुन: संपादित करने के बाद, खेल, हालांकि यह शुरू करने की कोशिश करने लगा, ऐसा नहीं था। मैंने इसके बारे में 3 दिन तक सोचा। मैं इस नतीजे पर पहुंचा कि क्रैमएफएस में निष्पादन योग्य फाइलें किसी तरह से खत्म हो जाती हैं, और पाठ फाइलें अपने मूल रूप में रहती हैं। और वह सही था!
/etc/init.d/run echo run export __GL_SYNC_TO_VBLANK=1 export force_s3tc_enable=true export LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/hd/lib cd /mnt/hd/game xinit /piu /mnt/hd/game/ -- -br -quiet -logverbose 0 -verbose 0 -depth 24 -audit 0 -bs -tst -xinerama
/etc/init.d/once until /usr/bin/mount_tab /etc/init.d/mnttab; do sleep 1; done /usr/bin/mountrd insmod /usr/lib/modules/nvidia.ko insmod /usr/lib/modules/drm.ko insmod /usr/lib/modules/fb.ko insmod /usr/lib/modules/font.ko insmod /usr/lib/modules/softcursor.ko insmod /usr/lib/modules/bitblit.ko insmod /usr/lib/modules/fbcon.ko insmod /usr/lib/modules/drm_kms_helper.ko insmod /usr/lib/modules/cfbcopyarea.ko insmod /usr/lib/modules/cfbimgblt.ko insmod /usr/lib/modules/cfbfillrect.ko insmod /usr/lib/modules/i915.ko mkdir /dev/dri ln -s /dev/card0 /dev/dri/card0 /usr/bin/usbdaemon amixer set Master 80% unmute amixer set PCM 75% unmute amixer set Front 90% unmute insmod /lib/modules/atkbd.ko
/etc/init.d/run setlogcons 2 mount -n -t tmpfs -o size=128k var /var mkdir /var/log mkdir /var/run mkdir /var/run/microdog mount -t sysfs sysfs /sys mount -t proc proc /proc mount -t usbfs none /proc/bus/usb mount -t tmpfs mdev /dev mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s mkdir /dev/snd cp -a /dev/controlC* /dev/snd cp -a /dev/pcmC* /dev/snd cp -a /dev/timer /dev/snd
क्योंकि मेरे हाथ में मूल CramFS था, और यह याद रखना कि मैं Alt + F2 दबाकर एक वर्चुअल मशीन में OS कंसोल को प्राप्त कर सकता हूं, मैंने मूल /etc/init.d/run को बदलने का प्रयास करने का फैसला किया, xin / x / sh के साथ xin कॉल को प्रतिस्थापित किया। । लेकिन हमें किसी तरह से संशोधित CramFS को वापस छवि में धकेलने की आवश्यकता है। हार्ड ड्राइव की छवि में "संकुचित रामएफएस" लाइन की तलाश में, मुझे कुछ आश्चर्य हुआ कि यह अनएन्क्रिप्टेड है! केवल, निश्चित रूप से, ऐसा नहीं है, लेकिन "पैडिंग" के साथ, हार्ड ड्राइव पर पूरी फाइल को 32KB डेटा और 512 बाइट्स शून्य के ब्लॉक में विभाजित किया गया है। खैर, यह कोई समस्या नहीं है!
यह सिर्फ इतना हुआ कि मैंने न केवल /etc/init.d/run को बदल दिया, बल्कि /etc/init.d/once को भी माउंट_टैब, आरोह और usbdaemon पर कॉल करने के लिए टिप्पणी की, और किसी तरह वास्तव में कॉल में लूप पर ध्यान नहीं दिया। mount_tab।
इसलिए, हमने /etc/init.d/run को संपादित किया, CramFS को इकट्ठा किया, इसे छवि में लिखा, और-और-और-और-! ... कुछ भी नहीं। ठीक है, मैंने एफएस को मूल /etc/init.d/run के साथ एकत्र किया, और फाइलों में अंतर देखने के लिए शुरू किया। जैसा कि यह निकला, उनमें से बहुत से थे, मैंने यह समझने के लिए लंबे समय तक कोशिश की कि मामला क्या था, यह पता चला है कि फर्मवेयर-मॉड-किट से cramfs-2.0 थोड़ा अलग तरीके से इकट्ठा करता है। खैर, मैंने रिपॉजिटरीज़ से सामान्य क्रैम्फ़्स-टूल्स डाउनलोड किए, उन्हें एकत्र किया, और अचानक मैंने देखा कि चेकसम के अलावा, फ़ाइलों का अंतिम बाइट अलग है। मूल फ़ाइल में 0x80 है, और जिसे मैंने एकत्र किया है, निश्चित रूप से, 0x00 है। इस स्थिति से आश्चर्यचकित होकर, उन्होंने अपनी फ़ाइल में अंतिम बाइट को बदल दिया, इसे हार्ड ड्राइव और URA की छवि में डाल दिया! छवि मेरे संशोधित एफएस के साथ शुरू हुई, और मुझे कंसोल मिला। फ़ाइलों की प्रतिलिपि बनाने से कोई जटिलता पैदा नहीं हुई, स्टार्टअप फ़ाइलें अब वास्तव में मेरे लिनक्स सिस्टम पर चलती थीं, और यह इस कदम पर था कि मुझे एहसास हुआ कि, वास्तव में, क्रैम्फ़्स विशेष रूप से निष्पादन योग्य फ़ाइलों को संशोधित करता है।
IDA PRO में Mount_tab, Mountrd और usbdaemon पर एक त्वरित नज़र रखने के बाद, मुझे उस समय यकीन था कि Mount_tab ने सही स्थानों पर फ़ाइल सिस्टम को माउंट किया है (हार्ड ड्राइव पर दो विभाजन, पहले / mnt / गेम में, और दूसरा / SETTINGS में) AGP और PCI बसों को स्कैन करता है, डिक्रिप्ट करता है, मेमोरी में लोड करता है और पहले चरण में "p", "i" या "u" फ़ाइलों में से एक / usr / lib में लोड करता है, जिसमें वीडियो कार्ड के लिए ड्राइवर होते हैं, और usbdaad USB के साथ काम करता है UNIX सॉकेट के माध्यम से डोंगल।
झूठी खुशी
मैं बैठा हूं, खेल की लॉन्च फ़ाइल की जांच कर रहा हूं, जिसे मैंने कॉपी करके निकाला है, और मेरा संदेह कम होने लगा है। यह किसी भी तरह से नहीं है, उस गेम के संस्करण का कोई उल्लेख नहीं है जिसे मैं खोज रहा हूं, और सामान्य तौर पर, किसी तरह, कुछ सही नहीं है। मैंने महसूस किया कि यह फ़ाइल गेम के एक अलग संस्करण से संबंधित है, और यह धारणा बना दी कि, जाहिरा तौर पर, USB डोंगल की जाँच करने के बाद, वह कहीं और से दूसरी फ़ाइल ले और डिक्रिप्ट करता है। सब कुछ बहुत मजेदार निकला।
माउंट_टैब पर कॉल करते समय उस लूप को याद रखें? पहली शुरुआत में, यह वास्तव में सिर्फ फाइल सिस्टम को मापता है, लेकिन अगली शुरुआत में यह हार्ड ड्राइव से ऑफसेट 0x1F80200 या 0x2080200 से डेटा की एक निश्चित मात्रा को पढ़ता है, पहली ऑफसेट पर हेडर के आधार पर, इस डेटा को डिक्रिप्ट करता है, और सीधे CramFS गेम लॉन्च फाइल को बदल देता है। सही है। मुझे वास्तव में यह कदम पसंद आया! मैं उग्र था, लेकिन साथ ही, डेवलपर्स की कुशलता पर गर्व था।
निष्कर्ष
लेख कुछ हद तक निकला हुआ था और इसमें मेरे विचारों, अनुमानों और टिप्पणियों के बजाय शामिल थे। मुझे उम्मीद है कि यह पढ़ना दिलचस्प था। भाग 2 विशुद्ध रूप से तकनीकी होगा, और संभवतः गेम की फ़ाइल प्रणाली को पार्स करना और USB डोंगल से गेम को एकजुट करना शामिल होगा।
यहां आपके लिए वीडियो है, आखिरकार।
को प्रणाम
कृपया टिप्पणियों में गेम का नाम न लिखें, ताकि वह Google न हो। धन्यवाद!