آغازی برای کراکینگ

91
١ درس ﻛﺮاﻛﻴﻨﮓ ﺑﺮاي آﻏﺎزي ﻃﺮﺣـﻬﺎي ﻛـﻪ ﻗﺪﻳﻤﻲﺗـﺮ ﻛﺎرﺑﺮدﻫـﺎي از اﺳـﺘﻔﺎده ﻧﻔــﻮد، ﻳﺎ ﻛﺮدن ﻛﺮاك ﻓﺮاﮔﻴﺮي ﺑﺮاي روش ﺑﻬﺘﺮﻳﻦ ﭘﻴــﺪا اﺣﺎﻃﻪ ﻛﺮدن، اﺧﺘﺼﺎﺻﻲ ﻳﻌﻨﻲ ﻧﻔﻮذ، ﻳﺎ ﻛﺮاك ازﻣﻨﻈﻮر) . ﻣﻲﺑﺎﺷﺪ دارﻧﺪ ﻧﻴﺰ ﻗﺪﻳﻤﻲﺗﺮي ﺣﻔﺎﻇﺘﻲ ﻳـﻚ داﺧـﻞ ﺣﻔـﺎﻇﺘﻲ ﻃـﺮح ﭼﻨــﺪ ﻳﺎ ﻳﻚ ﺑﺮاﺑﺮ در ﺷﺪن ﺗﺴﻠﻴﻢ ﻳﺎ اﻧﺪاﺧﺘﻦ ﺗﻌﻮﻳﻖ ﺑﻪ ﻳﺎ ﺣﺬف ﻛﺮدن، ﺷـﻤﺎ ﺑﺪﻳﻨﻮﺳـﻴﻠﻪ( ﻣﻲﺑﺎﺷـﺪ( ﻧﺪارﻳــﺪ دﺳﺘﺮس در را ﺑﺮﻧﺎﻣﻪ اﺻﻠﻲ ﻛﺪ ﺷﻤﺎ وﻗﺘﻴﻜﻪ) ﻛﺎرﺑﺮدي ﻧﺮماﻓﺰار ﺣﻔﺎﻇﺘﻲ ﻃﺮﺣﻬﺎي ﺗﻜﺎﻣﻠﻲ ﺳﻴﺮ ﻛﻪ ﻧﻜﻨﻴﺪ ﻓﺮاﻣﻮش. ﻣﻲﮔﻴﺮﻳﺪ ﻓﺮا ﺳﺮﻋﺖ ﺑﻪ را ﻣﺰاﺣﻤﺖ اﺻﻠﻲ ﺗﻜﻨﻴﻚ. ﻧﻴﺴﺖ ﺻﻮرت ﻳﻚ ﺑﻪ ﻫﻤﻴﺸﻪ ﺷــﻤﺎ ﻣﻮاﻗﻊ ﺑﻴﺸﺘﺮ در اﻣﺎ ﻳﺎﻓﺖ درﺧﻮاﻫﻴﺪ را، ﺟﺪﻳﺪي زﻳﺮﻛﺎﻧﻪ ﺣﻘﻪﻫﺎي ﻣﻮارد ﺑﺮﺧﻲ در اﺣﺘﻤﺎﻻ ﺷﻤﺎ. آورد درﺧﻮاﻫﻴﺪ زاﻧﻮ ﺑﻪ را ﺣﻘﻪ اﻳﻦ دارﻧـﺪ ﺗﻤــﺎﻳﻞ ﺑﻴﺸﺘﺮ آﻧﻬﺎ و اﺳﺖ ﻣﺤﺪود ﺧﻴﻠﻲ اﻏﻠﺐ ﻧﻮﻳﺴﺎن ﺑﺮﻧﺎﻣﻪ واﻗﻌﻲ اﻃﻼﻋﺎت ﻧﻴﺴﺖ، ﻣﺸﻜﻠﻲ ﻛﻤــﻲ اﺳﺖ ﻣﻤﻜﻦﮔﺮﭼﻪ) . ﻛﻨﻨﺪ اﺳﺘﻔﺎده ﻗﺪﻳﻤﻲ ﺣﻔﺎﻇﺘﻲ روﺷﻬﺎي ﻫﻤﺎن از ﺟﺪﻳﺪ ﺗﻜﻨﻴﻜﻬﺎي ﺟﺎي ﺑﻪ زﻣـﺎﻧﻲ ﻣﻌﻤـﻮﻻ ﺣﺎﻟﺖ اﻳﻦ.( آورﻧﺪ ﺑﺪﺳﺖ ﻫﻢ ﭘﻴﺸﺮﻓﺘﻬﺎﻳﻲ ﻣﻮارد ﺑﺮﺧﻲ در ﺣﺘﻲ ﻳﺎ دﻫﻨﺪ ﺗﻐﻴﻴﺮ را آﻧﻬﺎ ﺗﻤـﺎﻳﻼت ﻧــﻮع اﻳﻦ. دﻫﺪ اﻧﺠﺎم را ﻛﺎري ﺧﻮدش ﻟﺬت ﺑﺮاي ﻳﺎ ﭘﻮل ﻋﻮض در ﻛﺴﻲ ﻛﻪ ﻣﻲاﻓﺘﺪ اﺗﻔﺎق ﻣﺠﺒﻮرﻳــﻢ ﻣﺎ ﻛﻪ ﻫﻤﺎﻧﻬﺎﻳﻲ ﻳﻌﻨﻲ ﻣﻲﺷﻮد، ﺗﺸﻮﻳﻖ ﭘﺮﺳﺖ ﭘﻮل و ﻧﺎدان اﻓﺮاد ﺗﻮﺳﻂ ﻛﻮرﻛﻮراﻧﻪ ﺗﺠﺎري،. ﻛﻨﻴﻢ زﻧﺪﮔﻲ آﻧﻬﺎ ﺑﺎ

Upload: ya-si

Post on 09-Feb-2016

65 views

Category:

Documents


17 download

DESCRIPTION

آغازی برای کراکینگ

TRANSCRIPT

Page 1: آغازی برای کراکینگ

درس ١

آغازي براي كراكينگ

ــود، اسـتفاده از كاربردهـاي قديميتـر كـه طرحـهاي بهترين روش براي فراگيري كراك كردن يا نف

ــدا حفاظتي قديميتري نيز دارند ميباشد. (منظور از كراك يا نفوذ، يعني اختصاصي كردن، احاطه پي

ــد طـرح حفـاظتي داخـل يـك كردن، حذف يا به تعويق انداختن يا تسليم شدن در برابر يك يا چن

ــد) ميباشـد) بدينوسـيله شـما نرمافزار كاربردي( وقتيكه شما كد اصلي برنامه را در دسترس نداري

تكنيك اصلي مزاحمت را به سرعت فرا ميگيريد. فراموش نكنيد كه سير تكاملي طرحهاي حفاظتي

هميشه به يك صورت نيست.

شما احتماالً در برخي موارد حقههاي زيركانه جديدي را، درخواهيد يافت اما در بيشتر مواقع شــما

اين حقه را به زانو درخواهيد آورد.

ــايل دارنـد مشكلي نيست، اطالعات واقعي برنامه نويسان اغلب خيلي محدود است و آنها بيشتر تم

ــي به جاي تكنيكهاي جديد از همان روشهاي حفاظتي قديمي استفاده كنند. (گرچه ممكن است كم

آنها را تغيير دهند يا حتي در برخي موارد پيشرفتهايي هم بدست آورند). اين حالت معمــوالً زمـاني

ــوع تمـايالت اتفاق ميافتد كه كسي در عوض پول يا براي لذت خودش كاري را انجام دهد. اين ن

ــم تجاري، كوركورانه توسط افراد نادان و پول پرست تشويق ميشود، يعني همانهايي كه ما مجبوري

با آنها زندگي كنيم.

Page 2: آغازی برای کراکینگ

بهمين دليل من با استفاده از مثالها، برخي كاربردهــاي قديمـي و برخـي حقـههاي قديمـي از درس

سوم به بعد، آنها را به شما ياد ميدهم بطوريكه بعدها ما خواهيم توانست حقههاي حفاظتي جديدتر

ــم را نيز با آن پوشش دهيم و شما يادخواهيد گرفت كه چگونه بر آنها پيروز شويد. و به شما خواه

ــردن پيـدا كنيـد. البتـه نـه بـراي گفت كه در چه جاهايي مي توانيد برنامههاي زيادي براي كراك ك

پولدار شدن!

ــر كـراك اين خودآموز براي افرادي است كه ميخواهند كراك كردن را شروع كنند. شايد شما به فك

ــروع بـا كردن باشيد و هدف شما هم موفقيت در اين زمينه باشد، پس استفاده از اين خودآموز و ش

حقهها و پروسيجرهاي آن، شما را در همان مسيري كه ميخواهيد قرار ميدهد.

البته من قول نميدهم آنچه ميخواهيد با اين خودآموز بدست آوريد اما مــن بـهترين كـار ممكـن را

ــا براي شما انجام ميدهم. بعبارت ديگر اگر شما قبالً كدهايي را به كمك اسمبلر كراك كرده باشيد ي

به برخي طرحهاي حفاظتي نفوذ كرده باشيد، اين خودآموز بــراي شـما بعنـوان يـك مبتـدي مفيـد

خواهد بود. (اگر ميخواهيد كمي مفاهيم پايهاي را تكرار كنيم، حركتي نكنيد تا ”go“ را فشار دهيــم،

پس همينجا بمانيد).

براي يك كراك موفقيت آميز، شما به چهارچيز اصلي احتياج داريد:

ــراك - يكسري اطالعات در مورد زبان يك اسمبلر (براي داشتن معلومات بيشتر، و همچنين يك ك

سريعتر و بهتر).

- مقداري بينش

- كمي كمك از يك كراكر با تجربه

- يك تفكر غيرتجارتي (كه در اين مورد بعدًا بيشتر صحبت خواهيم كرد ).

كاربردهايي كه شما براي فراگيري از آنها استفاده خواهيد كرد به چند دسته زير تقسيم ميشوند:

Page 3: آغازی برای کراکینگ

١- كاربردهايي كه با يك كلمه عبور محدود شده است (از همه براي كراك كردن سادهتر است).

ــد محـدود شـدهاند ٢- كاربردهايي كه بر اساس زمان، يا تعداد روزي كه شما از آن استفاده مي كني

(تقريباً براي كراك كردن آسان است).

٣- كاربردهايي كه بر اساس آخرين تاريخي كه شما از آنها استفاده كرديد، محدود شــدهاند (آسـان

براي كراك كردن).

٤- كاربردهايي كه داراي تعداد فانكشن (تابع) هستند. غيرفعال (برخي آسان، برخي مشكل).

ــي بـه ديسـك ميباشـد (ايـن نـوع طـرح ٥- كاربردهايي كه براي كار كردن با آنها، نياز به دسترس

حفاظتي امروزه چندان استفاده نميشود).

با حضور CD-ROM (كم و بيش همان روشها بكار گرفته شــده، امـا نـه بـه آن صورتـي كـه قبـالً

تعريف شده بود) (خيلي آسان براي كراك كردن).

ــت ٦- CRYPTOGRAFEED ADDSON (يعني يكي از طرحهاي حفاظتي قبلي، اما داراي زحم

بيشتر يا استفاده از كدهايي كه خودشان، خودشان را اصالح ميكنند. (XOR كردن و SHRL كردن)

(تقريباً براي كراك كردن آسان است).

٧- هيچيك از حاالت فوق (برخي مواقع براي كراك كردن مشكل است).

مواد مورد نياز را از كجا تهيه كنيم.

ــالت، ثروتـي بـراي همـه كراكرهاسـت! بعـد از مـدت CD ROM DEMOي رايج روي جلد مج

كوتاهي، آنها اعالم ميكنند، شما همه كپيهاي باقيمانده كه غيرفروشــي هسـتند را در آينـده مجـاني

ــود. DEMOهـاي روي سـيديها بـه شـما اجـازه ميدهـد كـه خيلـي سـريع، دريافت خواهيد نم

ــه طريقـي حفـاظت كاربردهاي زيادي را ـ چه كهنه و چه نو ـ جمع آوري كنيد كه هريك از آنها ب

ــع بـا يـك دنيـاي شدهاند (كه در برخي مواقع با طرحهاي جالب توجهي حفاظت شدهاند) . در واق

Page 4: آغازی برای کراکینگ

عجيب كراك مواجه ميشويد. بعدًا بدون هيچ پولي شما مي توانيد روي يــك سـيدي كاربردهـاي

لوتوس (ياMicrosoft يا wordper fect يا هر نام ديگري) كه براي ٣٠ روز، يا ٢٠ بار دسترسي بــه

ــتر و بيشـتر و يـا قـرار دادن آن آن، تنظيم شده باشد، كراك كنيد و در آن صورت براي استفاده بيش

ــوذ كنيـد. بعنوان هديهاي گرانبها روي وب براي تهي دستاني كه هيچ پول يا هوشي ندارند،به آن نف

ــي كننـد. آنـها از ايـن نظـر دورنمـاي جـالبي،وراي بازيها به نحو آشكاري، از اين روش پيروي نم

ــوچـك آنـها حفاظت، براي كراكرها دارند. يعني اينكه طرحهاي حفاظتي سطح باال داخل فايلهاي ك

پنهان شدهاند. به همين سادگي و آساني براي شكستن و حذف يك طرح حفاظتي داخل يك فــايل

٣٥٠٠٠ بايتي قابل اجرا بايد آنها را داخــل مجموعـهاي از چنديـن DLL طوالنـي كـه همديـگر را

ــي بـه انـدازه ٢٠٠٠٠٠٠بـايت داشـته باشـند، پيـدا كنيـد. پوشش مي دهند و هريك مي توانند طول

گروههاي برنامهنويسي پيشرفته و در عين حال تنبل،به طور سيستميك. طرحهاي حفاظتي را طوري

ــتند برنامـه پنهان مي كنند كه مثل نيش جانوري در يك بيابان پهناور مي ماند. در واقع آنها قادر نيس

را داخل يك اسمبلر بكار گيرند. آنها از زبانهاي چرب و نرمي مثل ويژوال بيسيك، دلفي يا ويــژوال

ــن كاربردهـا را بـه ++C استفاده ميكنند (نگران نباشيد، من چگونگي كراك كردن آن هم سريع با اي

شما خواهم آموخت).

ــرح حفـاظتي دليل ديگر استفاده از بازيها بجاي كاربردها در اين مطالعه اين است كه اغلب همان ط

ـا ساده (و كوتاهي) كه شما در يك بازي اشتراكي به آن نفوذ كرديد بعدًا براي يك كاربرد گرافيكي ب

ارزش و گران قيمت استفاده مي شود به همين دليل در اين خودآموز ما بيشتر به طرحهاي حفــاظتي

ــه بازيها، نفوذ خواهيم كرد تا اينكه در آينده از آنچه آموختيم، براي نفوذ به طرح حفاظتي يك برنام

،(remote يـا) كاربردي تجاري، يا براي نفوذ و دسترسي به روتينهاي حفاظت شده ســرورهاي دور

يا BBS، يا حتي ATM (صندوق ناظر هزينه) استفاده كنيم.

Page 5: آغازی برای کراکینگ

ــا پـي در اينجا، يك مثال كراك كردن را در ذيل ميبينيد كه من اميدوارم به اين وسيله شما به هنر م

ببريد. اجازه دهيد بعنوان مقدمه، با هم به اين كاربرد حفاظت شده، نفوذ كنيم. بعدًا در درس ٤ شـما

ــي مـدت زمـاني كـه ياد خواهيد گرفت كه كليه كاربردهايي كه بر اساس زمان محدود شدهاند (يعن

ــالوگي دارنـد. شما مي توانيد كار كنيد يا تعداد دفعاتي كه مي توانيد كار كنيد) طرحهاي حفاظتي آن

(اگرچه با وجود بزرگي، تنوع چنداني ندارند).

ــير ١- ممكن است آنها شمارندهاي داشته باشند كه هربار يكي اضافه مي شود: آن را بيابيد و غ

فعال كنيد.

٢- ممكن است آنها وقفههاي زمان ساعت را FETCH كننــد و در ماشـين شـما قـرار دهنـد:

خودتان از اينكار جلوگيري كنيد.

ــاري ٣- ممكن است آنها يك مقدار تصادفي را با يك متغير مقايسه كنند: با اين حالت هيچ ك

نميتوانيد بكنيد.

٤- ممكن است آنها بصورت تصادفي تاريخ ساير فايلهاي روي هارد شما را (حتي آنهايي كــه

ــام مـي دهـد بي ربط هستند) بررسي كنند: در اين حالت شما بايد روتيني كه اينكار را انج

پيدا كند و JUMPهاي آن را بر عكس كنيد!

حاال من مي خواهم با يك مثال پيشرفته از اين حالت حفاظتي استفاده از شمارندهها، شروع كنم. در

ــن يـك DEMOي خيلـي رايـج را اين وضعيت احساس كراك كردن به شما دست خواهد داد و م

ــراي نمـايش برخـي براي اينكار انتخاب كردهام كه شما هم خيلي راحت ميتوانيد آن را پيدا كنيد. ب

مشكالتي كه ممكن است شما با آن روبرو شويد، ما از اين مثال استفاده مي كنيم. (شما روش نفــوذ

كار و اثربخش را طي درسهاي آينده خواهيد آموخت).

ARCADE POOL, Demonstration version, PC Conversion مثال:

Page 6: آغازی برای کراکینگ

by East Point Software Ltd, (c) Team 17 Software Ltd 1994

اين DEMO از طريق تعدادي از مجالت روي سي دي رام در طول سال ١٩٩٥ منتشر شــده اسـت.

ــا آنچه در ذيل ميآيد، حتي اگر شما اين مثال را نداشته باشيد، براي شما قابل استفاده مي باشد. ام

در عين حال شما بايد يك كپي از اين DEMOي رايج را به منظور فهم بهتر نكات زير تهيــه كنيـد.

اين DEMOي زيبا، يك بازي بيليارد است كه بر اساس مـدت زمـان اسـتفاده از آن محـدود شـده.

يعني شما فقط ٢ دقيقه ميتوانيد بازي كنيد. و بدنبال آن در يك پنجره به شــما اعـالم ميشـود كـه از

كجا و چگونه ميتوانيد نسخه اصلي اين برنامه را تهيه كنيد. ايــن بـهترين حفـاظت درهـم و برهـم

ــه ميباشد. خب حاال چطور و از كجا ميخواهيد شروع كنيم؟ انچه شما ميتوانيد انجام دهيد، در ادام

آمده است:

[SOFT-ICE] را بگيريد و آن را در فايل Config.sysتان بارگذاري كنيد. درس ٢ يعني ابزارهاي

MARQUIS DE بوسيله [SOFT-ICE] مزاحمت در مورد اين ديباگر را ببينيد. نسخه ٢/٦ برنامه

SOIREE ،كراك شده و بصورت مجاني روي وب، يافت ميشود.

-vecs s (ذخيره همه بردارها قبل از بارگذاري آنها)

[Pooldem.exe] start-

- vecs c (مقايسه بردار، ذخيره يك پرينت از كليه بردارهاي hook شده).

ــار - براي فهم اينكه چه چيزي در [pooldemo.exe] ، كجا مي رود و ما كجا پرسه مي زنيم، چند ب

وارد soft-ice شويد و از آن خارج شويد.

(شما هميشه بايد بيش از يكبار يافتههايتان را موقع جستجو كنكاش كردن، چك كنيد هيچ چــيز بـه

اندازه همان dos غيرفعال و قديمي نمي تواند نكات و روشهاي پيچيده را براي ما روشن كند).

- نظري به (نقشه يا) map حافظه مورد استفاده بياندازيد.

Page 7: آغازی برای کراکینگ

Snap .در آن مســتقر شـده ذخـيره كنيـد [pooldemo.exe] حافظه اصلي را. جايي كه snap حاال -

(snap-sane) كردن يعني ذخيره تصاويري از نواحي حافظه

- هيچ كاري انجام ندهيد و اجازه دهيد ثانيهها سپري شوند.

ــد snapهـا را مقايسـه كنيـد - هر دو يا سه ثانيه بدون اينكه چيزي را روي صفحه بازي جابجا كني

ــه بـاعث فعـال (snap-compar) (هيچ چيزي، حتي كليك موس) بنابراين اميدواريم تنها تغييراتي ك

شدن شمارنده مي شوند

ذخيره شوند.

- مقايسه snap دوبار در ثانيه -مقايسه snap در ثانيه :00:٥٩ و در ثانيه ١:٠١

(nag screen يا) nag صفحه snap درست قبل و بعد از محدوديت زماني و، snap مقايسه -

- حاال با دقت پرينت dataهاي snapهايتان را جمع آوري كنيد. حاال بطــور واضـح روي صفحـات

مختلف snapهاي روي داده را بنويسيد.

ــا يـك ودكـاي مـارتيني بنشـينيد (فقـط ودكـاي - حاال لحظه زيباي كراك كردن فرا رسيده. حاال ب

ــه روسي) و به محلهاي مختلفي كه روي پرينتها داريد فكر كنيد. محلي را پيدا كنيد كه در آن مقايس

snapدچار تغيير شده، آناليز، تغيير و معادل سازي كنيد.

هي، چيزهايي اينجا و آنجا صيد شدهاند (شما خوش شانس هستيد با كمي تغييرات شــما اينكـار را

انجام داديد، در اين حالت فقط دو دوجين).

- در حال اجرا روي محلي كه پيدا كردهايد، يـك break point بگذاريـد. يعنـي محلـي كـه فكـر

ــك زمـان خـاصي، بـا صفـر مي كنيد شمارنده از آنجا فعال مي شود. بعبارت ديگر محلي كه در ي

شدن آن اجراي برنامه خاتمه مييابد.

Page 8: آغازی برای کراکینگ

ــات محـل مـورد نظـر در - حاال معادل شمارنده BPX را بوسيله break كردن در لحظهايكه محتوي

ــه حال تعويض است، در آن جا قرار دهيد. بدين وسيله، شما باعث مي شويد برنامه از اول شروع ب

اجرا كند. (به اندازه يك ثانيه براي شروع مجدد طول مي كشد). اســتفاده از شـمارنده معـادل، مثـل

يك اجراي يك مرحلهاي در طول حيات برنامه شما ميباشد!.

در اين حالت شما به سرعت در محل تعويض يعني 3DD0، قرار مي گيريد. سطر تعويض در زير

آمده است:

xxxx:3DCC C706F1013C00 MOV WORD PTR [01F1], 003C

كه بايت 3C در آدرس xxxx:3DD0 يك شمارنده بايت ميباشد. يعني برنامه 3C را در ايــن محـل

ـــد يعنــي بـارگذاري مـي كنـد و سـپس دسـتورهاي DEC آن را مرحلـه بـه مرحلـه. كـم ميكنن

ــادان يـك ثانيـه از وقتـش بـراي 38,39,3A,3B و .... تا 0 و وقتيكه به صفر رسيد، بينگو! كاربر ن

بازي را از دست داده است.

ــاظت اگر شما جستجوي بيشتري براي يافتن محل صحيح مربوط به nag screen، براي حذف حف

ــا اگر فكـر انجام دادهايد، حاال وقت آن است كه همان اولين سطح ويزارد مربوطه را حفظ كنيد. ام

مي كنيد آن را قبالً بدست آوردهايد ولي خاطرتان نيست كه از چــه روشـي اسـتفاده كردهايـد، ايـن

اصل را بخاطر بسپاريد: ”فقط يكبار شما مي توانيد اثر يك حفاظت را حذف كنيد، پس بيش از اين

كاري انجام ندهيد“.

اكثر مواقع اين گفته درست است كه : شما هميشه احتياجي به حذف يــك حفـاظت نداريـد (مـگر

ــر يـك طـرح حفـاظتي آسـانتر (و آنكه شما دقيقاً براي اينكار مطالعه كرده باشيد). معموالً حذف اث

سريعتر) ميباشد كه متأسفانه در مثال ما كار درستي نخواهد بود.

Page 9: آغازی برای کراکینگ

در اينجا شما تصور مي كيند شمارنده را قبالً پيدا كردهايد. در واقع شما، شمارندهايكه ساعت طــرح

ــدار حفاظتي را تنظيم ميكند، پيدا كردهايد[pooldemo.exe] . حاال شايد فكر كنيد كه مي توانيد مق

يدكي را پيدا كنيد و آن را به جاي 3C به EE تغيير بدهيد، (ها، FF را هم تمرين كنيد... اما هميشــه

تمرين كردن روي مقادير اضافي در موقع كراك كردن خيلي خوبست) شما بايد چــهار دفعـه بـراي

بازيتان زمان بگيريد تا طرح حفاظتي غيرفعال شود.

ــه EE تغيـير دهيـد. بـراي كـار روي بايتـها شـما بـايد از يـك پس محل xxxx:3DD0 را از 3C ب

ــورت اشـتراكي ويرايشگر هگز مثل PSEDIT يعني [ Psedit.exe ] (يا parity solution) كه به ص

ــد (بخـش ابـزار مزاحمـت را ببينيـد) ولـي هميشـه امكـان كـار بـا هم اجرا مي شود استفاده كني

ديباگرهايي مثل [debug] يا [symdeb] براي شــما فراهـم نيسـت (درس ٢ را ببينيـد). حـاال فـايل

dead[exe.*] ايكه با كپي آن كار كرديد بخاطر بياوريد.

ren POOLDEMO.EXE POOLDEMO.DED

symdeb POOLDEMO.DED

-s (cs+0000):0 Lffff C7 06 F1 01 C3 <- this string

corresponds to the

refill line).

cs:3E85 <- symdeb gives you two locations as answer

cs:3EEA

-e cs:3E85+4 EE <- refill changed from C3 to EE

-w

ren POOLDEMO.DED POOLDEMO.EXE

ــراك كردهايـد و احسـاس حاال شما pooldemo موقتي خودتان را اجرا كنيد. گمان ميكنيد آن را ك

خشنودي ميكنيد.. اما لوو! هيچ چيزي در مجموع تغيير نكرده است. همه چيز به سختي قبل اسـت.

Page 10: آغازی برای کراکینگ

ــد شما فقط دو نوبت براي بازي وقت داريد. چطور مي خواهيد حريف را ناكام كنيد بطوريكه نتوان

هيچ كاري انجام دهد؟

خب براي شروع شما به اندازه كافي مراقب نبوديد! جستجو در ديباگر دو محل را به شما مي دهـد،

ــت كـه خواهيـد شما ناداني كرديد و آن را كه درست بود تشخيص نداديد. چك كنيد، آن وقت اس

ديد دومين محل (CS:3EEA) يك منطقه با كنترل آينهاي ميباشد (در اين مورد بعدًا بيشتر صحبت

خواهيم كرد) . در برخي مواقع دو محل وجود دارد كه با استفاده از يك روتين دوبــل،كـار سـريعتر

ــد. پـس شـما مي شود. گاهي دومين محل آينه اولي مي باشد و در مواقع لزوم آن را تصحيح ميكن

بايد اين يكي را هم اصالح كنيد. مثل قبل رفتار كنيد. اما اين بار به كمك يك ديباگر ســطر زيـر را

وارد كنيد:

-E CS: 3EEA+4 EE

ــد آن را اجـرا كنيـد. لـوو ! قبل از نوشتن برگرديد به فايل deal و آن را به exe تغيير نام دهيد و بع

هوو!

يواش! شما آنجا هستيد؟ pooldemo.exeي شما، حاال بدون حفــاظت اسـت. فكـر ميكنيـد حـاال

بتوانيد مثل احمقها ١٢ دقيقه واقعي بازي كنيد، حتي اگر معتقد باشيد طــرح حفـاظتي (و شـمارنده)

تنها دو دقيقه به شما وقت مي دهند.

ــا نـه! پس شروع به بازي كنيد، ثانيهها خيلي آهسته ميگذرند و همه چيز خوب به نظر مي رسد. ام

در صفحه ثانيه ٢٨، شما تصويري را ميبينيد كه به شما ميگويد «دو دقيقــه تمـام شـد». يعنـي شـما

واقعاً اشتباه كرديد، برنامه زمان صحيح را از تايمر ميگيرد و شما بطرز احمقانــهاي فقـط شـمارنده

روي صفحه نمايش را اصالح كردهايد.

Page 11: آغازی برای کراکینگ

ــه راهـهايي را كـه از آغـاز كـراك پس بايد برگرديد براي كراك كردن و اوقاتتان تلخ است بطوريك

ــردن كردن طي كردهايد فراموشتان شده. پس بايد حاال كارتان را تكميل كنيد. شروع كنيد به چك ك

[soft-ice] ـــل بردارهـاي hookشـده (قبـالً روتيـن vecs-save را ديديـد كـه pooldemo را بداخ

بارگذاري مي كرد و بعـد از آن شـما مـي توانسـتيد از vecs-compare اسـتفاده كنيـد). و بعضـي

چيزهاي جالب را ببينيد.

ــد. INT-8 بطـور غـير مسـتقيم اين بيشتر شبيه آن چيزي است كه شما چيزي در مورد آن نمي داني

وقفه تايمر INT-1C را كنترل مي كند. كليپ ساعت 8253 ، يك وقفه سخت افـزاري IRQ-0 را در

محدوده 18.2 وقفه در ثانيه توليد مي كند كه باعث انتقال كنترل به ISR (يا روتين سرويس دهنــده

وقفه) كه در اينجا به INT-08 اشاره مي كند، مي شود و ... اين بايد در آدرس 0CD1:17AC باشــد

اما در اينجا بوسيله pooldemo.exe در 1EFD:84C6 گير افتاده.

يكي از كارهايي كه روتين وقفه مربوط به INT-08 داخل باياس انجام مي دهد آنست كه يك وقفـه

نرمافزاري براي INT-1C فراخواني مي شود كه درست در همين حال جلو پاسخگويي مــاژولـهاي

نرمافزاري داخل سيستم، گرفته مي شود. و چنانچه ممـانعتي بعمـل نيـايد، محتويـات پيـش فـرض

مربوطه به بردار وقفه 1C وقوع يك دستور نابجا در باياس سيستم را اعالم مي كنــد. بنـابراين هيـچ

كاري انجام نمي گيرد.

CPU مربـوط بـه INT-08 از ISR ــا هـر بطور نرمال يك محافظ بايد از INT-1C جلوگيري كند ت

محتويات بردار وقفه صحيح را از حافظه فراخواني كند (يا fetch) و يك شيوه فراخواني وقفه براي

ــر كه آن ادرس (كه بايد شامل دستور مربوطه در آدرس F000:9876 باشد ولي بجاي آن محتوي ه

چيزي كه فكرش را بكنيد شده است)ميباشد.

Page 12: آغازی برای کراکینگ

ــه hook ،08 شـده در حاليكـه يـك پس ـ شما گمان مي كنيد ـ طرح حفاظتي اينجا مستقيماً با وقف

طرح حفاظتي پيوسته و تشكيل در اينجا استفاده شده. خب حاال چكار كنيــم؟ بـه جـاي اينكـار بـه

توضيحات زير توجه كنيد:

وقفه تايمر سطح IRQ-0 كه به وسيله بيت صفرم رجيستر mask كنترل شده، و در آدرس

ــا I/O 0021h قرار دارد بايد غيرفعال شود. وقتيكه بيت صفرم رجيستر mask به 1، تنظيم شد (ي

ــه متأسـفانه نبـايد اينطـور set شد) هيچ كمكي به وقفهها براي تشخيص سطح IRQ نخواهد شد ك

ــه در ايـن حـالت شـما در باشد. اما اين تفكيك جالبي است كه بهتر است شما آن را ياد بگيريد، ك

جاي ديگر به آن نياز داريد.

(+ORC نوشته ،IRQ-0 masking ) حقهاي براي غيرفعال كردن تايمر...

اعالن سيستم را t$ (يعني نمايش زمان) تغيير دهيد وenter بزنيد، كمي بعد خواهيد ديد كه ساعت

ــا اسـتفاده از dos در طول اجراي اين حقه چطور عمل خواهد كرد. DEBUG.com را اجرا كنيد. ب

فرمان `a` اسمبل كنيد:

* Assemble using the command 'a'

- a

in al,21

or al,1

out 21,al

ret

RETURN

RETURN <- twice to exit immediate assembler

- g 100 <- to run the tiny program.

- q <- to quit debug.

Page 13: آغازی برای کراکینگ

ــي بعـد از زدن enter: هـورا! پيشـرفت سـاعت اعالن فرمان t$(نمايش زمان) هنوز فعال است، كم

متوقف شده!

ــت mask را توضيحات: شما محتويات رجيستر mask جاري را به داخل AL، بارگذاري كرديد، بي

ــادير بـرگشـتي بـه در محل بيت صفرم، تنظيم كرديد (كه مربوط به وقفه IRQ-0 بود) و باالخره مق

رجيستر mask را بروز رسانديد. وقتيكه شما آماده فعال كردن مجدد رخداد IRQ-0 هستيد دوبــاره

ديباگ را اجرا كنيد. و سپس ساعت متوقف شده DOS را با فرمان IME، مجددًا راهاندازي كنيد.

- a

in al,21

and al,fe

out 21,al

ret

RETURN twice

- g 100

- q

ــو در واقع با غيرفعال كردن كليك تايمر، برخي پروسهها، صحيح عمل نمي كنند. يكبار شما به دراي

ديسكت دسترسي پيدا مي كنيد، پس از آن موتور، اجاي برنامه را تا بينهايت ادامه خواهد داد و الــي

آخر.

ــا كـه شـما حـاال در حـال جسـتجوي آن متأسفانه تكنيك فوق نميتواند با [pooldemo.exe] ي م

EOI هستيد و فكر مي كنيد طرح حفاظتي را پنهان كرده، كار كند. در اين مورد، شما بايد بالفاصلــه

يعني انتهاي وقفه را از طريق OUT 20h,AL , MOV AL,20h را پيـدا كنيـد. هـر دوي كنـترل

كنندهها، داراي يك پورت دوم آدرس در 20( يـا 0a0h)مـي باشـند، كـه دسـتورات از آن گرفتـه

مي شود كه مهمترين آنها فرمان EOI(20h) ميباشد. اين دستور، انتهاي هندلر وقفه را تعييـن ميكنـد

و معادل كنترل كننده را براي وقفه بعدي، آزاد ميكند. اگر كسي يك هندلر وقفه بهينه شده بنويســيد

Page 14: آغازی برای کراکینگ

ــهاي هندلـر (همانطور كه برخي طرحهاي حفاظتي انجام مي دهند). اين امر، او را موفق به ديدن انت

فرمان EOI (20h) نوشته شده براي پورت 20h يا پورت 0a0h مي كند.

بعد از ادامــه EOI، پـوش (push) هـاي معمـول، سـپس برخـي call(فراخوانـي)هـا، بعـد از يـك

،out ميشود، كه به نظر ميرسد مشابه احياء تــايمر باشـد (دسـتور out 40, AL فراخوانياي منجر به

ــي دهـد). بـراي data را به يك پورت خروجي و پورتهاي 42-40 معادل شمارنده / تايمر، انتقال م

FAR ــوز از نـوع نگهداري، يك فراخواني دوبل، يك فراخواني شرطي و سپس يك فراخواني مرم

ــه فراخوانـي نـهايي را CS:[AA91] الزم است كه بستگي به بايت PTR[970C] خواهد داشت ك

تعيين خواهد كرد. پس روتين كليه رجيسترها را POP ميكند.

ــه dis assembling مـي كنيـد. بداخـل هريـك از فراخوانيهـا نظـر شما آهي ميكشيد و شروع ب

مهندسياي مياندازيد، (روش سريعتر در اين حالت، استفاده از breakpoint، در محل ورودي

مي باشد كه ببينيد كه آيا call ديگري از اين طرح حفاظتي محدود به زمان پيدا ميكنيد يا نه).

شما كار كرديد و كار كرديد و كار كرديد. و در مجموع هيچ چيزي پيدا نكرديد. حفاظت اين برنامه

اينجا نيست.

برگرديد به آناليز پرينت snapها، ما خيلي زود آن را به حال خود رها كرديم.

اگر با دقت بيشتري به مقايسه محلهاي محدوده DS:FFFF و DS:0 نگاه كنيد،متوجه خواهيــد شـد

كه يكي از آنها خيلي آهسته از 0 به 1 به 2 به 3 و ... تغيير مي كند. در حاليكه تغيير مكانهاي قبلــي

ــريع بـوده و سـيكل كـامل FF..0 را طـي ميكـرد، يـك شـمارنده در محـل DS:0009 و خيلي س

3C ،حاال اين چقدر طول ميكشد؟ خب ما در باال ديديم كه شــارژ كـردن در هـر ثانيـه ! DS:0004

ميباشد بنابراين در كلX3C*x78=X1C20 خواهد شد كه X78 ، معــادل ١٢٠ ثانيـه اسـت. يعنـي

محدوده زماني دو دقيقه.

Page 15: آغازی برای کراکینگ

حاال داخل كد بدنبال مقدار 1C20 بگرديد (زمان حفاظتها، اكثرًا در شروع بــخش CS:offset، قـرار

دارند) و شما به سرعت به آنچه در ذيل آمده خواهيد رسيد:

حفاظت در [pooldemo.exe]، در محل كد زير قرار دارد:

CS:0A8A 813E20A7201C CMP WORD PTR [A720], 1C20

compare location A720 with limit 1C20

CS:0A90 7C07 JL okay_play_a_little_more

CS:0A92 E834FD CALL beggar_off_time_is_up

BINGO!: FOUND!

Now let's quickly crack it:

حاال اجازه دهيد به ان سريعاً كراك كنيم:

CRACKING POOLDEMO.EXE (by +ORC, January 1996)

ren pooldemo.exe pooldemo.ded

symdeb pooldemo.ded

- s cs:0 Lffff 81 3E 20 A7 20 1C

xxxx:yyyy <- this is the answer of the debugger

- e xxxx:yyyy+5 4C <- this time limit is much better

- w

- q

ren pooldemo.ded pooldemo.exe

ــهتر) در اينجا ما يك كراك طوالني انجام دادهايم ولي در عوض خودمان را با يك محدوده زماني (ب

وفـق داديـم، آن را از 1C20 بـه 4C20 (٤ دقيقـه) بـه جـاي ٢ دقيقـه تغيـير داديـم. اگر دســـتور

JL(Jump lower) را به دستور JMP (پرش به هر طريــق) تغيـير مـي داديـم مـا بطـور وضـوح

توانستيم يك كراك ريشهاي انجام دهيم. در اين حالت براي گرفتن نتيجــه ايكـه در درس ٤ بيـان

Page 16: آغازی برای کراکینگ

ــاظتي محـدود بـه خواهد شد، شما الزم است يك نفوذ كامالً ظريف را در برخورد با يك طرح حف

زمان، انجام دهيد.

همانطور كه ديديد، طي اين نفوذ ساختگي، ما طرح حفاظتي را پس از كمي جستجوي مخفيانه در

ــا بـراي نفـوذ بـه يـك طـرح اطراف، پيدا كرديم. اما همانطور كه در درسهاي آينده خواهيد ديد، م

ــهاي حفاظتي، از روشهاي مختلفي ميتوانيم استفاده كنيم. بعنوان مثال، همين حفاظت را شما به روش

ديگري نيز ميتوانيد انجام دهيد: مثالً روي محــدودهاي از حافظـه بـراي برنامـه، يـك trace انجـام

ــا قـرار دادن يـك break point روي دهيد. البته بايد trace را به اولين قسمت آن محدود كنيد) . ب

ــن دسـتورهاي trace شـده 400-300 بيندازيـد. اگر هيـچ چـيزي را nag screen، گاهي به آخري

ــا اينكـه حفـاظت روي كدهـاي زيـر جابجا نكنيد، هرچيزي، يك الگوي تكراري خواهد داشت ت

snap شود:

...

JL 0A99

CMP BYTE PTR [A72A],01

...

JL 0A99

CMP BYTE PTR [A72A],01

...

for ages and ages and then...

...

JL 0A99

E834FD CALL 0759 <- BINGO! (CALL beggar_off_time_is_up)

ــن روش بـهترين اسـت ولـي متأسـفانه راههاي ديگري هم براي اينكار يافت ميشود (اما ظاهرًا، اي

nag هـاي شـما و فاصلـه بيـن حفـاظت وbreak ــدوده خيلي بيثبات است. چون بستگي به مح

Page 17: آغازی برای کراکینگ

ــي داشـتيم، screen دارد. بنابراين ممكن است بطريقي تكميل شود ولي اطميناني كه به روشهاي قبل

را در اينجا نخواهيم داشت.

ــيزتر از كـار بـا بردارهـا ميباشـد علت اينكه نزديكي به محل مورد نظر در كراك كردن موفقيت آم

ــاظت آنـها چنـدان آنست كه بيشتر برنامهها هيچوت به سختي حفاظت نشدهاند. بنابراين، يافتن حف

مشكل نخواهد بود. (و اينكه كراك كردن به آنها، براي مطالعه، واقعاً ارزشمند است).

ــي كاربردهـا، تعـداد زيـادي گاهي اوقات شما حتي نيازي به كراك كردن همه چيزها نداريد، برخ

ــورت يـك demo درآورده شـدهاند. فانكشن (يا تابع) دارند اما كامالً عجوالنه، براي انتشارشان بص

برنامههاي تجاري فقط پولشان مهم است و حتي برايشان اهميتي ندارد كــه مـا چكـار مـي كنيـم و

چندان مراقبتي براي اينكار ندارند. بهمين منظور مقدار ساير چيزهاي روي هــارد كـه ممكـن اسـت

ــدارد. يـك مثـال از ايـن كاربر آنها را از طريق ماژولهاي برنامه اصلي بهم بريزد، براي آنها اهميتي ن

ــه در تابسـتان ٩٥ بـه نوع، روش بهم ريخته مربوط به demoي [Panzer General] از SSI است ك

بازار آمد. كه آن در واقع تكميل شده نسخه بتاي بازي بود. شــما در واقـع بـايد يكـي از دو نسـخه

مجاز را از بين بيش از ٢٠ نسخه بتا، براي بازي مجاني، پيدا ميكرديد. ... شما حتي نيازي به كــراك

كردن هم نداشتيد.

ــاليز zen را از اول تـا مثال pooldemoي باال نبايد شما را از اصل كراك دلسرد كند. دقت كنيد و آن

ــه شـما آخر، قبل از اينكه مجبور به انجام روشهاي پيچيده شويد، انجام دهيد. بخاطر داشته باشيد ك

مي خواهيد به طرح حفاظتي بهر طريق ممكن نفوذ كنيد و نيازي به خط ســير برنامهنويسـي كـه آن

برنامه را نوشته نداريد. فقط از شما خواسته شده به اين برنامه نفوذ كني.

Page 18: آغازی برای کراکینگ

درس ٢

برنامه ها و ترفندهاي تجاري

وقتيكه وارد برنامهاي ميشويد، به كدهايي ميرسيد كه برايتان ناآشناست. همچنين واقع شــدن نقـاط

ــدان نامتعـارف نيسـت. فقـط در توقف در خارج از محدوده برنامهاي كه ميخواهيد كراك كنيد، چن

چنين مواردي بهتر است كمي حوصله به خرج دهيد.

ــن برنامـه بـه شـما مـيگويـد كـه يك از بهترين وسايل رفاهي، برنامه رونوشت از حافظه است. اي

ــهاي بارگذاري نرم افزار درايورز (Drivers) دستگاه و TSR در كدام قسمت صورت ميگيرد، برنام

را كه كراك ميكنيد در كدام قسمت حافظه ثبت ميشود و چه مقدار از حافظه خالي ميماند و نقطـه

بارگذاري برنامه بعدي چيست. برنامههايي كه استفاده ميكنيد، بايد پاسخگوي موارد ذيل باشد:

- محتويات بردارهاي وقفه

- وضعيت نواحي دادههاي BIOS، كه با آدرس ٤٠:٠ شروع ميشوند.

- ساختار داخلي در سيســتم DOS، مثـل زنجـيره MCB، زنجـيره SFT (جـدول فـايل سيسـتم) ،

زنجيره نرم افزار درايورز (Drivers) دستگاه نصــب شـده، PSPهـا و اختصـاص حافظـه كـامپيوتر

مربوط به TSR هاي نصب شده.

(Drivers) ــاصل از نـرم افزارهـاي درايـورز ـ آمار و ارقام مربوط به اختصاص حافظه كامپيوتر، ح

ــتجوي EMS، وقتيكه جستجو ميكنيد تا به مفهوم بخش مبوط به كد ناآشنا پي ببريد، بايد براي جس

Page 19: آغازی برای کراکینگ

ــه مفهوم واقعي كد، دقت خاصي داشته باشيد. همچنين، استفاده از پروفيلر (Profiler) بر آناليز برنام

ناآشنا ارجحيت دارد.

ــخهايي از اين با اين تضمين، به شما كمك خواهد كرد كه وقت خود را صرف مطالعه و بررسي بش

برنامه نكنيد كه نياز به برنامه محافظتي كه بدنبالش هستيد ندارند.

استفاده از وسايل رفاهي كه بتوان با آنها نمودار توالي دادهها و دستورالعملها براي فراخواني برنامــه

ــه شـما ارائـه را رسم كرد، پرسپكتيو مهمي در مورد چگونگي هدايت عمليات داخلي در دستگاه، ب

ميكند.

اشكال زداي (عيب ياب) شما: برنامه مورد عالقه شما

اولين و مهمترين نكته اينست كه، اشكال زداي شما بايد بدين منظور طراحي شده باشد كه با

مدولهاي مقيم قابل استفاده باشد (يا اينكه خودش يك مدول مقيم باشد).

كراك كردن با [debug.com] ، سادهترين و مطمئن ترين روش است.

ما فايل softice.exe بنــابراين تكنولـوژيـهاي NU-Mega را بـه شـما توصيـه ميكنيـم (مـدل ٦ .٢

[ S-Ice.exe] بوسيله MARQUIS DE SOIREE كراك شــده روي شـبكه web موجـود اسـت).

Borland`s Turbodebugger يـا [Codeview] يـا [Periscope] همچنين ميتوانيــد از برنامـههاي

ــه بـر استفاده كنيد... تمام اين برنامهها، با جرأت تمام كراك و يا توزيع شده و در حال حاضر آزادان

روي شبكه web وجود دارند...

چگونگي استفاده از YAHOO و يافتن آنها را ياد بگيريد. در موارد اضطراري، ميتوانيد با استفاده از

ــالً عنـوان شـد، اكـثر اوقـات، ايـن [debug] يا [Symdeb] ، سريعاً كراك كنيد، اما همانگونه كه قب

ــه نـهايي كـراك كـردن بـراي اشكالزداهاي قديمي كار نميكنند. با وجود اين، من هميشه در مرحل

Page 20: آغازی برای کراکینگ

ــا برنامـههااي كـراك [debug.com] به شما كمك كردهام، و به تمام استفاده كنندگان اجازه دادهام ت

كردن را انجام دهند.

وقتي، به يك برنامه حفاظتي پي ميبريد، فورًا شما را وسوســه ميكنـد تـا كـراك كـردن خـود را بـا

استفاده از انواع تكنيكهاي مهاجم آغاز كنيد. ضمن اينكه با استفاده از اين روش، دچار هيچ اشتباهي

نخواهيد شد، با برنامههاي محافظتي مورد استفاده نيز كامالً آشنا خواهيد شد و در صورتيكه با فكــر

ــهم گمشـده دسـت خواهيـد عمل نكنيد، بزودي دچار اشتباه خواهيد شد. اكثر مواقع، به جزئيات م

يافت. پس قبل از هر چيز كمي بنشينيد و فكر كنيد.. شيوه متفكرانهاي است، تنــها راهـي كـه واقعـاً

جواب ميدهد.

ــه خـاطر وقـت گيـر بودنـش، بلكـه بـه خـاطر اجراي عمليات تك مرحلهاي، گران است، نه تنها ب

جزئيات زيادي كه بايد با آنها دست و پنجه نرم كنيد. هدف اصلي شما، حركت به سمت برنامههاي

ــتن يـك محافظتي از طريق مجموعه وقفههاي اصالح شده متوالي است، هدف گستردهتر شما، داش

ديد كلي نسبت به اجراي برنامه است.

استفاده عاقالنه از نقاط توقف، اين جزييات را بصورت قابل فهمي درميآورد.

قدم اول اينست كه قسمتي از برنامه كه طرح حفاظت در آن اجرا ميشود را مشخص كنيم.

ــراي بدسـت آوردن زمانيكه بتوانيد اين بخش خاص از برنامه را جدا كنيد، ميتوانيد از نقاط توقف ب

logging window, backtrace ،شرح حال رديابي اجراي برنامه استفاده كنيد. اگر اشكال زداي شما

buffer يا مشخصاتي مثل اينها را نشان ميدهد، چگونگي استفاده از آن را، بهر طريقي ياد بگيريد.

ــااليت كـه با وجود اشكال زدا و در واقع بهترين سالحي كه در اختيار داريد، بايد بتوانيد تمام احتم

پيشنهاد ميكنيد و همچنين تمام تواناييهايي كه داراي آن است را بشناسيد.

داشتن يك خروجي نمايش اشكال زداي برگشت داده شده به پرينتر،يكي ديگر از احتماالت است.

Page 21: آغازی برای کراکینگ

استفاده از نقاط توقف به دو دليل, سودمند است. سرعت و كاهش جزييات.

ــت، امـا وقتيكه به برنامه هاي حفاظتي نزديك ميشويد، اجراي عمليات تك مرحلهاي ذي قيمت اس

حوصله شما را سر خواهد برد.

زمانيكه محلهاي (آدرسهاي) نقاط توقف برگزيده و انواع نقاط توقف مورد اســتفاده قـرار ميگيرنـد،

ــيد: برداشتن گام بعدي بسيار مهم است. يك ماريتني و ودكار سرد بنوشيد و سپس از خودتان بپرس

اين ميخواهد چه چيزي به من بگويد؟

ــيوه اسـت؟» مسـلماً شـما مهمتراز همه: «آيا شيوه فعلي كراكينگ من، ساده ترين و مستقيم ترين ش

نميخواهيد وقت گرانبهاي كراكينگ خود را تلف كنيد.

وقتيكه مجموعهاي از نقاط توقف را ابداع ميكنيد، بهتر است به اين مطلب دقت كنيد كه چگونه اثر

حتي يك خرده نان باقي ميماند. وقتيكه از ابتدا به شما اجازه ثبت اجرا به ترتيب زمان داده نميشود،

مفهوم آن اينست كه جلسه كراكينگ را بايد دوباره از سر بگيريد.

ــك تعيين نقاط توقف روي فراخوانيهاي مشخص وقفه نرم افزار،بهترين شيوه براي بدست آوردن ي

ديد كلي در مورد محافظتهاي برنامه است. وقفه سرويسهاي INT 21 DOS، احتمـاالً رايجـترين و

INT و (BIOS DISK سرويسهاي) INT 13 مثل BIOS سودمندترين وقفهها، نسبت به وقفههاي

16 (سرويسهاي صفحه كليد BIOS) براي كراكينگ خاص ميباشد.

ــيدن بـه وقتيكه با يك اشكال زدا كار ميكنيد، نقاط توقف ارزيابي شده، معموالً بهترين تير براي رس

ــاً اشـكال زدايـي داشـته هدفند. به منظور احتناب از پرداختن به فراخوانيهاي بيش از حد، بايد حتم

باشيد كه به شما بگويد كــه روي هـر فراخوانـي INT 21 توقـف كنيـد، بـه اسـتثناي ايـن مـوارد:

. “AH=OB يا AH=2C”

Page 22: آغازی برای کراکینگ

درك واقعي يك برناه، مسلماً موضوع بسيار مهمي است، اما افراط نكنيد! با يك مهندسي معكــوس،

ــم، وقـت زيـادي ميگيريـد. اگر نميتوانيـد شـيوه هـاي حتي آناليز و سندسازي يك برنامه كوچم ه

مناسب كراكيگ، توضيح داده شده دراين برنامه آموزشي كامپيوتر. را بكار ببريد (نگران نباشيد همــه

نميتوانند)، به خود آرامش داده و اطمينان حاصل كنيد كه صندليتان راحت اســت: حـال بـايد بـراي

مدت كمي منتظر بمانيد.

اكثر كارهايي كه به مهندسي معكوس نياز دارند، جستجوي Tentacleها را نيز شــامل ميشـوند. بـه

ــه در هـر يـك از فرآيندهـايي كـه منظور درك عمليات يك فرآيند ابتدا بايد چيزي را درك كنيد ك

ــي فراخواني در آن صورت ميگيرد ـ در واقع فرآيندهاي مربوط به ركورد داده كه با ركوردهاي اصل

ايجاد ميشــود (child)ـ رخ ميدهـد. بـراي درك، فرآيندهـاي محصـول (child)، بـايد فرآيندهـاي

محصوالتشان را مطالعه كنيد. و بدين ترتيب، درخت سلسله مراتب فراخواني را به سمت پايين طي

ــاس سلسـله مراتـب فراخوانـي كنيد. سپس در اينجا، دادهها وجود دارند. رديابي tentacleها بر اس

ــه بـا آن مواجـه ميشـويد، در اصـل ليسـتي از برنامه، يك پروسه هدايت شده است. هر فرآيندي ك

فرآيندهاي ديگري است كه بايد به آن برسيد. وقتي كه به مرحلــه آنـاليز روابـط متقـابل فراينـد بـا

ساختار دادههاي برنامه ميرسيد، چنين ليستي، ديگر برايتان فراهم نيست. از آن به بعد بـايد خودتـان

شم اين كار را داشته، آن را حس نموده و موفق شويد.

ــتر مـورد آناليز داده، مستلزم تحقيق و بررسي گستردهتري ميباشد. براي هر متغير حافظهاي كه بيش

توجه و عالقه شماست، بايد همه فرآيندهايي كه تعييــن ميكنـد چـه كسـي آن متغـير را بخوانـد و

ــن ديـس اسـمبلر بنويسد را مطالعه و بررسي نماييد. استفاده از نقاط توقف شرطي حافظه و همچني

(disassembler) كه جدول ارجاع را تشكيل ميدهد، باعث ميشودكه اين مهم، راحت تر انجام شود.

Page 23: آغازی برای کراکینگ

(از sourcer يا منبع استفاده كنيد! اين برنامه خوبي بوده و مدل ٠٨ . ٤ از [Sr.exe]، قبالً كراك شده

و روي شبكه وب [web] توزيع شده است.

تمام فراخوانيهاي سيستم در يك آدرس (محل)

ــته شـود به خاطر بسپاريد كه اگر برنامهاي را كه كراك ميكنيد، به زبان اسمبلر در اولين جايگاه نوش

ــت)، (البته با شناختي كه از كاهلي (تنبلي) برنامه نويسان امروزي داريم، احتمالش بسيار ضعيف اس

ــد. فراخوانيهاي سيستم، احتماالً، بطور مستقيم، حاصل از فرآيندهايي خواهد بود كه به آنها نياز داري

اما وقتيكه برنامهاي به زبان سطح باال نوشته ميشود، به احتمال زياد از تابعهاي كتابخانهاي مشـترك

براي بسياري از عملياتهايي كه به فراخواني سيستم نياز دارند، استفاده خواهيد كرد.

ــه وقتيكه برنامهاي، تمام فراخوانيهاي INT 21 حاصل را به يك آدرس منتقل ميكند، شما ميدانيد ك

چنين موردي، يقيناً همان استفاده مذكور است.

ــل برنامـه را بـه زبـان بسـيار حال، آنچه كه برخي اوقات اتفاق ميافتد اينست كه برنامه نويسان، ك

سطح بااليي مثل ++C مينويسند، اما پس از آن الزم است تا در قسمتهاي بحراني بـراي كدنويسـي

ــه شـما آن را بـه صـورت وصلـههاي به صورت برنامه اسمبلر سرعت عمل داشته باشند. بخشي ك

ــابراين شـما ميتوانيـد برنامـهاي بـا كـل ماهرانه اسمبلر مييابيد، دقيقاً يك برنامه محافظتي است! بن

فراخوانيهاي INT 21 در يك آدرس داشته باشيد، اما فقط براي يك يا دو فراخواني كــه مربـوط بـه

بخشي ميشوند كه آدمهاي ابله، استراتژي حفاظتي خود را در آن پنهان ميكنند.

تنها با «نگاه كردن» به كد مطلق يك برنامه، بايد بتوانيد، بگوييد كه چه بخشهايي بــه مرحلـه (فـاز)

بعدي اضافه ميشوند. آنها خودشــان را بـه صـورت بـي نظميـها و ناهماهنگيـهايي نشـان ميدهنـد،

ــها مخصوصاً اگر برنامه سودمندي استفاده كنيد كه كد برنامه را بصورت گرافيكي نشان دهد. حفاظت

غالباً در پايان برنامه ميآيند.

Page 24: آغازی برای کراکینگ

ــهاي كتابخانـهاي بايد مشخص كنيد كه فراخوانيهاي سيستم مربوط به كراكينگ شما، حاصل از تابع

مشترك هستند، فرآيند مشخصي كه از اين تابعهاي كتابخانهاي بوجود مــي آينـد، توابعـي كـه شـما

ــكال زداي خـود در بدنبال محل آن ميگرديد، در نقطه بين اين فراخوانيها، اجرا ميشود. بوسيله اش

پايان اولين فراخواني سيستم، توقف كنيد، جاييكه به نقطه فراخوانــي برميـگردد. از آنجـا، از طريـق

بقيه روتين كتابخانه مشترك، آن را رديابي كنيد تا اينكه به فراخواننده بازگردد. بديــن ترتيـب، شـما

بايد خودتان بدنبال فرآيندي باشيد كه الزم است آن را ببينيد، پــس بـايد بتوانيـد آن را بـه صـورت

آنچه كه هست تشخيص دهيد.

با توجه به شناخت كلي در مورد برنامهاي كه ميخواهيد كراك كنيد، استفاده از يك برنامه روبرداري

ــا رشـتههاي پيـام موجـود در مدولـهاي (رونوشت) شانزده شانزدهي بايد كامالً توضيح داده شود ت

دودويي برنامه، بررسي شـود. اگر بـارگذاري رشـته پيامـهاي برنامـه از روي فايلـهاي جـداگانـهاي

صورت گيرد، جستجوي شما بسيار ساده خواهد بود.

خصوصيت (ويژگي) رونوشت از حافظه اشكال زدا، برنامهاي است كه بــراي ايـن نـوع جسـتجو و

ــدهاي را بنويسـيد كـه بتوانـد فـايل بررسي بسيار مفيد است. شما همچنين ميتوانيد، برنامه فيلتر كنن

دودويي و خروجي كل تواليهاي بايتهايي را بخواند كه از كــاراكتري قـابل نمـايش تشـكيل شـده و

حداقل طول مشخصي دارند (بهترين برنامههاي كراكر غالباً آنهايي هستند كه خودتان مينويسيد).

ــايد وارد وقتيكه برنامه حفاظتي، از طريق صدور پيام خاصي روي صفحه، نشان داده ميشود، شما ب

برنامه شده و كدي را در آن محل قرار دهيد كه بتواند آن پيام را از برنامه خارج كند، و آنچه كـه آن

را دوباره راه اندازي ميكند مشخص نمايد. راه مناسب، جهت شروع پروسه تعيين محل اينست كــه

ببينيم آيا از فراخواني سيستم براي نشان دادن رشته (STING) استفاده ميشود.

Page 25: آغازی برای کراکینگ

ــام هـاي متـن بـر روي كنسـول از وقفه INT 10 ، INT 21 يا INT 29، معموالً براي نشان دادن پي

استفاده ميشود.

ــتم نباشـد، نوشـتن تصويـري مسـتقيم، مـورد وقتيكه، نمايش پيام، نتيجه يكي از فراخوانيهاي سيس

استفاده قرار ميگيرد. اگر محل مورد استفاده نمايش تصوير را بدانيد، و چنانچه آن بخش از حافظــه

تصويري براي چيز ديگري استفاده نشود، نقطه توقف نوشتن در حافظه، را ميتوان روي آدرس بـافر

ــاراكتر مطـابقت دارد. اگر ايـن روش،مفيـد واقـع نشـد، از تصويري قرار دارد كه با جايگاه اولين ك

تكنيك رديابي Step over/Step around استفاده كنيد، ضمن اينكــه منتظـر ظـاهر شـدن پيـام روي

صفحه نيز هستيد.

حاال آن را پيدا كردهايد: از روي ليست كدگذاري شده به زبان اســمبلر، محـل آدرس رشـته پيـام را

ــتجو بررسـي پيدا نموده و براي هر دستورالعملي كه مرجع آن همين آدرس است، بقيه فايل را جس

ميكنيد[Sourcer] ، ميتواند براي آدرسهاي مخصوص حافظه، برچسبهايي درست كنــد و همچنيـن

يك جدول ارجاع كه نشان ميدهد كه اين آدرسهاي برچسبگذاري شده. به كجا ارجاع داده ميشود.

ــه ويرايشـگر خـود، در غير اينصورت، فايل داراي ليست كدگذاري شده به زبان اسمبلر را در برنام

بارگذاري نموده و از تواناييهاي سرچ كردن آن بهره ببريد. جستجو يا سرچ كردن دستي براي يافتن

چنين چيزهايي در يك ليست، باعث ميشود تا بيشتر، عمر شماتلف شود.

Page 26: آغازی برای کراکینگ

كد و داده

وقتي به كدي به زبان سطح اسمبلر مراجعه ميكنيد، بدنبال فراخوانيهاي وقفهاي بگرديد كــه بعـد از

INT 3F ــا دادهها ميآيند. گاهي اوقات، فراخواني وقفهاي را خواهيد ديد كه دامنه آن از INT 34 ت

ميباشد. در چنين دامنهاي، بايتهايي كه بالفاصله پس از دستورالعمل وقفه ميآيند، به جــاي كدهـا،

دادهها خواهند بود.

ــان اسـمبلي اشـكار زدا كـه بالفاصلـه پـس از وقتيكه، خروجي دستورالعمل برنامه كدگذاري به زب

فراخواني وقفه ميآيد، هيچ مفهومي نداشته باشــد، ايـن نـوع تركيـب كـد ... و ... داده كمـي شـك

برانگيز است. گاهي ميتوانيد افســت دسـتورالعمل صحيـح بعـدي را از طريـق بررسـي كـد و داده

مشخص كنيد. در ساير موارد ديگر، بايد آن را از طريق فراخواني وقفه رديابي كنيــد تـا ببينيـد كـه

ــه ميآينـد چگونـه صـورت مـيگيـرد و دستيابي به دادههايي كه پس از دستورالعمل فراخواني وقف

آدرس بازگشت به استاك را چگونه دستكاري ميكند.

بردارهاي قالبدار

ديدن وقفههاي موجوددر سيستم، قبل از اجراي برنامهاي كه ميخواهيد كراك كنيد و همچنين كنترل

ــرنخهاي خوبـي ميتواتننـد بـراي شـما كنندههاي وقفهاي كه توسط برنامه مقصود ايجاد ميشوند، س

ــد، باشند. مثالً اگر برنامه حفاظتي، وقفه INT 09 را قبل از اجراي روتين صحت يا تأييد صفحه كلي

ايجادكند، از ميزان شك و شبهه شما تا حد زيادي خواهد كاست.

ــه روبـرداري (رونوشـت) براي مطالعه فعاليتهاي برداري وقفه يك دستورالعمل، برنامه سودمند نقش

برداري، بي فايده است. اين برنامه را ميتوان ضمن اجراي دستورالعملي كه ميخواهيد كــراك كنيـد،

اجرا كرد . يك راه حل اينست كه برنامه را تحت يك اشكال زدا اجرا نموده و منتظــر فراخوانيـهاي

سيستم براي فرآيندهاي 25h (تعيين بردار وقفه) و 35h (بدست آوردن بردار وقفه) INT 21 باشيد،

Page 27: آغازی برای کراکینگ

ــد تصويـر كـاملي بـه اما در موارديكه برنامه، بردارهاي وقفه را مستقيماً ميخواند و مينويسد، اين مت

“STEP” ــههاي جاسوسـي، رديـابي يـا برنامـه سـودمند شما ارائه نخواهد داد. معموالً بايد از برنام

استفاده كنيد.

ــل جـدول روش ديـگري بـراي استفاده از نقطه توقف در نوشتن حافظه با يك بردار خاص يا با ك

پرداختن به اين موضوع است.

دقت كنيد كه برخي از انواع نوشتن مستقيم برداري، در صورتي انجام ميشود كه تغيير برداري، بين

فراخوانيهاي سيستم، مشخص شود.

اگر تغيير برداري در طي فراخواني سيتسم، مشخص شده اما فرآيند 25h از INT 21 نيســت، شـك

داشته باشيد كه كنترل كننده IRQ روي اين تغيير، تأثير گذارد.

ترفندهاي جزيي تجارتي

تعيين آدرسهاي برداري وقفه ********

چگونه آدرسهاي برداري وقفه را تعيين ميكنيد؟ مثالً بياييد با هم آدرس بردار وقفه INT 21 را پيدا

كنيم. چون جدول بردار وقفه با آدرس 0000:0000 شروع ميشود (به خاطر سپردن آن كار سادهاي

است . اينطور نيست؟) و در هر بردار، ٤ بايت وجود دارد، پروسه اصلي، اينست كه عدد وقفه را

چهار مرتبه در خودش ضرب نموده و حاصل را در افست استفاده كنيم. (در قطعه صفر).

21h + 21h=42h 42h+42h=84h

آدرس بردار int 27 عبارتست از : 0000:0084

حال ميتوانيد از ماشين حساب استفاده كنيد، مثالً، آدرس:

0000:018c : پس آدرس بردار عبارت است از 63h*4=18ch: عبارتست از ،INT 63

تبديل آدرس *******

Page 28: آغازی برای کراکینگ

ــد كـه يـك بـايت حافظـه بـه آدرس پس از يك جلسه كراكينگ موشكافانه، سرانجام،تعين كرده اي

ــازيد، درمييـابيد كـه 6049:891c ،يك آغازگر است. اما وقتيكه، دستورالعمل نامناسب را جدا ميس

ــاي آدرس مـورد نظـر، آدرسي كه هنگام اجراي طرح محافظت ايجاد ميشود، متفاوت بوده و به ج

آدرس 6109:7D1C ميباشد. چگونه چنين چيزي ممكن است؟

ــود، از قطعـه اسـتفاده ميكنـد: 80X86 نوع CPU، وقتيكه بطور واقعي يا با مد VM86، اجرا ميش

ــد آدرس دهـي، اينسـت كـه يـك آدرس آدرس دهي از نوع افست، يكي از عوارض جانبي اين مت

فيزيكي معادل قطعههاي مختلف زيادي است: آدرسهاي افست.

به منظور يافتن آدرس فيزيكي براي قطعه مورد نظر: افست بصورت زير عمل ميكند:

...(X10) تبديل قسمت قطعه آدرس به عدد بر مبناي ١ .با ضرب كردن آن عدد در ١٦ -

- 6049 60490

- 6109 61090

پس كاري كه بايد حاال انجام دهيد اينست كه اين مقدار به مقدار افست اضافه كنيد:

60490+891C 68DAC 61090+7D1C 68DAC

متوجه شديد:

ــد قطعـه و راه ديگر، گرد كردن؟ اگر آدرس فيزيكي داشته باشيد: ميگوييد 19AC3، و بعد ميخواهي

را بدست آوريد : آدرس افســتي كـه بـايد اول از همـه تصميـم بگيريـد كـه آدرس كـدام قطعـه را

ميخواهيد ... اگر قطعه 16CC را انتخاب ميكنيد، بايد بصورت ذيل عمل كنيد:

١6CC 16CC0

19AC3- 16CC0=2E03(OFFSET)

16CC:2E03 : 16 مساويست باCC 19 در قطعهAC3 آدرس

Page 29: آغازی برای کراکینگ

برنامه تجاري

قبل از شروع اين بخش، خطاب به آنهايي كه اطالعات چنداني ندارند، بايد بگويــم، اينجـا روشـي

ــههايي كـه اجـرا ميكنيـد، متوجـه وجود دارد بنام ARCHIE،كه با استفاده از آن ميتوانيد تمام برنام

شويد.

1) (address) [email protected]

I use this french archie, but you can get a worldwide list using

the metacommand "servers"

2) (text) set search sub <- anywhere in string

set maxhits 140 <- (100-1000)

set maxhitspm 15 <- not just 1 file all over

find stepdos <- search e.g. this file

بمدت دو ساعت صبر كنيد، POST و FTP فايلي كه ميخواهيد را پيدا كنيد (و بله! هرچيز ديگري

ــگي اسـتفاده را هم ميتوانيد آزادانه روي وب پيدا كنيد). شما بايد به جاي استفاده از archie، چگون

از YAHOO را ياد بگيريد.

MEMSCAN.EXE

يكي از جذابترين برنامه هايي كه تاكنون ديده ام، برنامه بسيار قديمي MEMSCAN.EXE است.

اين برنامه، در اصل، در سال ١٩٨٨ توسط SCOTT A.MEBUST نوشـته شـد و در CGA اجـرا

شد.

اين برنامه، يك برنامه سودمند «تصويري» است و شما را قادر ميسازد تا Qmeg-1(يك مگابايت) از

حافظه كامپيوتر شخصي خود را بصورت chunkهاي ٨ كيلوبايتي ببينيد، اين برنامه به منظور تعييــن

Page 30: آغازی برای کراکینگ

ــد در ارتبـاط بـا مكـاني از حافظـه يـا محل سريع گرافيكهايي كه در آن هر سلول تصويري ميتوان

چيزهاي ديگري در حافظه، مثل جدولهاي داده برنامه، منطقه استاك، منطقــه كـد، RAM موجـود و

غيره قرار گيرد. برناه بسيار قدرتمندي است. من از اين ايده بزرگ براي نوشتن برنامه هاي خــودم

(C) استفاده ميكنم. «اسكنر برنامه هاي مطلق» و خود مدل پيشرفته Memscan. به ساختار تصويري

يك برنامه، توجه كنيد. اين ساختار هنگاميكه در سطوح باالتر كراك ميكنيد به شما، كمــك زيـادي

خواهد كرد.

[Trackmem.com]

برنامه خوبي است كه پايه گذار آن، James W. Birdsall ميباشد، نحوه كاربرد حافظه برنامه را

.[EMS, XMS, Conventional] .بيان ميكند

[Scancode. Com]

،THE .تهيه شده توسط كارفرماي كد حاصل از نرم افزار بسيار دقيق ،THE ليست كننده اسكن كد

برنامه سودمندي براي كراكرهايي است كه تمام اسكن كدها را ياد نميگيرند.

[MAP.EXE]

در واقع، ”MAP2“ باز نماينده حافظه حاصل از كارفرماهاي كد در نرم افزار دقيق مثل ساعت، ايــن

برنامه، برنامه خوب و جالبي است، شما ميتوانيد آن روي صفحــههاي Nigel nag پيـدا كنيـد .البتـه

ــردن پاك كردن آنها كار سادهاي است (با برنامه حفاظتي «حرف رمز» ،چگونگي پيدا كردن و پاك ك

آن از فايل [Map.exe] را در درس ٢ .٣ ياد خواهيد گرفت).

[FILEDUMP.COM][HEXDUMP;.COM][TDUMP.EXE][DUMP.EXE]

ــايل، يكـي از اوليـن برنامههاي سودمند زيادي درمورد رونوشت از فايل وجود دارد. روبرداري از ف

تمرينهايي است كــه در C-school بـه شـما ميآموزنـد. طـول Hexdum.com، ٥٥٨ بـايت اسـت،

Tdump.exe ١٢٠/٧٠٤ بايت، در صورتيكه ميتوانيد خودتــان برنامـهاي بـهتر از اينـها و طوالنيتـر،

هرطور كه دوست داريد بنويسيد.

Page 31: آغازی برای کراکینگ

ــت، فـوق الـعاده طول Filedump.com كه نويسنده آن Daniel M.O Brien است، ١٠٤٦ بايت اس

است.

Daniel اينها واقعاً برنامههاي خوبي براي كراك كردن هستند! برنامهاي كــه در سـال ١٩٨٩ توسـط

M.O Brien نوشته شد، يك تصوير «پس از واقعه» از حافظه كامپيوترتان ، به شما ارائه ميدهد. شما

ــل نمـوده و آن را بـه راحتـي بررسـي كنيـد. براحتـي بايد آن را با <myfile> به آدرس جديد منتق

ــه رامطالعـه كنيـد، نميتوان گفت كه براي كراكينگ، چند ساعت وقت، صرف ميكنم (شما بايد برنام

اندازه برنامه ٢٥٢ بايت است، و آن را كمي تغيير دهيد، اين برنامه، برنامه پيش پا افتاده و ساده و در

عين حال زيباست، مثالً در مدل اصلي، تغيير مسير به وسيله پرينتر، تنها در صورتي امكانپذير اســت

كه هيچ فضايي بين ”SPRAY“ و ”<“ وجود نداشته باشد.

[VEXE.EXE]

تحليلگر بسيار خوب براي فايلهاي EXE(اجرايي) كه براي برنامههاي ويندوز هم مفيد است.

(به درس ٧ مراجعه كنيد). برخي از اين فرآيندها در فايل TDUMP.EXE نيز مشاهده ميشوند.

اين برنامه در سال ١٩٩١ توسط S.krupta نوشته شد، گاهي اين برنامه بسيار سودمند است.

[SNOOP UTILITIES --> KGB.EXE INTMON.EXE INTRSPY.EXE etc...]

[TRACE UTILITIES --> TRACE.EXE STEPDOS.EXE etc...]

سلسله مراتب فراخواني، يك برنامه ناشناخته، حتماً بايد مورد مطالعه و بررسي قرار گيرد.

ــهها Petr Hor..K در سال ١٩٩٢ نوشته شد، يكي از بهترين برنام KGB.EXE برنامهاي كه توسط

ــاد خواهـم داد كـه چگونـه بـدون هريـك از ايـن بوده و همراه باكد منبع ميآيد. البته من به شما ي

برنامهها كراك كنيد، اما با اين وجود، در برخي مواقع ميتوانند برنامههاي بسيار سودمندي باشند.

برنامه Stepdos.exe. نوشته mike parker برنامه فوق العادهاي است : كراك كردن با استفاده از اين

برنامه در موارد تا حدودي متفاوت، بسيار لذت بخش است (=:

[Sourcering utilities]

Page 32: آغازی برای کراکینگ

ـــه نســبتًاخوب SR.exe بـراي برنامـههاي نامشـخص و ناشـناخته Sourcering اسـت. ايـن برنام

ــده بـا ”كـد عـدد Sourcering ميباشد. مدل 4.08 آن كراك شده است (اين يك برنامه حفاظت ش

ــد آن را پيـدا كنيـد. البتـه شـما اصلي“ ميباشد) و بر روي وب توزيع شده ،بنابراين براحتي ميتواني

ــامپيوتر بـوده و بـه يـك راه هرگز نبايد از يك چنين روش رياضي كه متكي بر استفاده ناشيانه از ك

ــاد خواهـم حل ناموزون مسئله رياضي ميانجامد، استفاده كنيد، مگر از روي ناچاري: البته به شما ي

داد كه چگونه بدون Sourcering، كراك كنيد.

[Hexeditors]

ــد كـه ايـن برنامـه، برنامـه خوبـي هر آدم ابلهي، حداقل يك hexeditor نوشته است، و شما ميداني

ــت). نيست (كلكسيون simtel، روي web، فهرست حداقل ٣٥ تا hexeditor for را تهيه نموده اس

به شما پيشنهاد ميكنم تا خودتان برنامه نويسي نموده و به سيستم كمك كنيد يا از برنامه بهتري مثل

parity) نوشته شد Gouy C.crider استفاده كنيد، برنامه اي كه در سال ١٩٩٠، توسط psedit. Exe

solutions كـه در سـال ١٩٠٣ توسـط Pavia Ct. Arlington نوشـته شـد، TX 76006 ... حتــي

ــار را آمريكاييها هم گاهي برنامه هاي خوبي مينويسند). اگر از اين برنامه استفاده كنيد (كه بايد اينك

بكنيد)، در كراك كردن، بعنوان يك تمرين كوچك روي صفحه، نشان داده ميشود.

[Debugger]

بهترين دوست در كراكينگ، بهترين سالح، و بهترين پناهگاه...

من [Softice.exe] از تكنولوژيهاي Nu-Mega (مدل ٦ .٢ آن به وسيله Marquis de soiree كــراك

شده و روي شبكه وب موجود است). را به شما پيشنهاد ميكنم.

همچنين بايد از [periscope] يا [codeview] يا Turbodebugger بورلند (Borland) استفاده كنيد.

.. تمام اين برنامهها بخوبي كراك و توزيع شده اند و هم اكنــون روي شـبكه وب موجودنـد. بـراي

ــتفاده از Archie و YAHOO را يـاد بگيريـد. اشـكال زداي پيدا كردن اين برنامه ها ، چگونگي اس

Page 33: آغازی برای کراکینگ

شما، تنها برنامهاي است كه، به عقيده من، واقعاً به آن نياز داريد، پس سالح خود را انتخاب كنيـد و

ــف روي روتينـهاي مربـوط بـه خصوصيـات چگونگي استفاده از دامنههاي backtrace و نقطه توق

نوشته شده استفاده كننده را ياد بگيريد. اكنون ميتوانيد بدون اســتفاده از ايـن ويـژگيـها، تقريبـاً هـر

چيزي را، درست كراك كنيد.

ــه بـراي آن موضـوع شما تمام برنامه هاي ذكر شده را ميتوانيد روي وب بيابيد (تمام برنامه هايي ك

وجود دارند). از آنها استفاده كنيد. ضمناً آنها را با بي مالحظگي اصالح كنيد!.

ــه هـايي به خاطر داشته باشيد كه شما يك كراكر هستيد (و بايد يك كراكر باقي بمانيد). اولين برنام

كه كراك نموده و آن را اصالح ميكند، برنامه هاي واقعي شما هستند!

ــهترين روتيـن هـا را بـه چنـگ آورده و بنابراين كد بهترين برنامه هايي كه پيدا ميكنيد را بدزديد! ب

ــردن يكـي براي بهتر شدن. آنها را تغيير دهيد! اينها نكات مهم در كراكينگ هستند: مأموريت بهتر ك

از بهترين دستاوردهاي نبوغ بشر،

cracking–Zen چگونه كراك كنيم

در درس بعدي، ياد خواهيد گرفت كه چگونه برنامــههاي حفـاظتي مختلـف را بطـور سيسـتماتيك

كراك كنيد. حفاظتهاي كاغذ و كلمه رمز.حفاظتهاي زمان، حفاظتهاي دستيابي.

در پايان بخش، «متدولوژيكــي»، خواهيـد توانسـت، برنامـهها را از حـالت حفـاظتي درآوريـد، امـا

Zen- همچنان يك كراكر باشيد. به منظور كراك كردن در سطوح باالتر، بايد از چيزي كه مــن آن را

cracking مينامم استفاده كنيد. حال، براي روشن تر شدن مطلب، مثال سادهاي برايتان ميآورم ، امــا

قبل از بكار بردن اين تكنيكها، پس از به اتمام رساندن اين دوره آموزشي، كراك كــردن «عـادي» را

ــه رمـز انجـام دهيـم. خواهيد آموخت. حاال ميخواهيم Zen-cracke را همراه با برنامه حفاظتي كلم

ــه را بـه منظـور پاسـخگويي داشـته باشـيد). ايـن («حفاظت كاغذ»، الزم است تا كاتالو اصلي برنام

Page 34: آغازی برای کراکینگ

حفاظت، بر اساس تايپ كردن توالي صحيح اعداد و ارقام ميباشد. مثــال مـورد نظـر، همـان بـازي

ــاظتي را ميتوانيـد در رويـه است كه بنابر داليلي در درس يك توضيح داده شد، اما همان برنامه حف

حفاظت دستيابي به برخي از شبكه هاي قديمي Tapestry مشاهده كنيد.

Indianapolis 500, papyrus software & Electronic Arts, 1989

اين برنامه متداولي است، بنابراين ميتوانيد براحتي آن را پيدا كنيد. صفحه nag، در مورد دادههايي بر

اساس انجام مسابقات تاريخي ماشين سواري، سؤال ميكند..

اين يعني، پاسخها شامل ٢ يا ٣ شماره خواهند بود.

ــن برنامـه اي (كـه در درس ١ . ٣ توضيـح داده شـد) را حال، روش معمولي براي كراك كردن چني

بصورت مراحل ذيل بيان ميكنيم:

تعيين نواحي از حافظه كه برنامه در آن ذخيره ميشود و قبل از آنكه پاسخ خود را تايپ كنيد.

مقايسه پس از تايپ كردن ”666“

سرچ كردن توالي 36,36.36 (يعني 666).

نقطه توقف روي دامنه حافظه براي خواندن

نگاه كردن به مكان يابي تعدادي از داده هاي برنامه

(snap) يافتن شيوه هاي قفلي يا فنري

از كار انداختن آن

ــري اسـت. امـا كراك كردن به روش مذكور، روش نسبتاً سريعي بوده و اكثر اوقات شيوه نسبتاً موث

ــاي حفـاظتي سـطح روش بهتري هم وجود دارد: روش Zen، تنها روشي كه ميتوانيد با آن برنامه ه

باال را كراك كنيد.

برنامه را اجرا كنيد و وارد nag screen كنيد.

Page 35: آغازی برای کراکینگ

پاسخ ٢ الي ٣ شماره هست؟ ”AC“ (يعني، دستورالعمل LODSB، رقم بارگذاري پاسخ در AL) را

در ناحيه ٥٠٠ بايتي قبل و ٥٠٠ بايتي بعد از مكان خــود را سـرچ كنيـد. برخـي از آدرسـها را پيـدا

خواهيد كرد. (در مورد INDY 500 ، ٦ تا از اين آدرسها را پيدا خواهيد كرد).

آدرسها را جستجو كنيد (اين بخش مشكل است).

بسيار خوب، اكنون آن را بنويسيد ! در اين قسمت استراتژي حفاظت را مي آوريم:

8BBF28A5 MOV DI,[BX+A528]<-- DI points to coded data area

:compare_loop

AC LODSB <-- load first digit of answer in AL

B4FF MOV AH,FF <-- load mask in AH

2A25 SUB AH,[DI] <-- sub coded data from mask and get

real answer

47 INC DI <-- ready to get next coded data

3AC4 CMP AL,AH <-- user answer = real answer ?

751A JNZ beggar_off_coz_false_answer

0AC0 OR AL,AL <-- more numbers?

75F2 JNZ compare_loop

59 POP CX <-- all OK, go on, nice guy

...

و آيا برنامه حفاظتي، دور از دسترس است ؟ و آيا نميتوانيد برنامه درستي را سرچ كنيد؟

و آيا بايد مادربزرگم، با چرخ دستي دنبال آن بگردد؟ به عقيده من، آن را ياد خواهيد گرفت.

بياييد، به سرعت، اين برنامه پيش پا افتاده را كراك كنيم.

ren indy.exe indy.ded

symdeb indy.ded

- s (cs+0000):0 Lffff B4 FF 2A 25 47 3A C4 75 1A

xxxx:yyyy <-- this is the answer of the debugger

- s (cs+1000):0 Lffff B4 FF 2A 25 47 3A C4 75 1A

(nothing, but you must be sure there isn't a mirror)

- e xxxx:yyyy+8 00 <-- "JNZ 1A ahead" changes to "JNZ 0"

- w

- q

ren indy.ded indy.exe

Page 36: آغازی برای کراکینگ

كراك شده : فقط بايد دستورالعمل JNZ beggar off را بـه يـك JNZ ديـگر تغيـير داده و از سـر

بگيريد. عاليست، اينطور نيست؟

چرا كراك ميكنيم؟

عجيب است، داليل موجود براي كراك كردن، به خاطر موفقيت در كارمان بسيار مهمند. ما (حداقل

ما كراكرهاي قديمي) بر ضد جامعه كراك كرده و مخالف قوانين و مقررات عمل ميكنيم.

ــي گران ما به خاطر پول و يا ساير داليل تجارتي كراك نميكنيم. (فقط گاهي اوقات، قيمتهاي ما كم

ــتند، البتـه چنانچـه بـه هستند: در حال حاضر،سرمايه زيادي دارم و سرويسهاي من خيلي گران هس

ــدان ارزشـي درآوردن برنامه از حالت حفاظت مورد نظر نياز داريد). اما بطور كلي، پول براي ما چن

ــگان در اختيـار شـما قـرار ندارد، و همانگونه كه مالحظه ميكنيد من اين دوره آموزشي را بطور راي

دادهام. برنامه هايي كه كراك ميكنيم، بايد در اختيار همه قرار گيرد.

ــا نـه ميتوانيـم حتي اگر، براي درآوردن برنامه از حالت حفاظت، وقت زيادي صرف كرده باشيم . م

ــاً خـوب را نسبت به ارزش پولي آن بي تفاوت باشيم و نه ميتوانيم كار مقدس برنامه نويسان اخالق

نام ببريم.

ما خودمان برنامه نويسي ميكنيم. فقط به خاطر اينكه ايكار را دوست داريم...

اگر كسي صرفاً به خاطر پول كاري را انجام دهد، استحقاق هيچ چيزي را ندارد.

ــه نحـو اين يك چالش ذهني به حساب ميايد، منفعت هرگز! (حتي اگر از برنامه هاي كراك شده ب

شايستهاي استفاده كنيد و حتي اگر همانگونه كه قبالً عنوان كردم منافع شخصي در آن باشد).

ــادر اسـت بـه سـمت اطالعـات اين يك طرز فكر اجتناب ناپذير است! تنها يك فكر غير تجاري،ق

ــه ”Setori“ حركت كند كه جدًا به آن نياز داريد،البته در صورتيكه بخواهيد با سرعت و دقت هرچ

ــا در تمامتر، برنامه هاي غول آسايي را كراك كنيد كه كس ديگري آن را نوشته و محافظت نموده، ي

Page 37: آغازی برای کراکینگ

صورتيكه بخواهيد تا به اطالعات و داده هاي مخفيانه اي دست يابيد كه دوست داريد به آنها سرك

بكشيد اما بعضي افراد، يك سري چيزهايي را قدغن اعالم ميكنند، اما دولت كوته فكــر، يـا بخـش

ــم گيـري صنعتي بي حاصل، يا برنامه نويسان پول دوست، يا گروه ذي نفوذ شركتها روي آن تصمي

ميكنند.

ــا بـه اجبـار در آن زنـدگي ميكنيـم، را قبـول داريـد، بـا روش زنـدگي كـامالً اگر جامعه اي كه م

خودخواهانه و منافع پليد آن، عاقبت، ياد ميگيريد كه چگونه برخــي از حافظتـهاي سـاده را از كـار

ــد كـه از پـول، بيندازيد، اما هرگز قادر نخواهيد بود تا به روش صحيحي كراك كنيد. بايد ياد بگيري

ــام چيزهـاي احمقانـه، و دولتها، تلويزيونها، گرايشها، نظر دهندگان، افكار عمومي، روزنامه ها و تم

ــد، افكار ابلهانه متنفر باشيد اگر بخواهيد اين هنر (فن) شريف را بدست آوريد، براي محرز بودن ك

ــهتر و دقيقـتر بايد از سنتهاي پيش پا افتاده و بي اهميت دوري گزينيد، عجيب به نظر ميرسد، پس ب

به اطراف خود بنگريد. براي متنفر شدن از جامعه و عمل كردن بر خالف آن،داليل بيشــماري پيـدا

ــن خواهيد كرد، و جرقه هاي زيادي براي شعله كشيدن برنامه ها به روش صحيح.. اميداورم كه چني

چيزهايي، حتمي نباشد.

Page 38: آغازی برای کراکینگ

درس ٣

چگونگي كراك كردن( خودآموز)

(١) (Protection) حفاظت

برخي مشكالت با وقفههاي اينتل:

دستور INT (يا وقفه) منشاء قسمت اعظم سازگاري در معمــاري PC ميباشـد. چـون توانـايي گرفتـن و

تنظيم بردار وقفه (interrupt vector) به اين مفهوم است كه سرويسهاي سيســتم، تـا حـد زيادي قـابل

تعميم، قابل جايگزيني و تحريك كننده ميباشند.

اما دستور INT (يا وقفه) هنوز با دو مورد زير سازگاري ندارد:

ــهHANDLER)، شـماره وقفـهاي كـه بـه او روي آورده - يك برنامه كنترل كننده وقفه( دستگيره وقف

نميداند.

ــد بـراي صـدا زدن - دستور INT خودش منتظر يك اپراند (OPERAND) ميباشد، يعني شما نميتواني

ــدا ٢١ را در رجيسـتر يـا ثبـاتA X بريزيـد (mov ax, x21) و سـپس وقفـه ٢١ را صـدا وقفه ٢١ ابت

(INT x21) :بزنيد,شما بايد بنويسيد

Page 39: آغازی برای کراکینگ

كراك كردن واقعاً براي ما خيلي خوبست... اما متأسفانه كمپايلر بسياري از زبانهاي سطح بــاال،بـه جـاي

ــايل ميكنـد. روش ديـگر، پـوش انجام يك وقفه واقعي، آنها را با دستورات FAR CALL, PUSHF كمپ

كردن آدرس هندلر (handler) به داخل استك (stack) و سپس انجام RETF روي آن ميباشد.

برخي طرحهاي حفاظتي منجر به فراخوانيهاي متفاوتي از وقفهها ميشود:

١) camuflag كردن كد

٢) قرار گرفتن در وضعيتي كه دستور وقفه آنها را تغيير دهد. ٣) تكرار روتين وقفه داخل كد. اينها كامالً

شبيه طرح حفاظتي دسترسي به ديسك ميباشد كه از وقفه 13(INT 13) يـا همـان وقفـه مربـوط بـه

ديسك استفاده ميكرد كه در درس ٥ بيان شد.

يك اسمبلر پايه

ــين براي فهم طرحهاي حفاظتي و غلبه بر آنها، شما الزم است اطالعاتي در مورد اسمبلر و كد زبان ماش

يادبگيريد. فراگيري آن خوب و رايگان است. مثل ويروســها كـه حقـههايي سـخت و غـير قـابل نفـوذ از

ــثر ويروسـها را روي اينـترنت پيـدا كنيـد. اينـهم از كدهاي اسمبلر ميباشند. شما ميتوانيد كد منبع اك

شانس همه كساني است كه ميخواهند هكر شوند.

ميليونها سطر از اين كدها روي اينترنت وجود دارد كه بايد مثل ماهي آنها را صيد كنيد و مطالعه كنيـد.

همانطور كه همه شما ميدانيد بهتر است كه كــراك(crack) كنيـد. مـن بـا بيـان ايـن مطـالب در ايـن

خودآموز، سر خودم كاله ميگذارم. حال اجازه دهيد شروع كنيم:

Strings يا رشتهها

ــاظت كلمـه عبـور دستوراتي كه با رشتهها كار ميكنند خيلي قوي هستند. (و كاربرد زيادي در طرح حف

دارند) همه آنها داراي ويژگيهاي زير ميباشند:

Page 40: آغازی برای کراکینگ

١)منبـع data در DS:SI قـرار ميگيـرد. ٢) مقصـد data در es:di قـرار ميگيـرد. ٣) و رجيسـترها (يـــا

ــرار ثباتهاي) DI و SI براي OR يا and باهم جمع يا از هم كم ميشوند. بنابراين، اين عمليات ميتواند تك

شود.

Jumps يا پرسشها

JZ ero : كه گفته ميشود پرسش كن اگر صفر است.

JNZ ero: همانطور كه گفته ميشود پرسش كن اگر صفر نيست.

JG reater: به معني اگر تفاوت SIGNED مثبت است .

JA bove: به معني اگر تفاوت unsigned مثبت است.

JL ess: به معني اگر تفاوت SIGNED منفي است.

JB elow: به معني اگر تفاوت UNSIGNED منفي است.

JC arrey: مثل JB اسمبل ميشود.

كراك(نفوذ) كردن به برنامههايي كه با كلمه رمز حفاظت شده

ــاري، بـراي به درس يك مراجعه كنيد تا متوجه شويد كه چرا ما از بازيها بعنوان برنامههاي كاربردي تج

آموزش استفاده ميكنيم. چون آنها هم از همان روشهاي حفاظتي(يا BBS و server) استفاده ميكننــد.

هرچند كه نفوذ كردن به داخل برنامههاي كوچك، خيلي زمان نمي برد. يك برنامه كــامل،بـايد از كپـي

ــا گرفتـه شـود تـا حـد كردن محفاظت شود ولي در مورد يك برنامه بزرگ همين كه جلو كپي كردن م

زيادي براي تحريك كردن ما كافي است.

ــود و از كـاربر كلمـهاي را معموالً در شروع يك برنامه، يك صفحه آزار دهنده يا nag screen ظاهر يمش

ــه راهنمـا پيـدا كنـد،و چيزهـايي شـبيه ايـن ميخواهد كه او ميتواند آن را در هر جايي از داخل دفترچ

ميبيند : «لطفاً اولين حرف سطر سوم از قسمت 3.3.2 را تايپ كنيد» . در اغلـب مـوارد بـه منظـور

Page 41: آغازی برای کراکینگ

ــه عبـور را تعييـن ميكنـد و كـاربر بـايد تنـها حـروف جلوگيري از اشتباه كاربر، برنامه اولين حرف كلم

باقيمانده را پر كند.

برخي مثالها، از برخي كراكها ( cracks نفوذها) :

UMS (Universal Military Simulator) version 1

by Dr Ezra SIDRAN

(c) 1987 Intergalactic Development

European Union: Rainbird Software

United States: Firebird Software

برنامههاي EGA قديمي، يكي از اولين برنامههايي هستند كه من در جواني به داخــل آنـها نفـوذ كـردم

ــار مـيگيرنـد. تـا امـروزه (كراك كردم) آنها خيلي جالب هستند و طرحهاي حفاظتي بنيادياي را به ك

(ژوئن ١٩٩٦) بيش از ٨٠ درصد طرحهاي حفاظتي، همانهايي هستند كه در گذشته استفاده ميشدند.

ــان ظـاهر ميشـود و منتظـر جـواب شـما يك nag screen (يا صفحه آزار دهنده) در ابتداي برنامه ناگه

ــد. كـه در طرحـهاي حفـاظتي ميماند و فقط ctrl+C ميتواند شما را نجات دهد و دوباره به dos برگردان

قديمي از آن استفاده ميشده. در طرحهاي جديدتر، در برخي موارد تا سه بار يــا فقـط يكبـار بـه شـما

ــچ اجازه ميدهد كه امتحان كنيد و اگر موفق نشديد، شما را به سيستم عامل برميگرداند . در UMS، هي

راهنمايي به شما نميشود و حتي حرف اول كلمه عبور نمايش داده نميشود.

ــراي پروسيجر Cracking براي برنامههايي كه با كلمه رمز حفاظت ميشوند، در رأس همه قرار دارد كه ب

پيدا كردن محل حروف ذخيره شده، بكار ميرود. بنابراين شما بايد حافظه را جستجو كنيد و جايي را كه

Page 42: آغازی برای کراکینگ

ــن ناحيـه از حافظـه و انجـام يكسـري برنامهها در حافظه جايگزين ميشوند پيدا كنيد. با ذخيرهسازي اي

عمليات مقايسه، شما ميتوانيد كلمه عبور تايپ شده را پيدا كنيد.

ــي جاييكـه در حالت UMS، همانطور كه كلمه را تايپ ميكند، آن كلمه در محلهاي مختلف حافظه، يعن

برنامه قرار گرفته، مستقر ميشود. ميتواند براي پيدا كردن آن بردارهاي hook شده را جستجو كنيد.

VECS 00,02,22 شده hook در محل مورد نياز

VECS 34-3D شده XXXX در

VECS 3E شده hook, XXXX:C CAدر

حاال اجازه بدهيد بدنبال كلمهاي بگرديم كه در nag screen يا همان پنجرهايكــه در آغـاز برنامـه ظـاهر

ميشود، وارد شده در UMS در آدرس 3E+7656 خواهد بود و محتويــات آن پنجـره، بالفاصلـه وارد آن

ــن يـك روش قديمـي ميشود. و شما ميتوانيد با كنار هم قرار دادن آنها، كلمه رمز را پيدا كنيد. البته اي

است و ما حاال ساير روشهاي پيشرفتهتر در ديگر برنامهها را برايتان خواهيم گفت . اجــازه دهيـد كمـي

ريشهايتر بموضوع نگاه كنيم و ساير روشهاي كراك(نفوذ crack) كردن را باهم مقايسه كنيم.

برنامههاي حفاظت شده با كلمه رمز (و همچنين روتينهاي دسترسي به آنها براي سرويس دهنده

ــه وقتـي شـما يـك كراكـر (server و BBS) نقاط سست و بي اساس زيادي دارند. مشهورترين آنها (ك

ــور (cracker)سطح باال شديد, آن را متوجه خواهيد شد) به اين صورت كار ميكند كه شما بايد كلمه عب

ــاس كاربر را با اصل آن مقايسه كنيد. پس نيازي به دزديدن نخواهيد داشت. فقط كافي است ناحيه انعك

ــدا كنيـد. و درسـتترين محـل را بـراي نفـوذ كـردن بوسـيله آن در محلهاي حافظه را براي مقايسه پي

مكانيسمهاي مقايسه پيدا كنيد حتي اگر كلمه رمز را اشتباه حدس بزنيد.

مكانيسمهاي مقايسه در UMS ميتواند مجموعــهاي از (نقـاط نفـوذ) break point روي محـدودهاي از

حافظه باشد كه سه نقطهايكه كلمه رمز در آن ذخيره ميشود را تحت پوشش قرار ميدهــد (و شـما آن را

از طريق جستجو مقايسه پيدا خواهيد كرد.

Page 43: آغازی برای کراکینگ

ES: 0F8E در اينجا شما يك كپي از كلمه رمزي كه مورد نظر برنامه ميباشد پيدا ميكنيد.

ES: 0F5C در اينجا شما يك كپي از كلمه رمزي كه كاربر تايپ كرده پيدا ميكنيد.

INT-3E-hook-address+7656 :در اينجا كليه كلمات رمز ممكن تعريف شده را پيدا ميكنيد.

حال ببينيم طرح حفاظتي چطور عمل ميكند:

MOV CX, FFFF :ميريزيم cx بزرگترين مقدار ممكن را در رجيستر

REPNZ CASBS كلمه رمز كاربررا جستجو ميكنيم: scan ED: DI

NOT CX محتوي تعداد كاراكترهايي كه كاربر تايپ كرده ميباشد CX حاال

MOV DI, SI ميريزيم DI افست كلمه رمز واقعي را در

LDS SI, [BP+0A] ميريزيم SI افست كلمه رمز كاربر را در

REPZ CMPSB (توضيح در پايين)

DS: SI را با ES:DI (يعني كلمه رمز واقعي با آنچه كه كاربر تايپ كرده) مقايسه ميشــود، پـس از آن

CX=0 يا هر كاراكتري ديگري، ميشود. يا اولين حرفي كه بعدًا بيايد. روي سطح پايه بمانيم ... شــما بـه

كدي كه در ادامه براي جستجوي CMPSB آمده نگاهي بيندازيد. اين همان حالتي است كــه در قديـم

ــالف را پيـدا ميكنـد يـا اكثرًا استفاده ميشد. بخاطر داشته باشيد كه CMPSB اولين كاراكتر مورد اخت

اينكه بر اساس تعداد كاراكترهاي كاربر، نتيجه گيري ميكند.

MOV AL, [SI-01] .بارگذاري ميشود AL كاراكترهاي كلمه عبور كاربر در

  SUB AL, ES :[DI-01] .كم ميشود AL كاراكترهاي كلمه عبور واقعي از

CBM مربوط به صفر شدن نتيجه، چك ميشـود Flag

اگر حاصل True يعني كاراكترها باهم cbw مطابق بودهاند و كاربر كلمه عبور را صحيح تايپ كرده.

خب حاال اجازه دهيد به JZ بعدي نگاه بيندازيم (آن كد ٧٤ است)

CS; IP 740 D JZ موقعيت نامناسب

Page 44: آغازی برای کراکینگ

صبر كنيد، كمي ادامه ميدهيم يك چك ديگر ميكنيم (در اغلب موارد شما دوبار DI را چك كنيد).

CS: ID 7590 JZN

كراك كردن خيلي آسان است. فقط الزم است ٧٥ را به ٧٤ تغيير دهيد و ٧٤ را به ٧٥.

همچنين JZ را به JNZ و بالعكس تبديل كنيد. حاال شما موفق خواهيد شد و در مورد آنچــه نوشـتهايد

مشكلي نداريد. مگر اينكه شما واقعاً كلمه عبور را حدس زده باشيد.

حاال اجازه دهيد به سرعت كراك كنيم

------------------------------------------------

CRACKING UMS.EXE (by +ORC, January 1996)

ren ums.exe ums.ded

symdeb ums.ded

- s (cs+0000):0 Lffff 74 0D 1E B8 C2 3F

(nothing)

- s (cs+1000):0 Lffff 74 0D 1E B8 C2 3F

(nothing)

- s (cs+2000):0 lffff 74 0D 1E B8 C2 3F

xxxx:yyyy (this is the answer of the debugger)

- e xxxx:yyyy 75

- e xxxx:yyyy+17 74

- w

- q

ren ums.ded ums.exe

-------------------------------------------------

ــه بالفاصلـه در degug/symdeb كراك فوق، ما از بايتها بعنوان رشته جستجو استفاده ميكنيم و در ادام

ــم اولين JZ را ميبينيم. من ميدانم ...ما آنها را در [saft-ice] ديديم ميتوانيم آنها را همان جا تغيير دهي

و اصالح كنيم. اما من ميخواهم به شما ياد دهم كه در صورت نبودن [soft-ice] چكار كنيد.

Page 45: آغازی برای کراکینگ

توجه داشته باشيد كــه طـول برنامـه x421A0 بـايت اسـت. بنـابراين داراي ثباتـهاي BX=4 بـهمراه

snap خواهد بود. .. در نتيجه من بايد همه سكتورها را امتحان كنم. (حتي اگر بدانم كــه CX = 31A0

در سكتور CS+2000 رخ داده). اين يك تمرين خوب است و اگر شما رشــته را در اوليـن سـكتور پيـدا

نكرديد، بايد سكتورهاي بعدي را جستجو كنيد. تا اينكه آن را بيــابيد. در بيشـتر برنامـهها شـما مجبـور

هستيد كه طرح را چند بار امتحان كنيد.

.[UMS.exe] كه بعدًا در مورد آن بيشتر توضيح خواهيم داد. اين راه قديمي كراك كردن است)

اجازه بدهيد ادامه دهيم. امروزه طرحهاي حفاظتي كلمه عبور استادانهتر و پيشرفهتر ميباشند.

----------------------------------------------------------------------------------

برنامـه LIGHT SPEED از Microprose (مـا در اينجـا از نسـخه 461.01 آن بـراي كـراك اســـتفاده

ميكنيم).

----------------------------------------------------------------------------------

-

اين برنامه در سال ١٩٩٠ منتشر شد و نسبت به طرحهاي قبلي خيلي مدرنتر و پيشرفتهتر عمل ميكند.

ــرور(server) دور (remote) خواهيـد شـد. (حقيقتـاُ هميـن شما متوجه اين تفاوتها طي دسترسي به س

چيزها هستند كه آن را جالب ميكند).

طبق معمول اجازه دهيد بردارهايمان تمرين و مقايسهها را شروع كنيم.

ــها نيسـت. مقايسـه حافظـه بردارهاي hook شده: 1B , 22, 23 , 08 , 00 : كه هيچ چيز خاصي در آن

ــل اينكـه اصلي، يعني همان كه شما كلمه عبور را در آن تايپ ميكنيد، خيلي طول ميكشد... درست مث

شما در حال تمرين هستيد.

خب حاال چه؟

بنشينيد و يك بر ودكاي ماريتني بنوشيد (من فقط از moskovskaja ميترسم) و راحت باشيد.

Page 46: آغازی برای کراکینگ

تصوير برنامهتان را در حافظه بگيريد، و از اينجا شروع كنيد. ABCDE را بعنوان كلمـه رمـز وارد كنيـد،

راحت بنشينيد و ودكاي مارتيني را مزمزه كنيد. ميدانيد كه كد حرف X41 ،A، كد حرف X42 ،B، كــد

حرف X43 ,C و .... ميباشد. و در مقايسه حــروف كـاربرد دارد و شـما تنـها بـا اسـتفاده از ايـن مقـادير

خواهيد توانست عمل مقايسه را انجام دهيد. پس روي آن خيلي دقت كنيد.

ــزودي درمييـابيد كـه برنامـه LIGHTSPEED داراي يـك آدرس مطلـق و يـك آدرس نسـبي شما ب

ميباشد. بعنوان مثــال در كـامپيوتر مـن در آدرس مطلـق 404307 و آدرس نسـبي BE:F857 30 يـا

4043:0007 قرار دارد كه كاراكترهايي كه شما تايپ كردهايد در آنها قــرار ميگيرنـد و ميتوانيـد آنـها را

چاپ كنيد.

F856 F857 F858 F859 ...

F855

41 3E دومين حرفيكه تايپ كردهايد. اولين حرفيكه تايپ كردهايد. اولين حرف حاضر

ــه با بررسي همان پرينتها، متوجه ميشويد كه آدرس مطلق 30C64محتوي آخرين كاراكترهايي است ك

شما تايپ كردهايد. خط كد نسبي بصورت زير است:

CS: 0097 MOV AX, [BP-08] جاييكه SS:F83E=00+ كد حرف تايپ شده

حاال اجراي برنامه در اين محلها را متوقف كنيد و ببينيد كه كاراكتر تايپ شده كجا ميرود. بــراي مثـال

ــد حـرف تـايپ دستور زير را در نظر بگيريد: CS:009A MOV [BX],AX مفهوم آن، اين است كه ك

ــرد. غـير از ايـن چـه شده شما در آدرسي كه رجيستر BX به آن اشاره ميكند،يعني F85A، قرار ميگي

ميتواند باشد؟

بهتر است بهانه نگيريد و آن را قبول كنيد. يك دستور مثل CM P AX, 000D را در نظر بگيريد كــه

ــك زماني رخ ميدهد كه كاربر كليد enter را بزند. كه با زدن كليد enter به x1D تبديل ميشود و بايد ي

CS: 0073 CMP AX, 000D جايي همين نزديكيها باشد و شما را به سطر

3D0D00 ميرساند. حاال راه نفوذ باز شده ولي شما نيازي به همــه اينـها نداريـد. از آنجـا كـه طرحـهاي

Page 47: آغازی برای کراکینگ

ــيزنم كـه شـما از اوليـن حفاظتي كلمه عبور (همانطور كه من گفتم) تقريباً مشابه هستند. من حدس م

حقهايكه االن ميگويم استفاده خواهيد كرد.

با استفاده از نقشه حافظه محل سكونت برنامه را پيدا كنيد و سپس در بزرگترين قسمت برنامــه بدنبـال

F36A بگرديد. اين همان دستور REPZ CMPSB ميباشد.

در حـالت، اسـتفاده از Lightspdشـما بـا دسـتورات زيـر، ٤آدرس خواهيـد داشـت. (سـگمنت اصلـي

(pgsg=برنامه

Pgsg:C6F9

pgsg:E5CA

pgsg:E63E

pgsg:EAB0

ميبينيد فقط چهارتا... كه با يك نظر شما ميتوانيد تشخيص دهيد كه دومي يعني E5CA از همــه بـهتر

است. مكانيسم مقايسه در اين برنامه ١٩٩٠، كم و بيش شبيه همان UMS سـال ١٩٨٧ ميباشـد. البتـه

بنظر من همان مكانيسمها ، امروزه (يعني سال ١٩٩٦) قابل استفاده هستند)

B9FFFF MOV CX,FFFF CX قرار دادن بزرگترين عدد در رجيستر

REPNZ SCASB (كلمه عبور اصلي) .جستجو ميكند DI را از محل ES اين سطر

F2AE

F7DI NOT CX ،تعداد كاراكترهاي كلمه عبور اصلي

2BF9 SUB DI,CX تغيير و تنظيم DI براي مقايسه

F3A6 REPZ CMPSB DI از محلES با SI از محل DS مقايسه

(يعني مقايسه كلمه عبور واقعي با كلمه عبور كاربر)

كه وقتي CX=0 شود يا آنكه به يك كاراكتر متفاوت برسد، متوقف خواهد شد.

Page 48: آغازی برای کراکینگ

حاال ديديد چقدر آسان است؟ اينها همه همان حلقههاي قديمي است. در اينجا فقط يك روتين كوچك

براي تست حروف كوچك الفبا الزم است چون معموالً حروف كلمات عبور كوچك هستند.

Snap حاال اگر دوست داشته باشيد اجراي برنامه را در يكي از اين محلها متوقف كنيم البته بجــز ناحيـه

ــابت پيـدا كنيـم، كـه معمـوالً محـل آن چون در اين ناحيه ما نميتوانيم يك breakpoint (نقطه نفوذ)ث

همانطور كه قبالً ديديد با segment : offset (افست: سگمنت) هاي مختلفــي آدرسدهـي ميشـود. بـه

ــه بـراي ايـن همين دليل شما ابتدا بايد يك break point نوشتني / خواندني (Real/wirte) روي حافظ

محلها داشته باشيد و بعد از آن، آنها را براي snap بگيريد. اآلن با اســتفاده از segment: offset (آدرس

ــل snap را پيـدا كنيـد و يـك breakpoint ثـابت روي آن بگذاريـد دهي افست: سگمنت) ميتوانيد مح

(بعنوان مثال ميتوانيد اينكار را با دستور NOT CX انجام دهيد.)

خب حاال برنامه را اجرا كنيد. يك beak point روي رجيستر ES از محل DI (ES:DI) داشــته باشـيد و

ــه عبـور اصلـي را داريـم. ميتوانيـم آن را روي پنجـره كلمه عبور واقعي را ببينيد . چه زيبا! ما حاال كلم

ــراك كـردن، يـك dump ببينيم كه به آن ميگويند يك انعكاس (echo) اين echoها براي عالقمندان ك

ــه كلمـه عبـور را بدسـت مدرسه واقعي است كه ميتوانند با مسيرهاي مختلف كار كنند كه عالوه بر آنك

ميآورند ميتوانيد پي ببريند كه محتويات ساير قسمتها از كجا ميآيد.

يك كار كه در روشهاي حفاظتي موسوم است، پنهان كردن آنــها در فايلـهاي مختلـف، دور از دسـترس،

ــي بـا بايد در بردارها، يا در قسمتهاي SMC ميباشد. در اينجا يك برنامه از ١٩٩٠ ميبينيد كه از نظرات

UMS فرق ميكند.

كلمه عبور داخل يك بردار پنهان شده، از حفاظت زيبا و در عين حال ســاده لوحانـهاي در آن اسـتفاده

ــدگذاري شده كه با يك يوتيليتي هگز(كار جادويي) شما ميتوانيد آنها را ببينيد. در اينجا كلمه عبور، ك

شده (مثل روشهاي قبلي) كه ميتوانيد با استفاده از همان brak pointهاي قبلي آنها را پيدا كنيد . شما

خيلي سريع ميتوانيد بخشي از برنامه را كه بصورت زير است پيدا كنيد:

Page 49: آغازی برای کراکینگ

Sg: 0118 8C 91 9D 95 9B 8D 00 B8 EC 94 9B 8D 8F 8B 9B

Sg: 0 128 94 9B 8D 00 AE EC 9C 9B 8A 9B 86 00 A9 EC 91

اين يك نوع ماتريس كدگذاري شده ميباشد كه با پاك كننده " ٠٠"(دو صفــر) كلمـه عبـور كـدگذاري

شده را در بر گرفته .

ها! اگر همه اين جور كدگذاري ميكردند، كراك كردن چه آسان بود!، رمزهاي بچــه گانـه هـم از اينـها

بهتر است!

93=6D=`m` ; 92=6E=`n` ; : معادل ماتريس فوق بصورت زير است

91=6F=`0`

و الي آخر ....

حاال اجازه دهيد كلمه عبور پنهان شده را رها كنيم و كراك خودمان را انجام دهيم.. اجازه دهيد نگاهــي

به پروسيجر snap زير بعد از دستورREPZ CMPSB كه به دستور «پرش به OK» ميرسد، بيندازيم

F3A6 REPZ CMPSB ; compares DS:SI with ES:DI

7405 JZ preserved_AX=0000 <--- Here the first JZ

1BC0 SBB AX,AX

ADFFFF SBB AX,FFFF

:preserved_AX=0000

8BF3 MOV SI,BX

8BFA MOV DI,DX

5D POP BP

CB RETF

....

83C404 ADD SP,+04

0BC0 OR AX,AX

7509 JNZ 0276 <------ And here it is!

Page 50: آغازی برای کراکینگ

. حاال كراك UMS را بخاطر بياوريد كه شما ميخواستيد دستور JZ را به JNZ تغيير دهيد (شما ســعي

داشتيد از داخل [SOFT-ICE] پرش كنيد و همين كار را هم كرديد!) و همچنيــن ٧٤ را بـه ٧٥ تغيـير

دهيد. و بعد از آن دوست داشتيد JNZ را به JZ تغيير دهيد... لطفاً خودتان را خسته كنيد. در اينجا كار

عملي نيست. (شما حتي دومين JNZ را هم در برنامه پيدا نخواهيــد كـرد) شـما هميشـه بـايد مواظـب

ــراي يـك SMC (يعني كدهايي كه خودشان خودشانرا تغيير ميدهند) باشيد. در واقع كدي كه موقع اج

برنامه بدست ميآيد، با كد مطلق برنامه خيلي تفاوت دارد.

حال در اينجا ما يك اصالحيه كوچك روي كدهاي اوليه خواهيم داشت. مشابه دستوري كه اجبارًا بــراي

دستكاري ديگر قسمتهاي برنامه استفاده كرديد، چنانچــه آن را بـه JNZ تغيـير دهيـد، بـا يـك پيغـام

ــه سرريزي مواجه خواهيد شد. بنابراين اصالح دستور JNZ به اين راحتيها نخواهد بود. نگاهي بيندازيد ب

قسمتي كه بعد از RETF، در حالت پرش، بوسيله برنامه light speed كمپايل خواهد شد. بنابراين شــما

ــد داشـته باشـيد و در بايد جستجويي براي ترجمه مكانيسم و اصالح رمزگذاري بايتهايي كه پيدا ميكني

برخي موارد ممكن است آنها را بيش از يكبار رمزگذاري كنيد. آن وقت است كه شب پرزحمت و سختي

را سپري خواهيد كرد.

JZ پس اينكار را انجام دهيد: يك جرعه ودكاي ماريتني بنوشيد و كمي فكر كنيد. تنها چيزي كه بعد از

A x= ــم) ميباشـد( … ١ رخ ميدهد تنظيم رجيستر يا ثبات AX به مقدار False ، بعنوان flag (پرچ

ــا يـك همان چيزي است كه دو دستور SBB انجام ميدهد). بعنوان مثال اگر شما كلمه عبور را ندانيد، ب

مقدار غير صفر از اين قسمت خارج ميشويم. پس بگذاريد با پنج بايت دو دستور SBB هيچ كاري انجام

ندهيم و يا در حالت بهتر از آن بگذاريد به جاي دو دستور SBB سري دســتورات INC AX، (يكـي بـه

، INC AX ،(ــاري انجـام نـده رجيستر Ax اضافه كن، DEC AX (يكي از Ax كم كن)،NOP (هيچ ك

ــادل آن قـرار دادهايـم. مزيـت اسـتفاده از DEC AX، را داشته باشيم. يعني پنج دستور يك بايتي مع

ــا هيـچ كـاري انجـام نـده) در طرحـهاي دستورات فوق نسبت به يكسري دستور no operation)nop ي

Page 51: آغازی برای کراکینگ

ــن هـر آنچـه كـه آن حفاظتي جديد آن است كه كنار هم گذاشتن nopها داخل يك برنامه و دور ريخت

ــردن، دستورها بدست ميآورند چندان جالب نخواهد بود. شما هميشه بايد سعي كنيد در زمان كراك ك

از حداقل دستورات بيشترين كارآيي را بگيريد. بعبارتي حذف دو دستور SBB ما را در واقع يــك كراكـر

ــد و كلمـه ميكند. نه الزم نيست با دومين JNZ خودتان را به زحمت بيندازيد. برنامه خودش كار ميكن

عبور را ميگيرد . چه شما اينكار را انجام بدهيد و چه انجام ندهيد. البته نوع قبلي كراك ـمشــابه آنچـه

براي UMS گفتيم ـ براي شما بهتر است . وقتي شما براي دسترسي به كامپيوتري، كراك ميكنيد. بــه

ــد شـد و سيسـتم او را كنـار نمـيگذارد. هـر دو بـه كـامپيوتر كاربر اصلي هيچ گونه گماني برده نخواه

دسترسي داريد، يكي خوب و ديگري بد... خيلي جالب است نه؟

حاال اجازه دهيد يك كراك سريع با LIGHTSPD داشته باشيم:

------------------------------------------------

CRACKING LIGHTSPEED.EXE (by +ORC, January 1996)

ren lightspd.exe lightspd.ded

symdeb lightspd.ded

- s (cs+0000):0 Lffff 2B F9 F3 A6 74

xxxx:yyyy (this is the answer of the debugger)

- s (cs+1000):0 Lffff 2B F9 F3 A6 74

(nothing, but do it nonetheless, just to be sure)

- s (cs+2000):0 lffff 2B F9 F3 A6 74

(nothing, just to be sure, now it's enough)

Page 52: آغازی برای کراکینگ

- e xxxx:yyyy+6 40 [SPACE] 48 [SP] 90 [SP] 40 [SP] 48

- w

- q

ren lightspd.ded lightspd.exe

-----------------------------------------------

همه اين CMP SBها مثل هم هستند اما با اينحال برخي برنامهها از طرحــهاي حفـاظتي متفـاوتي كـه

F3A6 REPZ چندان با ارزش هم نيستند استفاده ميكنند. پــس نبـايد اعتمـاد چندانـي بـه دسـتور

ــتفاده در اوليـن نسـخه General (version) (از CMPSB داشته باشيم. بياييد طرح حفاظتي مورد اس

QQP-White wolf جوالي ١٩٩٢٩ را باهم آناليز كنيم.

وقتيكه شما اجراي برنامه را در حين اجراي يك پنجره متوقف ميكنيــد، در واقـع شـما وسـط يكـي از

پروسيجرهاي BIOS هستيد. برنامه منتظر ورودي شما (مثالً كلمه عبور) ميباشد. شما به سرعت نقشــه

حافظه مربوط به محل قرارگيري برنامه General . exe را پيدا ميكنيد. Beak point را در حالت نوشتن

روي حافظه تنظيم ميكنيد.

در آن وقت است كه محل مورد استفاده حافظه براي طرح حفاظتي، براي شما آشكار ميشود. در دســتور

زير

xxxx:1180 to xxxx:11c0

xxxxمحل دومين سگمنت حافظه كه برنامه در آن ساكن شده نشــان داده ميشـود. حـاال مطـابق زيـر

انجام دهيد : (يك پروسيجر كراك كردن خيلي رايج):

ــدوده كـوچكـي از حافظـه كـه شـما در آن بدنبـال كلمـه عبـور * يك break point نوشتني روي مح

ميگرديد:

Page 53: آغازی برای کراکینگ

* trace باbreakpoint روي محدودهاي از حافظه كه كد اصلي قرار دارد (trace يعني اجراي مرحله بــه

مرحله يك برنامه).

* ا جراي يك چيز جديد

اين همان چيزي است كه قبالً انجام داديم. در اينجا در ٩ سطر، آنچه كــه طـي فراخوانـي پروسـيجر در

حافظه رخ ميدهد، دنبال شده.

your memory area:

-9 xxxx:0185 7425 JZ somewhere, not taken

-8 xxxx:0187 2D1103 SUB AX,0311

-7 xxxx:018A 7430 JZ somewhere, not taken

-6 xxxx:018C 2DFD04 SUB AX,04FD

-5 xxxx:018F 7443 JZ next_trace, taken

-4 xxxx:01D4 E85500 CALL funny_procedure

-3 xxxx:022C 803E8F8C11 CMP BYTE PTR[8C8F],11

-2 xxxx:0231 750E JNZ somewhere, not taken

-1 xxxx:0233 9A0A0AC33E CALL procedure_that_sniffs

our_memory_area

خب فراخواني پروسيجر fanny-procedure در زير بدنبال مقايسه يك بايت بعيد به نظر

ميرسد. پس اجازه دهيد بالفاصله نگاهي به بخشي از كد برنامه General. Exe بيندازيم.

Page 54: آغازی برای کراکینگ

:funny_procedure

803E8F8C11 CMP BYTE PTR[8C8F],11

750E JNZ compare_byte

9A0A0AC333 CALL procedure_that_sniffs

0AC0 OR AL,AL

7405 J2 compare_byte

C6068F8C2A MOV BYTE PTR [8C8F],2A

:compare_byte

803E8F8C2A CMP BYTE PTR [8C8F],2A

7504 JNZ after_ret

B001 MOV AL,01

C3 RET

ــردن باشـيد. توجـه داشـته باشـيد كـه دو دسـتور با اين درس شما بايد به اندازه كافي قادر به كراك ك

ــأثيري روي مقايسـه 2A بـراي JNZ نخواهـد متناقض بدنبال هم يعني MOV 2A و CMP 2A ،هيچ ت

ــورت ميگيـرد. داشت. چون كه شما 2A را درست تنظيم نكردهايد. يعني در واقع با اولين JNZ پرش ص

اما بدون اينكه داخل 2A چيزي باشد و داخل 2A هيچ چــيزي بـه جـز عالمـت (*) نيسـت كـه بـراي

برنامهنويسها معموالً حكم OK را دارد. اين حفاظت به روش زير كار ميكننــد (شـرح كـد بـاال در زيـر

آمده):

ـ مقايسه محل مورد نظر با 11

- پرش اگر صفر نيست(NON ZERO) به مقايسه محل مورد نظر با (*)

sniff در غير اينصورت فراخواني پروسيجر -

- OR كردن AL با خودش (به منظور 0 كردن آن)

- پرش اگر صفر است، به مقايسه محل مورد نظر با (*)

Page 55: آغازی برای کراکینگ

- اگر AL صفر باشد، (*) به داخل محل مورد نظر منتقل ميشود.

- محل مورد نظر با (*) مقايسه ميشود.

- اگر تفاوتي دارد، پس JNZ با موفقيت به كار پايان ميدهد.

- در غير اينصورت دوباره از اول شروع ميكنيم.

حال اجازه دهيد به سرعت كراك كنيم:

------------------------------------------------

CRACKING GENERAL.EXE (by +ORC, January 1996)

ren general.exe general.ded

symdeb general.ded

- s (cs+0000):0 Lffff 8C 11 75 0E

xxxx:yyyy (this is the answer of the debugger)

- e xxxx:yyyy+2 EB [SPACE] 09

- w

- q

ren general.ded general.exe

-------------------------------------------------

..MOV (*) (پـرش) بـه دسـتور JMP ــك اين، روش تغييرميدهد JNZ را به دستور (*) CMP در ي

بنابراين اكثر پنجرهها چندان هم حفاظت نشدهاند. همه آنها با استفاده از general.exe، راحت، واضــح و

دست يافتني خواهند بود.

Page 56: آغازی برای کراکینگ
Page 57: آغازی برای کراکینگ

درس٤

خودآموز كراك كردن

(٢) (Protection) مقاله حفاظت

[TOP.EXE] [F19 .EXE] [POPULOUS.EXE] [MAP.EXE]

در درس قبل ديديد كه چگونه از محافظت كلمه عبور،با كمك كدگذاري و روشهاي پنهان سـازي مـورد

استفاده براي ذخيره آنها در حافظه، گذشتيم, اشارهاي داشتيم به پروسيجرهاي مقايسه براي كلمه عبور

ــراي شـروع عمـل كـراك (نفـوذ) در واقعي و آنچه كاربر تايپ كرده بود. بنابراين تا اينجا چندين مورد ب

اختيار داريد:

- يافتن محل كلمه عبور كاربر

- انعكاس (يا echo) در حافظه براي كلمه عبور واقعي

- يافتن روتيني كه آنها را باهم مقايسه كنيد.

- يافتن كلمه عبوري كه بصورت رمز، جايي كه پنهان شده.

- يافتن go-ahead-nice-buyer و خروج يا پرش

Page 58: آغازی برای کراکینگ

- يافتن beggar-off-ugly-copier خروج يا پرش

در برخي حالتهاي كراك كردن با ا ستراتژي هاي متعدد حفاظت روبرو ميشويم كه معروفترين آنها:

- حالتهاي مختلف روتينهاي ذخيرهسازي، مقايسه و پنهانسازي هر سه در كنار هم براي يك كد انجــام

ميگيرد.

- پر شدن اين روتينها با باگهاي مقايسه، باگهاي پرش و باگهــاي متغيرهـا بـه منظـور مشـكلتر كـردن

كراك.

-پخش كد با حقههاي آنتي ديباگر (ضد ديباگر) مثل دستورات INT3 (وقفه سه) يا پرشــها به داخـل و

بيرون از حالت محافظه شده .

- سعي در از بين بردن نياز به وارد كردن كلمات رمز. تا حد ممكن .

ــف يعني به كاربر اجازه ميدهند تا يك حرف، يك عدد يا يك تصوير را بعنوان پاسخ برخي سؤاالت مختل

وارد كند. در اين درس ما ياد ميگيريم كه چگونه با اين تكنيكهاي حفاظتي مبارزه كنيم.

کلمه عبور بعنوان جموز دسترسى

اين نوع كلمات عبور مربوط به اطالعاتي است كه كاربر قانوني يا اصلي برنامه در مورد آن دارد. اين يــك

ــا نوع كلمه عبور است كه بعنوان مثال ميتواند account دسترسي به شما به يك كامپيوتر، روي شبكه ي

حتي ماشين ATM مورد استفاده براي بانك يا يك شركت باشد. اين حالت احتياج به يك نوشــتن روي

هارد، براي كراك كردن دارد. اين نوع كلمه عبور بستگي به پاسخي از كامپيوتر مركزي دارد. (اينها فقط

ـــاي نــه ناحيــه مغناطيســي روي كــارت را كنــترل ميكننــد). خطوطــي بيــن ATM و host ه

ــها واقعـي اسـت يـا آنها وجود دارد كه معموالً آماده براي چك كردن اينكه اطالعات مبادله شده روي آن

ــا اينـهم بطريقي رمزگذاري شده , ميباشد. (برخي بانكها از اطالعات كدگذاري شده استفاده ميكنند ام

براي كراك كردن نسبتاً آسان است). در مورد ATMها شما كارهاي زير را بايد انجام دهيد.

Page 59: آغازی برای کراکینگ

ــك شـبكه) ١) روي خطوط اختصاصي بين ATM و host (كامپيوتر ميزان يا كنترل كننده مركزي در ي

ــن ATM و host(ميزبـان) قـرار دهيـد. ٣) بـه پيغامـهاي خط بطالن بكشيد. ٢) كامپيوتر خودتان را بي

معمولي گوش دهيد اما هنوز مداخله نكنيد. ٤) سعي كنيد برخي عمليات را با يك كارت درســت انجـام

ــت آمـاده شـديد يـك دهيد، برخي اشتباهات را مرتكب شويد و به كدهاي مختلف توجه كنيد ٥) هروق

كارت گول زننده داخل ATM كنيد، حاال اتفاق زير رخ ميدهد:

ــم از ايـن شـخص ATM يك سيگنال به كامپيوتر ميزبان ارسال ميكند. با اين مضمون «هي! من ميتوان

پول بگيرم يا اينكه او يك ورشكسته است يا يك كارت غيرمعتبر خندهدار وارد كرده؟»

ــد «اينجـا - ميكروكامپيوتر جلو اين پيغام را ميگيرد و به جاي آن اين سيگنال را به ميزان ارسال ميكن

هيچكس از ATM استفاده نميكند».

host اين پيغام «هيچكس استفاده نميكند» را ميگيرد و پاسخ ميدهد «خب مراقب باشــيد كسـي وارد

نشود و بخاطر خدا هيچ پولي را در خيابان نريزيد» اين سيگنال براي ATM ارسال ميشود.

ــيريزد و در عـوض ايـن پيغـام را ارسـال - ميكروكامپيوتر دوباره جلو اين پيغام را ميگيرد و آن را دور م

ميكند» اين شخص خيلي ثروتمند است، هرچقدر پول ميخواهد به او بدهيد. در واقع او خيلــي متمـول

است ، همه صندوق را به او بدهيد. او يك مشتري واقعي است».

- ATM محتويات صندوق را به او ميبخشد.

همه اينها ممكن است و ميتوان كراك كرد مگر آنكه يك نرم افزار حفاظتي روي خط باشد. بنـابراين اگر

شما بخواهيد با ATM كار كنيد او با شما برخورد ميكند و اعالم ميكند كه طرف يك هكـر اسـت. لطفـاً

بخاطر داشته باشيد صندوقي را هك كنيد كه يك دوربين كنترل كننده نداشته باشد.

کلمه عبور بعنوان ثبت نام

اين نوع كلمه عبور معموالً براي برنامههايي كه اشتراكي اجرا ميشوند، استفاده ميشود. وقتي شما از يك

ــل برنامـه اشـتراكيتان برنامه اشتراكي استفاده ميكنيد، يك كلمه عبور به منظور به روز رساني و تكمي

Page 60: آغازی برای کراکینگ

وارد ميكنيد، اين روش اخيرًا براي كاربردهاي تجاري، استفاده ميشود و امروزه داراي تعداد كمي پنجه

كاربردي هستند كه در آنها مثالً براي اينكه سي دي مربوط به يك مجله را بگيريــد الزم اسـت بـه يـك

ــد تـا شـما بتوانيـد خط اصلي تلفن كنيد و پولي را پرداخت كنيد تا يك كليد ويژه و يكتا، به شما بدهن

ــوذ قفل اين نوع حفاظت ويژه را باز كنيد. در اين موارد شما بايد ياد بگيريد كه چطور به اين پنجرهها نف

كنيد. در آن درسها شما روتينهاي متنوعي را ميبينيد كه ورود شما را چك ميكند.

کلمه عبور بعنوان حمافظ کپى

اين نوع كلمه عبور معموالً براي بازيها و سرگرميها استفاده ميشود. كلمه مورد نظر معمــوالً در هـر بـار

ــه بـازي، شروع اجراي برنامه يا هر بار بارگذاري آن ظاهر نميشود. بلكه بعد از تكميل يك يا چند مرحل

ــازار آمـد) يـا اينكـه زمـان بـارگذاري ظاهر ميشود. (اين نوآوري, اولين بار توسط EOBI و Ultina به ب

مجدد يك بازي ذخيره شده، ظاهر ميشود.

Dongle كلمه عبور

ــخت افـزاري هـم يك برنامه خيلي گران معموالً از اين نوع كلمه عبور استفاده ميكند. (كه يك كليد س

ناميده ميشود). dongle، يك وسيله سخت افزاري كوچك ميباشد كه به پورت(درگاه) موازي يا ســري،

وصل ميشود. برخي dongleهاي خاص حتي شامل روتينهايي از يكسري برنامههاي تكميلي ميباشــند.

اين dongle هم قابل كراك كردن هستند. اما كار بيشتر نياز دارد. و براي عبور از پروسيجرهاي خطا كه

روي آنها استفاده شده در زمان كراك كردن به نرمافزارهاي كمكي نياز داريم كه شايد يك هفته نياز بـه

وقت داشته باشد. سريع ترين روش براي كراك كردن برنامهاي كه بــه ايـن طريـق حفـاظت شـده، كـار

ــردن آن را بگيريـد. مـن كردن روي قطعه سختافزاري است كه به آن متصل شده. شما بايد جلو كار ك

ــراي نفـوذ كـردن بـه dongleهـا خودم بندرت به اين موردها برخورد ميكنم و به نرمافزارهاي كمكي ب

ــي خواهيـد اطالعـاتي در عالقهاي ندارم. اينها به يك فكر قوي و آزاد و يك وقت زياد نياز دارند. اگر م

Page 61: آغازی برای کراکینگ

ــاس بگيريـد. آنـها در برخـي مـوارد مورد نفوذ به dongleها بگيريد سعي كنيد با سايتهاي قديميتر تم

جوابهاي جالبي به شما مي دهند.

ــهترين كلمـه عبـور آن يك مدير خوب نرم افزار براي يادآوري يك كلمه عبور مطابق زير عمل ميكند: ب

است كه پنهان شده باشد و بهتر از آن اينكه رمزگذاري شده باشد. در آن صورت امنيت بيشتري متوجـه

برنامه خواهد بود.

كلمه عبور بايد:

- رمزگذاري شده باشد و / يا

- در يك بردار hook شده ذخيره شده باشد و / يا

- در يك فايل خارجي ذخيره شده باشد و / يا

در يك قسمت SMC (كدي كه خودش خودش را اصالح ميكند) قرار گرفته باشد.

ــرد اجازه دهيد در آخر طرحهاي حفاظتي مورد استفاده توسط برخي برنامهنويسان مورد استفاده قرار گي

را درجهبندي كنيم.

- گرفتن كلمه عبور

- حروف به يك كليد اضافه ميشود تا وارد شود.

- تركيب حروف شكل گرفته XOR كردن با 255

- ذخيره يك كليد (يك حرفي)

- خيره كلمه عبور (٢٥٦ حرفي)

ـ ذخيره Checksum ( بصورت يك حرف)، به منظور حفاظت و پيادهسازي دوباره.

- ساخت فايل password.dat با كلمه عبور، كه داخل فايل ديگري غير از آنكــه روتينـها را صـدا مـيزند

ــد بدنبـال اوليـن فـايلي كـه درج شده. حاال برنامهنويسان تنبل كه ميخواهند برنامهشان را حفاظت كنن

كلمه عبور در آن ذخيره شده ميگردند و سپس كليد را در آن ميگذارنــد يعنـي هـم كلمـه عبـور و هـم

Page 62: آغازی برای کراکینگ

ــك checksum . آنها از يك پروسيجر رمزگشايي كلمه عبور و يك پروسيجر كنترل checksum براي چ

كردن اينكه كلمه عبور درست وارد شده، استفاده ميكنند. همه اينها به راحتي و طــي چنـد ثانيـه قـابل

كراك كردن است.

[ setup دست يابي به كلمه عبور داخل ]

برخي كامپيوترها داراي يك كلمه عبور هستند كه setup آنها را از دسترسي حفاظت مي كند. (يعني در

همان شروع كار) اين طرح حفاظتي اجازه boot كردن با يك فالپي يا اصالح setup را نميدهــد. در ايـن

حالتها تنها راه ممكن براي نفوذ استفاده از يك روش قديمي هك كردن است :

* PC را باز كنيد .

* روي مادربورد يك جامپر كوچك با كلمه pw را پيدا كنيد .

* آن را برداريد.

* PC را روشن كنيد.

* Setup را با f1 يا del اجرا كنيد (بسته به نوع bios) (حفاظت بيش از اين كار نخواهد كرد).

* داخل setup، قسمت مربوط به password را غيرفعال كنيد .

* PC را خاموش كنيد .

* جامپر را دوباره سرجايش برگردانيد.

* PC را ببنديد.

* PC را روشن كنيد. كراك انجام شد و اگر بخواهيد ميتوانيد كلمه عبور جديدي روي آن بگذاريد.

اگر ميخواهيد اطالعات بيشتري در مورد دسترسي و عدم دسترســي، رمـزگذاري و قفـل كـردن جـدول

ــم خـوب FAT داشته باشيد، آنها را از اينترنت بگيريد و مطالعه كنيد كه ويروس Monkey كه خيلي ه

نوشته شده از اين نوع تخريب استفاده ميكند. مطالعه ويروسها كالً براي كراك كردن خيلي خوب است.

Page 63: آغازی برای کراکینگ

کدهاى ويروسها

- خيلي خوب نوشته ميشوند (خالص، به زبان اسمبلي)

- با استفاده از تكنيكهاي مخفي نه چندان متفاوت از طرحهاي حفاظتي (اغلب پيشرفته)

- با استفاده از جديدترين و بهترين حقههاي SMC (كدهايي كه خودشان خودشان را تغيير ميدهند)

اما آنچه مهم است اين است كه باور نكنيد كه طرحهاي حفاظتي خيلي كامل و پيچيده هستند. بيشــتر

ــال مقالـه طرحـهاي وقتها حفاظت استفاده شده به طرز عجيبي معمولي و ساده است. بعنوان آخرين مث

ــاظتي حفاظتي ما اجازه بدهيد يك برنامه نه خيلي قديمي (١٩٩٤) را بگيريم و ببينيد چه طرحهاي حف

مضحكي دارد. (ببر در پي شكار)

يك شبيه سازي از HPS . كراك كردن در اينجا خيلي واضح پيش ميرود :

- با استفاده از نقشه حافظه مورد استفاده، سكتور اصلي را پيدا كنيد.

- AAAA را بعنوان كلمه عبور تايپ كنيد.

- سكتور اصلي را بدنبال AAAA از 0 تا 1FFFF جستجو كنيد.

- dump L80 AAAA را از آدرس 40 (يك محدوده وسيعي را به وسيله dump بگيريد).

به اين طريق شما echo مربوط به كلمه عبور درست را ميگيريد.

- يك break point خواندني و نوشتني روي حافظه براي محل AAAA انجام دهيد و بدنبــال آن يـك

اجراي مرحله به مرحله روي روي سكتور اصلي، كار را تكميل خواهد كرد.

در اينجا سطرهاي كد حفاظت شده باال آمده:

8A841C12 MOV AL,[SI+121C] move in AL first user letter

3A840812 CMP AL,[SI+1208] compare with echo 7402 JZ go_ahead_nice_buyer

EB13 JMP beggar_off_ugly_cracker

Page 64: آغازی برای کراکینگ

حاال بياييد به سرعت آن را كراك كنيم:

------------------------------------------------

CRACKING TOP.EXE (by +ORC, January 1996)

ren top.exe top.ded

symdeb top.ded

- s (cs+0000):0 Lffff 8A 84 1C 12 3A 84

xxxx:yyyy (this is the answer of the debugger)

- e xxxx:yyyy+2 08 (instead of 1C)

- w

- q

ren top.ded top.exe

-------------------------------------------------

ـتور MOV Al,[SI,121C] را بـه MOV AL,[SI+1208] تغيـير داديـد. .. حـاال در حـال و شما دس

خواندن ECHO به جاي كاراكترهاي تايپي شما ميباشد. در مقايسه ECHO هم مشكلي پيش نميآيــد

و حاال شما موفق شديد.

برخى پنهان کاريهاى مشکوک

به حروف رمز تايپ شده برنامه قبل برگرديد، بياييد يك بازي حفاظت شــده ١٩٩٠ را بـاهم بررسـي

كنيم يعني بازي F19 ،در جايي كه طرح حفاظتي، از شما براي شناســايي هـواپيمـا، كدخـاصي را مـي

خواهد اين نوع حفاظت براي دوري جستن از ذخيره كلمه عبور در خانههاي حافظه بكار مي رود. كه مـا

طي اولين آزمايش ماده براي ورود كلمه عبور متوجه مي شويم كه چنين طرحي خيلي آسان قابل نفــوذ

ميباشد.

MEMORY ــام در ايـن حـالت بـراي كـراك كـردن مـا ميتوانيـم از يـك تكنيـك شـناخته شـده بن

SNUFFINGاستفاده كنيم. برنامه حفــاظت شـده start.exe. خـودش در محـلxxxx: 0000 بـا طـول

ــان را تغيـير 6C62 بايت نصب ميشود اما ماژولهاي آن (بهمراه برخي كدهاي SMC كه خودشان خودش

Page 65: آغازی برای کراکینگ

ــوان ميدهند) در محلهاي مختلف حافظه قرار ميگيرد. همه اينها به چه مفهومي است؟ خيلي چيزها ميت

ــما سـريعاً از آن فهميد كه مهمترين آنها اين است كه حفاظت آنها بستگي به ورودي كاربر دارد. حاال ش

ــن متوجه خواهيد شد كه روتيني كه بطور تصادفي هواپيمايي را انتخاب ميكند، بطور تصاعدي شماره اي

هواپيما را در محلي از حافظه يعني CD:DADA 43 نگهداري ميكند. اين مكانيسم تصادفيسازي آن را

بصورت زير مشخص ميكند :

E87FAF CALL random_seed

83C402 ADD SP,02

8946E8 MOV [BP-18],AX and ds:(BP-18) is the location

you are looking for

DS:(BP-18) محلي است كه شما بدنبال آن ميگرديد.

ــاوتي (x14-00) در ايـن محـل ميبينيـد كـه معـادل حاال هربار كه فرآيند تصادفي سازي رخ مي دهد شما عدد متف

ــدد تصـادفي را در Ax ذخـيره هواپيماهاي مختلفي است كه كاربر انتخاب ميكند. روتين تصادفي سازييي كه ديديد ع

ــا هميشـه ميكند كه حاال ما بايد آن را صفر كنيم. و در آن صورت كاربر هواپيماي صفر را هميشه انتخاب خواهد كرد و م

جواب صحيح خواهيم گرفت.

ميبينيد كار به چه زيبايي انجام ميشود. ما نه نيازي به مداخله در روتينهاي مربوط به انتخاب با ماوس داريم و نه نيــازي

به انتخاب هواپيماي واقعي. تصادفي سازي، هواپيماي دلخواهش را انتخاب ميكند، اما خانه حافظه مربوطه محتــوي صفـر

خواهد بود.

-------------------------------------------------------

CRACKING "F19" [START.EXE] (by +ORC, January 1996)

ren start.exe start.ded را بگيريم deal اجازه دهيد يك فايل

symdeb start.ded اجازه دهيد آن را ديباگ كنيم

- s cs:O lffff 83 C4 02 89 46 E8 بگرديم ADD SP02 بدنبال

Page 66: آغازی برای کراکینگ

xxxx:yyyy پاسخ ديباگر

- e xxxx:yyyy 58 [SPACE] 31 [SPACE] C0 [SPACE]

- w نوشتن كراك

- q (os)برگشت به سيستم عامل

ren start.ded start.exe exe بازنويسي

------------------------------------------------------

شما الزم بود دستور مورد جستجو را بصورت زير منتقل ميكرديد.

83C402 ADD SP, +02

58 POP AX ADD SP,+02 رجوع به

31C ٠ XOR AX,A X كردن به منظور صفرشدن XOR

(دستور POP AX، اشاره گر Stack را براي ارجاع به ADD SP,+02 دو تا جلو ميبرد. )

ــالي در مـورد حفـاظتي كـه هيچگونـه echo بـه خوب، زيبا و ساده، اينطور نيست؟ حاال اجازه دهيد مث

ــور صحيـح را حافظه ندارد داشته باشيم. (براي شروع با اين ايده زيركانه پيش برويد كه كراكر، كلمه عب

نمييابد. و آن اينجا نيست. بنابراين ما در اينجا يكي از اولين برنامههاي از ايــن نـوع را كـراك ميكنيـم

بنام:

[poplous. Exe] , از=> Bullfrog

[populous. Exe]

يك مثال قديمي از طرح حفاظتي «كلمه عبوري كه يك كلمه عبور نيست» را ميتوانيـد

ــد و در [populous. Exe] بياييد كه توسط Bullfrog نوشته شده. كه يك برنامه خيلي رايج مي باش

ــافظ شما حتماً خواهيد توانست يك كپي آن را براي اين درس پيدا كنيد. برنامه از شما، شناسه يك مح

ــه صـورت تركيبـي از حـروف بـا طـول مختلـف ميباشـد. خانـه يا سپر ويژه را درخواست مي كند كه ب

ــه حافظهاي كه كلمه عبور كاربر در آن ذخيره شده به آساني قابل پيدا كردن است. اما در ظاهر هيچگون

echoيي از كلمه عبور واقعي وجود ندارد. حاال ديگر شما بايد بتوانيد خانه حافظه يك كلمه عبــور در آن

Page 67: آغازی برای کراکینگ

ذخيره شده را پيدا كنيد. يك break point خواندني و نوشتني روي اين ناحيــه حافظـه تنظيـم كنيـد.

بزودي به بخش كد كه در ذيل آمده بپرسيد :

F7AE4EFF IMUL WORD PTR [BP+FF4E] <- IMUL with magic_N

INC AX ٤٠ّ

3B460C CMP AX, [BP+0C]

7509 JNZ beggar_off_ugly_copier

8B460C MOV AX, [BP+0C]

A3822A MOV [2A82], AX

E930FE JMP nice_buyer

817E0C7017 CMP WORD PTR[BP+0C],1770 <- beggar_off

ــوذ بـه ايـن طـرح من فكر نمي كنم شما به اطالعات بيشتري نياز داشته باشيد. حاال شما براي نف

چكار مي كنيد؟آيا درج يك MOV [BP+0C],AX و سـه تـا دسـتور (شـش بـايت) NOP. بعـد از

دستور IMUL را ترجيح ميدهيد؟ آيا شــما ترجيـح نمـي دهيـد كـه بجـاي JMP nice-guger دسـتور

JNZ beggar-off را قرار دهيد؟ كه در آن صورت تعداد nopها به حداقل ميرسد و اين همان است كــه

در طرحهاي حفاظتي جديد رعايت ميشود. بياييد اين روش را دنبال كنيم:

---------------------------------------------------

CRACKING [Populous.exe] (by +ORC, January 1996)

ren populous.exe populous.ded <- let's have a dead file

symdeb populous.ded <- let's debug it

- s cs:O lffff F7 AE 4E FF <- the imul magic_Nّ

xxxx:yyyy <- debugger's answer

- e xxxx:yyyy+4 EB [SPACE] 03 <- JMP anyway

Page 68: آغازی برای کراکینگ

- w <- modify ded

- q <- back to the OS

ren populous.ded populous.exe <- let's re-have the exe

----------------------------------------------------

اين دفعه ساده بود. نه؟

حاال شما براي كار در اين زمينه آماده هستيد . اجازه دهيد كاربرد گذشــته را كـراك كنيـم. و آن يـك

يوتيليتي( كاربردپذيري,مفيديت)خيلي رايج حافظه مي باشد، كه براي هدف ما خيلي خيلي مفيد اســت

(و شما بعدها براي كراك كــردن برنامـههاي TSR، يعنـي برنامـههاي مقيـم در حافظـه، از آن اسـتفاده

خواهيد كرد) با قفلها مشكلي نخواهيد داشت. و براي سطحي كه شما االن هستند،مناسب ميباشد. هــي

! مراقب باشيد كه شما هيچوقت نبايد بدون اين خودآموز آن را انجام دهيد. پس مطابق زير عمل كنيد:

از پنجرهتان نگاهي به شرق بيندازيد، جرعهاي ودكاي مارتيني بنوشيد (ابتدا دو قطه يخ، ١/٣ از ماريتني

خشك از مارتيني و رزي، ١/٣ ودكاي MOSKOVSKAIA. ١/٣ Schweppes Indian tonic)) و سـه

+ORC . بار بگوييد , متشكرم

[map, exe]

حاال اجازه دهيد با يكي از قويترين ابزارهاي موجود map كردن حافظه يعني MAP.EXE (نسخه ٢) از

ــما گفتـه شـده و در اينجـا نرم افزار Clockwork كار كنيم. استفاده از اين نرم افزار در درس ٢ براي ش

Nigle اي نـدارد، بجـاي آن nag screen ــن برنامـه هيچگونـه روش كراك كردن آن گفته مي شود. اي

screen دارد كه همه جا حاضر است، بمنظور ماندن براي يك مقدار تصادفي زمان قبل از اينكه از كــاربر

بخواهد كليدي بزند، كه هميشه به اندازه يك مقدار تصادفي منتظر مي ماند.

استفاده از يك حرف كه معموالً با برخي XORيا SHRها بعنوان كلمه عبور رمزگذاري شده كــه همـان

محل اوليه مورد استفاده براي مقايسه snap در حافظه خواهد بود. تكنيك نفوذ در اينحجا تا حــدي رك

و بي پرده خواهد بود. يعني به راحتي break مي كند و نظري به اطراف ميافكند.

Page 69: آغازی برای کراکینگ

ــارگذاري nag screen، فراخوانـي روتين وقفه ١٦ (INT 16) براي خواندن صفحه كليد، درست بعد از ب

ــد كـرد كـه كلمـه ميشود. شما به سرعت روتين LODSB را داخل نقاشي هاي روي صفحه پيدا خواهي

press( يا فشار دهيد) و يك جعبه بعد از كمي تأخير، ظاهر خواهد شد.

B95000 MOV CX,005 0

2EFF366601 PUSH CS:[0166]

07 POP ES

AC LODSB

...

ــاظت توانسـتهايد بـه شما قبالً توانستهايد از اين تأخيرها عبور كنيد و براي تخمين ميزان حساسيت حف

ــوذ عميقتـري داشـته باشـيم. پـس اجـازه دهيـد بـا زور از اين مراحل عبور كنيد اما حاال ميخواهيم نف

برگشتن به فراخوان كار را انجام دهيم. روتين قبلي از بخش كد ذيل، فراخواني شده :

91 XCHG AX,CX

792 XCHG AX,DX

28939193 SUB [BP+DI+9391],DL

2394AA94 AND DX,[SI+94AA]

2EC7064B880100 MOV WORD PTR CS:[884B],0001

2E803E5C0106 CMP BYTE PTR CS:[015C],06

7416 JZ ret <- Ha! jumping PUSHa & POPa!

505351525756 PUSH the lot

E882F3 CALL 8870

2E3B064B88 CMP AX,CS:[884B]

Page 70: آغازی برای کراکینگ

7307 JAE after RET <- Ha! Not taking the RET!

5E5F5A595B58 POP the lot

C3 RET

... <- some more instructions

E86700 CALL delay_user

BE9195 MOV SI,9591

2E8B3E255C MOV DI,CS:[5C25]

83EF16 SUB DI,+16

2E8A263D01 MOV AH,CS:[013D]

50 PUSH AH

E892C7 CALL routine_LODSB <-- HERE!

B42C MOV AH,2C

CD21 INT 21 <- get seconds in DH

80E60F AND DH,0F

80C641 ADD DH,41

58 POP AX

8AC6 MOV AL,DH

83EF04 SUB DI,+4

AB STOSW

E85A00 CALL INT_16_AH=01

B400 MOV AH,00

CD16 INT 16

24DF AND AL,DF <- code user's letter_answer

3AC6 CMP AL,DH <- pass_compare

75F3 JNZ CALL INT_16_AH=01

E807F3 go_ahead

ــن حفـاظت) سـگمنت كـد شما بايد نگاهي به اين دستورها بيندازيد. تا آن را احساس كنيد. من فكر ميكنم (در اي

Page 71: آغازی برای کراکینگ

غيرضروري، در يك حالت مارپيچي زير پوشش حركت ميكند بطوريكه شما هنوز به آســاني نميتوانيـد بگوييـد كـه چـه

LODSB اتفاقي ميافتد. اما بايد حدس زده باشيد كه يك اتفاقات مشكوكي رخ ميدهد . نگاهي به فراخوانــي روتيـن

قبليتان بيندازيد.

شما در آنجا دو پرش داشتيد.

RET ــد كـه يكي JZ ret كه pusha و popa هاي زيادي را رها مي كند. و ديگري JAE بعد از RET ميباش

قبلي را نمي گيرد . اگر به برخي چيزها در اينجا بخنديد، كار درستي كردهايد. JZ اولـي nag screen را راه انـدازي

ميكند و دومي يني JAE هم همان كار را انجام ميدهد (يعني در اينجا، طبق معمول،افزونگي وجود دارد. يعني احتمال

زيادي براي غير فعال كردن يك حفاظت وجود دارد). حاال فهميديد.

شما ميتوانيد به راههاي مختف اين حفاظت را غيرفعال كنيد. دو تا از سادهترينها در زير آمده :

(JMP RET بهر طريق) EB16 به يك (JZ ret) 7416 ١) تبديل

(JAE RET)7306 در يك (JAE RET بعد از) ٢) تبديل 7307

ــون ايـن يـك هنوز تمام نشده : اگر شما سعي كنيد اين قسمت كد را تغيير دهيد، شما روز خوشي نخواهيد ديد. چ

SMC يعني كدي كه خودش خودش را تغيير ميدهد، ميباشد. از بخش ديگر كد، بارگذاري مي شود. (و در اينجــا

بدون هيچگونه رمزگذاري خواهد بود). پس شما قبل از هر كــاري بـايد يـك break point روي محـدودهاي از

dump را پيدا كنيد؛ ناحيه واقعي را پيدا كنيد؛ آن قسمت از حافظــه را LODSW حافظه داشته باشيد؛ روتين

ــاال بيـاييد سـريع كـراك كنيد؛ بدنبال يكسري كدهاي dead بگرديد و در نهايت برنامه dead را اصالح كنيد. ح

كنيم :

----------------------------------------------------------

CRACKING MEM.EXE (version 2) (by +ORC, January 1996)

ren map.exe map.ded

symdeb map.ded

- s (cs+0000):0 Lffff 74 16 50 53 51 52 57

xxxx:yyyy <- this is the debugger's answer

- e xxxx:yyyy EB

- w

Page 72: آغازی برای کراکینگ

- q

ren map.ded map.exe

-------------------------------------------------

حاال شما اينكار را انجام داديد. Nigel كراك شد.

Page 73: آغازی برای کراکینگ

درس ٥

دسترسي به ديسك و سي دي رام (مفاهيم)

ــازه دهيـد آنـها را در اگر قرار است باي پسها (برنامههاي بار كننده) را در اين آموزش بگنجانم، اج

اينجـا قـرار دهـــم،آمــاده كــردن يــك بــار كننــده بــراي پشــت ســر گذاشــتن محــافظت

[Mario Andre] گاهي اوقات به منظور نفوذ به يك محافظت خاص از بردارها استفاده ميشود. در

اين موارد يك روش خوب، آمادهسازي يك برنامه بار كننده است. اين نوع كراك كردن ميتواند در

ــورد اينترنت (روي برخي پيكربندهاي fire wall (يا ديواره آتش) كه در درس ٩ توضيح داده شد م

استفاده قرار گيرد.

ــم، يـك بـازي احمقانـه كـه در آن از براي مثال اجازه دهيد «مسابقه ماريو اندرتي» را در نظر بگيري

همان طرح محافظتي كه شما امروز روي برخي روتينهاي دسترسي به سرورهاي نظامي ميبينيد.

استفاده ميشود. براي اين منظور شما بايد باركنندهاي روي خطوط ذيل آماده كنيد.

loc code instruction what's going on

-------------------------------------------------------

:0100 EB44 JMP 0146

Page 74: آغازی برای کراکینگ

...

:0142 0000 <- storing for offset of INT_21�

:0144 5887 <- storing for segment of INT_21

:0146 FA CLI

:0147 0E PUSH CS

:0148 1F POP DS

:0149 BCB403 MOV SP,03B4

:014C FB STI

:014D 8C1EA901 MOV [01A9],DS <- save DS

:0151 8C1EAD01 MOV [01AD],DS three

:0155 8C1EB101 MOV [01B1],DS times

:0159 B82135 MOV AX,3521 <- get INT_21

:015C CD21 INT 21 in ES:BX

:015E 891E4201 MOV [0142],BX <- store offset

:0162 8C064401 MOV [0144],ES <- store segment

:0166 BA0201 MOV DX,0102

:0169 B82125 MOV AX,2521 <- set INT_21 to

:016C CD21 INT 21 DS:0102

:016E 0E PUSH CS

:016F 07 POP ES <- ES= current CS

Page 75: آغازی برای کراکینگ

:0170 BBB403 MOV BX,03B4

:0173 83C30F ADD BX,+0F

:0176 B104 MOV CL,04

:0178 D3EB SHR BX,CL <- BX= 3C

:017A B8004A MOV AX,4A00 <- Modify memory block

:017D CD21 INT 21 to 3C paragraphs

:017F BA9E01 MOV DX,019E <- ds:dx=program name

:0182 BBA501 MOV BX,01A5 <- es:bx = param. block

:0185 B8004B MOV AX,4B00 <- load ma.com

:0188 CD21 INT 21

:018A 2E8B164201 MOV DX,CS:[0142] <- reset old int_21

:018F 2E8E1E4401 MOV DS,CS:[0144]

:0194 B82125 MOV AX,2521

:0197 CD21 INT 21

:0199 B8004C MOV AX,4C00 <- terminate with return

:019C CD21 INT 21 code

:019E 6D612E636F6D00 "ma.com"

0000 fence

:01A7 B2015887

:01AB B2015887

:O1AF B2015887

Page 76: آغازی برای کراکینگ

0000 fence

let's now prepare a routine that hooks INT_21:

push all

CMP AX,2500 <- go on if INT_21 service 25

JNZ ret

CMP Word Ptr [0065], C00B <- go on if location 65 = C00B

JNZ ret

MOV Byte Ptr [0060], EB <- crack instructions

MOV Byte Ptr [0061], 3C

MOV Byte Ptr [0062], 40 <- INC AX

MOV Byte Ptr [0063], 90 <- NOP

MOV Byte Ptr [0064], 48 <- DEC AX

pop all

JMP FAR CS:[0142] <- JMP previous INT_21

از حاال به بعد، هربار كه يك برنامه در آدرس [0065]، شامل يك دستور OR AX, AX (كـه در

ــود. ma.com قرار دارد) وقفه ٢١ را فراخواني ميكند يك بردار بدام افتاده ميشود (يا hook) ميش

ــش در آن صورت برنامه مقصد در آدرس [0060] قرار خواهد داشت. دستور JMP 3C كار را به پي

ــه آن برنامـه، داراي روتنيـهايي اسـت كـه توانـايي چـك كـردن خواهد برد. عليرغم اين واقعيت ك

خودشان را به منظور اطمينان از عدم هرگونه تغييري خواهند داشت.

Page 77: آغازی برای کراکینگ

ــگري) از سـرويس مهمترين چيز، روتينهايي است كه شما براي فراخواني وقفه 21 (يا هر وقفه دي

ــگر را ٢٥ (يا هر سرويس ديگري) به منظور كراك كردن و تخريب برنامه مينويسيد. من يكي دي

به شما نشان خواهم داد. اين يكي Reach. Com ناميده ميشود.

push all

CMP AH,3D <- is it service 3D? (open file)

JNZ ret <- no, so ret

CMP DX,13CE <- you wanna open file at 13CE?

JNZ ret <- no, so ret

MOV AX,[BP+04] <- in this case

MOV DS,AX

CMP Byte Ptr [B6DA],74 <- old instructions

JNZ 015B

CMP Byte Ptr [B6DB],0F <- ditto

JNZ 015B

CMP Byte Ptr [B6DC],80 <- ditto, now we now where we are�

JNZ 015B

MOV Byte Ptr [B6DA],EB <- crack

MOV Byte Ptr [B697],40 <- camouflaged no-opping

MOV Byte Ptr [B698],48 <- cam nop

MOV Byte Ptr [B699],90 <- cam nop

Page 78: آغازی برای کراکینگ

MOV Byte Ptr [B69A],40 <- cam nop

MOV Byte Ptr [B69B],48 <- cam nop

MOV DX,CS:[0165]

MOV DS,CS:[0167]

MOV AX,2521 <- set hook

INT 21

POP all

JMP FAR CS:[0165]

B697-B69B را تغيـير داده و دسـتورالعمها را در EB0f 740 در دسـتورf ــما دسـتورالعمل حاال ش

noop خواهيد كرد. خوب اه دقيقتر از noop كردن آنها با «٩٠» بايت، اينست كه به جاي آن، توالي

working را انتخاب كنيد! استفاده از توالي دســتورهاي Dec Ax, Inc Ax, Nop, Dec Ax,Inc Ax

به جاي ”NOP“ داليل منطقي دارد . طرحهاي محافظت اخير، nopهاي متصــل بـه يكـديگر را در

ــي بيـابند,همـه چـيز را داخل برنامه ميفهمد. و در صورتيكه اين طرحها، بيشتر از سه تا NOP متوال

خراب ميكنند! شما هم همواره بايد سعي كنيد تا هنگام كراك كردن، راه حل ايجاد كننده مزاحمت

كمتر و مخفيتر را انتخاب كنيد!

همچنين ميتوانيد، اين نوع كراك كردن را، با خطوط يكجور، براي برنامههاي زيادي بكار ببريد كــه

خودشان، عمل كراك كردن كد را اجام داده و بردارها را بدام مياندازند.

روش اصلي دسترسي ديسك

حال به سراغ موضوع اصلي اين درس ميرويم:

Page 79: آغازی برای کراکینگ

ــال طبق معمول از اول شروع ميكنيم. تاريخ همواره كليدي است كه فهم موضوعات كراكينگ در ح

ــرار و آينده را امكانپذير ميسازد. از زمانيكه ديسكهاي فالپي سياه با قطر 1/4 5 اينچ مورد استفاده ق

گرفتند، يكي از رايجترين متدها براي حفاظت يك برنامه، فرمت كردن ديسك اصلي (كليــدي) بـه

روشي غيرعادي بود. اين فالپي قديمــي بـراي PC(كامپيوترهـاي شـخصي) معمـوالً در ٩ سـكتور

(قطاع) در هر شيار، 360k داده ذخيره ميكرد.

براي برخي از شما كه يك سري چيزها را نميدانيد، به منظور اجتناب از اين نوع كراك كــردن الزم

است دو چيز اساسي را بدانيد.

بلوك پارامتر ديسك فالپي (FDPB) و روتينهاي وقفهاي كه به فرمت كردن يا خواندن ديســك (در

اصل وقفه ١٣) ميپرازند ,اغلب طرحهاي حفاظتي، يا عمل فرمت را با سايز سكتور يا تراكي بيش از

ــا اينكـه بـه يكـي از سـكتورها پـهناي ٢١١ بـايت حد استاندارد (يعني ٥١٢ بايت) انجام ميدهند، ي

ميدهد.يا اينكه تراك كامل از سكتورهاي 15/9/8 را فرمت نميكند.

مثالً اگر همان نسخه خيلي قديمي برنامه اصلي ويزي كالك (Visicalc) را داشته باشــيد، خواهيـد

ــتفاده ديد كه سكتور يا قطاع ٨ روي شيار ٣٩ كامالً از بين رفته است. تحقيق در مورد اسمبلي يا اس

ــب بـايت، تغيـير داده اختصاصي به شما ميگويد كه كداميك از شماره سكتورها، سايز آنها بر حس

شدهاند و آيا با خطاي CRC فرمت شدهاند.

ــوند. بـردار وقفـه 1E شـامل آدرس بلـوك پـارامتر پارامترهاي ديسك فالپي در BIOS ذخيره ميش

ديسك فالپي است. محتواي اصلي FDPD عبارت است از :

Offset Function crackworthy? Example

0 Step rate & head unload no DF

1 head load time no 02

Page 80: آغازی برای کراکینگ

2 Motor on delay no 25

3 Number of bytes per sector yes 02

4 Last sector number yes 12

5 Gap length yes 1B

6 Data track length yes FF

7 Format gap length yes 54

8 Format byte no F6

9 Head settle time no 0F

A Motor start time no 02

٠) افست nybble” : #0“ سمت چپ (يك رقمي) ايــن عـدد، زمـان سـرعت عمـل هـدگرداننـده

ديسك ميباشد. ”nybble“ سمت راست، زمان تخليه بار هدديسك است. ارقام سمت چپ بهترند.

١) افست 1# : مجددًا با اين مقادير وقت خود را تلف نكنيد . nybble سمت چپ زمان بارگذاري

هد ديسك و nybble سمت راست. انتخاب مد دستيابي مستقيم به حافظه است.

٢) زمان انتظار تا زمانيكه موتور خاموش شود، كه معموالً استفاده چنداني ندارد.

٣) مقدار بايتها در هر سكتور : اگر براي اين مقدار «صفر» را در نظر بگيريد، PC انتظــار دارد كـه

ــي تمام سكتورها ١٢٨ بايت طول داشته باشند. عدد ١ يعني اندازه سكتور. ٢٥٦ بايت است. «٢» يعن

اندازه سكتورهاي ٥١٢ بايت (اندازه استاندارد DOS) و «٣» يعني، ١٠٢٤ بايت در هر سكتور

٤) بيشترين عدد سكتور روي شيار: اين عدد براي فرمت كردن استفاده ميشود و به DOS ميگويد

كه در هر شيار چند تا سكتور وجود دارد.

Page 81: آغازی برای کراکینگ

ــراي خوانـدن ديسـك : وقتـي كـه سـعي ميكنيـد تـا سـكتور داراي انـدازه غـير ٥) طول شكاف ب

ــه وقـت خـود را بيخـود تلـف استانداردي را بخوانيد، دچار خطاهاي CRC ميشود و اينجاست ك

ميكنيد. شما ميتوانيد فرمت كردن را با وسيله U-format انجام دهيد، در غير اين صورت از اينكار

صرف نظر كنيد.

٦) طول داده: طول داده شامل تعداد بايتها در يك سكتور است، البته در صورتيكه شــماره بـايت در

جدول 4#، 2,1,0 يا ٣ نباشد.

٧) شماره بايتها در شكاف بين سكتورها: اين هم زماني اســتفاده ميشـود كـه شـيارهاي خـاصي را

فرمت ميكنيد.

ــايتي اسـت كـه در تمـام سـكتورهاي ٨) اولين بايت فرمت: هنگام فرمت كردن، اين همان اولين ب

جديد قرار داده ميشود.

٩) زمان استقرار هد: كه چندان مهم نيست.

A) زمان استارت موتور: چندان روي اين موضوع هم زوم نكنيد.

ــيار شـما به منظور تغيير تعداد شيارها روي يك ديسك مشخص و تعداد شماره سكتورها در هر ش

ميتوانيد هميشه با سوئيچ فرمان t:” DOS/ و :n/ ” فرمت كنيد.

Format /t:track /n:sector

ــا [symdeb.exe] را اجـرا كنيـد و اگر مايليد ببينيد كه پارامترهاي موجود كدامند [Debug-exe] ي

فرمانهاي زيرا را بدهيد:

- d 0:78 l 4 <- get FDPB address

0000:0070 22 05 00 <- debugger's likely response

- d 0:522 l a <- get 10 FDPB values

0000:520 DF 02 25 02 12 1B FF... <- see preceding table

Page 82: آغازی برای کراکینگ

ــكتور داراي سـايز ٥١٢ بخاطر داشته باشيد كه تمام فرمت ديسك استاندارد،تحت سيستم DOS، س

بايتي را ساپورت (حمايت) ميكند. بدين ترتيب اندازه ســكتور بـراي فـالپيـهاي يـك طرفـه ٥/٢٥

اينچي:

40t*8s*512b=163.840 bytes (160Kb)

40t*9s*512b=184.320 bytes (180Kb)

و براي فالپيهاي دو طرفه ٥/٢٥ اينچي:

40t*8s*512b*2sides=327.680 bytes (320Kb)

40t*9s*512b*2sides=368.640 bytes (360Kb)

پس اگر با مدل ٣/٠ dos شروع كنيم، به فرمت كردن ديسك فالپي جديد كمك كردهايم.

ــت كـه در IBM AT(80286 cpu) ، معرف ظرفيت بسيار باالي ديسك فالپي با قطر ٥/٢٥ اينچ اس

١٥ سكتور در هر شيار، ١/٢ مگابايت ذخيره ميكند.

80t*15s*512b*2sides=1.228.800 bytes (1.2Mb)

ــوچكـي بعدها فالپيهاي ٣/٥ اينچي مورد استفاده قرار گرفتند كه در كاست پالستيكي سفت و ك

قرار داشتند:

720 k ٣/٥ اينچ دوطرفه/ دانسيته دو برابر

1440k (HD) ٣/٥ اينچ دو طرفه / دانسيته چهاربرابر

2880 k ٣/٥ اينچ دو طرفه/ دانسيته باال

Page 83: آغازی برای کراکینگ

ــرويس به منظور ايجاد طرحهاي كلي خارق العاده. حمايت گرايان (محافظهكارها) از وقفه 13h، س

ــداد شـيار و شـماره سـكتور در هـر شـيار را 18h استفاده كنند كه براي روتينهاي فرمت سازي، تع

مشخص ميكند.

ــر شـيار;DL=شـماره * ثبت كننده هاي ورودي : CH=N0 ; AH=18h شيارها ; CL سكتورهاي ه

درايوها C=2..., B=1,A=0 ... بيت ٧ در صورتيكه استفاده ميشود كه درايو مربوط به هارد ديسك

باشد)

ــت ازجـدول پـارامتر ١١ بيتـي ;ES=ادرس قطعـه از * ثبت كننده ها دربر گشت : DI=ادرس افس

جدول پارامتر ١١ بيتي.

براي اينكه آنها را بخوانيم، بايد از وقفه ١٣ (INT 13)، ســرويس ٢، اسـتفاده نمـوده و سـكتورهاي

ديسك رادر طرح ذيل بخوانيم:

* ثبت كنندههاي ورودي: AL=N0, AH=2h سكتورها ؛ BX = آدرس افست بافر داده؛

CH = شيار، CL = سكتور،DH شماره هد، DL= شماره درايو ؛ ES= آدرس قطعه بافر داده .

(carry flag is notكد برگشت. اگر پرچم يا نشان رقي نقلي = AH :ثبت كنندهها در برگشت *

(set قرار داده نشود. AH=0 بنابراين ســكتور خـارق العـاده خوانـده ميشـود و اگر پـرچـم رقـم

ــايت وضعيـت را بصـورت ذيـل گزارش نقلي(carry flag is set) بر عكس قرار داده شود، AH ب

ميكند.

76543210 HEX DEC Meaning

1 80h 128 Time out - drive crazy

1 40h 064 Seek failure, could not move to track

1 20h 032 Controller kaputt

Page 84: آغازی برای کراکینگ

1 10h 016 Bad CRC on disk read

1 09h 009 DMA error - 64K boundary crossed

1 08h 008 DMA overrun

1 04h 004 Bad sector - sector not found

11 03h 003 Write protect!

1 02h 002 Bad sector ID (address mark

1 01h 001 Bad command

[Return code AH=9: DMA boundary error]

يكي از خطاهايي كه ممكن است ايجاد شود و در برخي طرحهاي محافظت استفاده شود:

يكي از خطاها: خطاهاي مرزي DMA است(ah=9)، يعني يك مرز غيرقانوني، هنگاميكه اطالعات

درون RAM ريخته ميشوند از آنجا رد شــود. DMA (دسـتيابي مسـتقيم بـه حافظـه) در روتينـهاي

سرويس ديسك مورد استفاده قرار ميگيــرد تـا اطالعـات درون RAM ريختـه شـود. اگر آدرس

ــرار افست حافظه كه در پايان به ٣ تا صفر ختم ميشود (Es:1000, Es:2000)، در وسط ناحيهاي ق

گيرد كه توسط يك سكتور، جايگذاري شود، اين خطا بوجود ميآيد (رخ ميدهد) .

ديگر وقفه حفاظتي ممكن، وقفه 13h، سرويس ٤، است بازبيني سكتورهاي ديسك است.

بازبيني ديسك، روي ديسك انجام شــده و نيـازي بـه بـازبيني دادههـاي روي ديسـك، بـر خـالف

دادههاي موجود در حافظه، شيت! اين عمل،هيچ ويژگي بافري ندارد، و يك ديسك را نه ميخوانـد

و نه مينويسد:

Page 85: آغازی برای کراکینگ

ــكتورهاي انتخـاب شـده را بخوانـد و اين باعث ميشود تا سيستم دادههاي موجود در سكتور يا س

عليرغم كنترل دادههاي ذخيره شده روي ديسك، بررسي توازن چرخهاي محاسبه شده را كنترل كند

(CRC) . به وقفه 13، ثبات هاي AH=2 و گزارش خطا، توجه كنيد.

CRC، جمع ارقام يا بيتهاست كه خطاهاي يكي را مشخص ميكند. وقتيكه سكتوري روي ديســك

ــاي سـكتور نوشـته ميشـود. سـرويس نوشته ميشود، CRC اصلي. محاسبه شده و همراه با دادهه

ــه بازبيني، سكتور را ميخواند، مجددًا CRC را محاسبه نموده و اين CRC، را با CRC اصلي مقايس

ميكند .

ــا فراخوانيـهاي وقفـه تغيـير يـابد. ايـن امـر ديديم كه در برخي از طرحهاي محافظت، سعي شده ت

بخصوص در طرحهاي حفاظتي دستيابي ديســك كـه در آنـها از وقفـه ١٣ اسـتفاده ميشـود بسـيار

معمول است. اگر سعي ميكنيد تا چنين برنامههايي را كراك كنيد، مسير عمل، سرچ كردن در مورد

ــراي وقفـه ١٣ ميباشـد. در روش ديـگر، طـرح رخدادهاي ”CD13“ است كه همانا زبان ماشين ب

محافظت، از اين وقفه براي كنترل سكتورهاي مخصــوص ديسـك اسـتفاده ميكنـد. اگر برنامـه را

بررسي كــرده باشـيد، برنامـههايي را خواهيـد ديـد كـه در كدماشينشـان، CD١٣ وجـود دارد، امـا

ــاطر سـكتورهاي غيرعـاديش، كنـترل ميكنـد، امـا برنامههايي وجود دارد كه ديسك اصلي را به خ

چگونه؟

تكنيكهاي مختلفي وجود دارد كه ميتوان از آنها براي مخفي نمودن طرح محــافظت اسـتفاده نمـود.

حال ٣ تا از تكنيكهاي معروفتر را برايتان توضيح ميدهم:

١) بخش كد ذيل، برابر است با صدور فرمان INT 13 براي خواندن يك سكتور از درايو A، طـرف

.10h و سپس كنترل كد وضعيت ،ffh 29، سكتورh 0، شيار

cs:1000 MOV AH,02 ;read operation

Page 86: آغازی برای کراکینگ

cs:1002 MOV AL,01 ;1 sector to read

cs:1004 MOV CH,29 ;track 29h

cs:1006 MOV CL,FF ;sector ffh

cs:1008 MOV DX,0000 ;side 0, drive A

cs:100B XOR BX,BX ;move 0...

cs:100D MOV DS,BX ;...to DS register

cs:100F PUSHF ;pusha flags

cs:1010 PUSH CS ;pusha CX

cs:1011 CALL 1100 ;push address for next

instruction onto stack and branch

cs:1014 COMP AH,10 ;check CRC error

cs:1017 ... rest of verification code

...

...

cs:1100 PUSHF ;pusha flags

cs:1101 MOV BX,004C ;address of INT_13 vector

cs:1104 PUSH [BX+02] ;push CS of INT_13 routine

cs:1107 PUSH [BX] ;push IP of INT_13 routine

cs:1109 IRET ;pop IP,CS and flags

Page 87: آغازی برای کراکینگ

دقت كنيد در كد منبع، هيچ فرمان INT 13 وجود ندارد، پس اگر براي ســرچ كـردن ”CD13“ در

كد ماشين از يك عيبياب (اشكال زدا) استفاده ميكنيد، هرگز روتين محــافظت را پيـدا نخواهيـد

كرد.

ــه ١٠، كـه تـا حـدي، ٢) تكنيك ديگر، قرار دادن در دستورالعمل جايگزيني وقفه است. مثل وقف

بي ضرر بوده و برنامه اي وجود دارد كه ١٠ را به ١٣ تغيير ميدهد. (و سپس به ١٠ برمــيگردانـد).

سرچ كردن يا جستجوي ”CD13“ نتيجهاي نخواهد داشت.

٣) بهترين روش استتار (اختفاء) براي وقفههايي كه من كراك ميكردم، (البته نه در INT13) پــرش

به بخش كد برنامه (پروگرام) بوده كه كد وقفه را مجددًا ايجاد ميكند.

بارگذاري سكتورهاي كامل ديسك

ــير ابـزار قديمـي [debug.com] «چـاقوي ارتـش سـوئيس» كراكـر نـاميده ميشـود. چيزهـايي نظ

بارگذاري،خواندن، اصالح و بازنويسي ســكتورهاي كـامل ديسـكها را ممكـن ميسـازد. شـمارش

سكتور با اولين سكتور شيار صفر شروع ميشود. سكتور بعدي شــيار صفـر اسـت. اگر دو طرفـه

باشد به طرف اول، شيار ١ برميگردد. الي آخر . تا پايان ديسك، تا بيش از 80h (128) را مي توان

ــارگذاري كـرد. در يك زمان بارگذاري كرد . براي استفاده، هر بار ميتوان بيش از 80h سكتور را ب

براي استفاده شما بايد آدرس شروع، درايو (٠(A , 1=B, etc=سكتور شروع و شــماره سـكتورها را

20 10 0 100 1 -مشخص كنيد.

ــروع در DS: 0100. درايـو اين دستورالعمل، به DEBUG ،ميگويد كه بارگذاري كند. آدرس ش

شروع A، سكتور 10h براي سكتورهاي 20h خواهد بود. اين عمل بازيــابي دادههـاي فرمـت شـده

ــوط بـه آن داده را مخفي يا عجيب و غريب را امكانپذير ميسازد. اگر خطا كرديد، محل حافظه مرب

Page 88: آغازی برای کراکینگ

پيدا كنيد. اكثر اوقات، بخشي از داده قبل از وقوع خطا، انتقال داده و باقيمانده آن را ميتــوان از روي

فهرست راهنما، مجددًا ثبت يا جمع آوري كرد.

ــه اوليـه و قديمـي را يادگيري كراكهاي ذيل را همواره به خاطر بسپاريد. حال ميخواهيم،يك برنام

كراك كنيم:

شبيه ساز يا سيميالتور MS flight (مدل قديمي 2/12 سال ١٩٨٥).

اين برنامه قديمي استفاده شده در سال ١٩٨٥، طرح محافظتي زيباي ذيل را الگو قرار ميدهد. روي

ديس، فقط يك stub بنام FS.com داريد كه دستورالعملهاي زير را اجرا ميكند:

loc code instruction what's going on

-------------------------------------------------------

:0100 FA CLI ;why not?

:0101 33C0 XOR AX,AX ;ax=0

:0103 8ED0 MOV SS,AX ;ss=0

:0105 BCB0C0 MOV SP,C0B0 ;SP=C0B0

:0108 8EC0 MOV ES,AX ;ES=0

:010A 26C70678003001 MOV Wptr ES:[0078],0130 ;Wp 0:78=130

:0111 268C0E7A00 MOV ES:[007A],CS ;0:7A=Segment

:0116 BB0010 MOV BX,1000 ;BX=1000

:0119 8EC3 MOV ES,BX ;ES=1000

:011B 33DB XOR BX,BX ;BX=0

:011D B80102 MOV AX,0201 ;AH=2 AL=1 sector

:0120 BA0000 MOV DX,0000 ;head=0 drive=0

:0123 B96501 MOV CX,0165 ;track=1 sector=65 (!)

:0126 CD13 INT 13 ;INT 13/AH=2

:0128 B83412 MOV AX,1234 ;AX=1234

:012B EA00000010 JMP 1000:0000 ;JMP to data we just read

:0130 CF IRET ;Pavlovian, useless ret

Page 89: آغازی برای کراکینگ

ــاقي كـه در ميتوانيد حدس بزنيد كه در اين طرح محافظت قديمي چه اتفاقي افتاده است؟ همان اتف

بيشتر طرحهاي امروزي ميافتد:

ــاص بـراي شـما، جستجوي حفاظت براي سكتور فرمت شده غيرعادي و يا جستجوي دادههاي خ

چندان مشكل نيست:فقط بايد هرچيزي را بر عكس كنيد، دادههاي عجيب و غريب را به هم وصــل

نموده و باالخره معجوني كه دوست داريد، توضيحات بيشتر در مورد طرحهاي قديمي محافظت، از

آنها بسادگي نگذريد. برخي از آنها عبارتند از :

-- CLEVER

-- STILL USED

-- DIFFICULT TO CRACK... I mean, this older DOS programs had

ــه برنامـههاي قديمـي ترسـيم DOS حفاظتـهاي خوبـي داشـتهاند. كـراك كـردن منظورم اينست ك

برنامههاي ويندوز كه نياز به شماره ثبت دارد، تا حدي آزاردهنده اســت : همـانطور كـه در درس ٣

مالحظه كرديد، شما بايد نام و شماره سريال انتخاب خود را، كه عبارت است از ”666666666“ را

ــام خودتـان را سـرچ تايپ كنيد. آن را وارد برنامه WINICEكنيد، سرچ كنيد و براي ارزيابي بهتر،ن

كنيد، نقطه توقف خواندن حافظه را جايي مشخص كنيد كه شماره مورد نظر در آنجا وجــود داشـته

و بدنبال كدي بگرديد كه ورودي شما را دستكاري ميكند. همانگونه كه [Chris] بدرستي اشــاره

ميكند، شما ميتوانيد، كد را مستقيماً از برنامه بيرون كشيده (خارج نموده) و ژنراتور (مولد) كليــدي

ايجاد كنيد كه كد معتبري ايجاد كند. اين كدبراي هر نامي كه شما در طرحهاي حفاظت «دســتكاري

ــر نـامي كـه شـما در آن تـايپ رياضيات مطلق» تايپ ميكنيد كار خواهد كرد و يا متقابالً پس از ه

ــه درسـهاي وينـدوز مراجعـه كنيـد). كنيد، طرحهاي حفاظت «دستكاري بسته» (مانند mod4win ب

طرحهاي خاصي خواهند بود . در چنين وضعيتي pseudo-random xoring (شبه تصادفي)

Page 90: آغازی برای کراکینگ

Stunning: ايده هاي جديد هميشه به ندرت به وقوع ميپيوندند، و در اين دنياي رنجش آور كند و

آهسته، نادرتر و كميابتر هم ميشوند، برنامه نويسان ناتوان، با برنامه هاي ناقصي مثل ويندوز ٩٥ ازما حمايت ميكنند. ... بله، مثل هميشه، با نظر كامالً مخالف ميگويم، كه هيچ پيشرفتي وجود ندارد.

يك قدم به عقب برگرديم.ــه فقـط قطعـات يـخ:، مـارتيني دراي، يك مارتيني ـ و ودكاي خوب بنوشيد (بخاطر داشته باشيد كWodka Moskovskaja «تونيـك هنـدي» Schweppes ــون سـبز از و طعم ليمويTuskany، زيتمالتي.اين نوشيدني را كامل خواهند كرد) و با چشماني پاك، از بالكن منزل خود، به تماشاي شهر ومردم اطراف خود بپردازيد. كارگرها كه همه جا ساعت ٧/٥ صبــح از خانـه بـيرون مـي آينـد، و درـز تصاعدي از ماشينهاي يكجور گم شده اند، مجبورند تا ساعتها تابلو آگهيها را تماشا كنند و يك ريبه جار و جنجالهاي آنها براي تبليغات گوش كنند، در طول روز، به خاطر رفتن سر كار خوشــحالندــگ متفـاوت به منظور اينكه ماشينهاي ديگري توليد كنند، تا بتوانند روزي ماشين جديدي با يك رنبخرند (البته اگر شانس كار كردن در اين اجتماع غيرمنصفانه را داشته باشند). چرا مردم نسبت به ستارهها بي توجهند، همديگر را دوست ندارند، باد را حــس نميكننـد، رفـت وــه خـود آمد ماشينها را از محل زندگي و تغذيه خود حذف نميكنند، و به رنگها بي اعتنايند... چرا ب

برچسب بي مصرف ميزنند؟ چرا شعر نميخوانند؟ هيچ احساس شاعرانهاي در اجتماع يكنواخت و خسته كننده كارگران تبليغاتي وجود ندارد...

احساس شاعرانه بزودي قدغن خواهد شد، چون نميتوانيد وقت خود را صرف خواندن اشعار كنيد،

ــيزي اسـت كـه و در نمايش مضحك چنين جامعهاي، در صرف وقت، محدويت داريد، اين تنها چ

ــي را گم كـردهام، آنها از شما ميخواهند انجام دهيد... پسرم،امروز، من جاي برخي از بمبهاي نوترون

ــازد و تنـها كتابـهاي اصيـل و ودكـاي بمبهايي كه تمام اين آدمهاي ماشيني بي مصرف را نابود ميس

ــام دست نخورده را جا ميگذارد. پس نميتوان به دموكراسي اعتقاد داشت... اگر من رأي دادهام.... تم

ــفانه، چنيـن كـاري را ميكننـد و بـه «ظاهرهـاي متبسـم» رأي آدمهاي ماشيني بي مصرف هم، متأس

ميدهند، «به افراد ابلهي كه قديمي فكر ميكنند، و همانگونه كه واقعًاهستند عمل ميكنند، و نسبت بـه

ــي بـي اهميـت و كوتـه فكرانـه اي هيچ چيزي بي تفاوت نيستند، به جز حس مسئوليت و از الگوي

Page 91: آغازی برای کراکینگ

ــها حمايت ميكنند. كارگران،افرادي را انتخاب ميكنند كه در تلويزيون ديده اند... همانگونه كه مصري

به فرعون هايشان رأي ميدادند كه در زير شالقهاي تبليغاتي به وجد ميآمدند.