با سلام
اين مبحث يه مقداري پيشرفته است و ممكنه كه دوستان نو اموز درست اون رو درك نكنند ( مثل خود من) پس اگه چيزي رو درست نفهميدين مشكل از منه بپرسين تا اگه ميدونستم ( چون منم مثل شما نو آموز هستم ) بگم
چنتا تاپيك بود در مورد اينكه چه طوري بتونيم يك فايل ocx و يا dll رو كه پك شده و يا قفل توسط اون چك ميشه رو مورد بررسي قرار داد
براي اين كار به لوازم زير نيازمنديم
- ProcDump32 v162 و يا ورژنهاي ديگش
- 0.93 PEiD يا ورژنهاي ديگش
- ImportREC v 1.6 يا ورژنهاي ديگش
-Hex Workshop با ورژن 2 به بالا يا برنامه هاي hex editor هاي مشابه ( ولي ترجيحا همين برنامه )
برنامه اي كه روش كار ميكنيم يه برنامه است كه با وي بي نوشتم و دو تا فايل داره
test.ocx و testocx.exe
خوب اول مثل هميشه مقدار تئوري در مورد اين مطلب از خودم در وكنم ( البته كامل نيست)
هر فايل pe يا Portable exe مثل فايلهاي exe . فايلهايdll . فايلهاي ocx و فايلهاي vbx كه تحت ويندوز اجرا ميشن حتي اونايي كه تحت لينوكس اجرا ميشن داراي يه قسمت هدر هستن .
هر هدري داراي اطلاعاتي است كه براي اجرا شدن فايل اجرايي توسط سيستم عامل . سيستم عامل به اون اطلاعت نيازمند است. خوب اين اطلاعات چيه؟
هر فايل اجرايي كه توسط ويندوز اجرا ميشه توسط يه لودر بار ميشه . ابتدا لودر چك ميكنه كه ايا هدر درست است يا نه بعد سيستم عامل يه ماشين مجازي با 4 گيگ ( 32 بيتي ) حافظه ميسازه و لودر بر اساس اطلاعات توي هدر فايل رو توي حافظه لود ميكنه
اين اطلاعت شمال تعداد سكشن ها ( هر قسمت كه داراي اعضايي است كه همگي داراي يكسري مشخصات عمومي است مثل ديتا - كد - استرينگها و جدول وردويها Import Address Tableيا iat) مقدار فضاي كه هر سكشن روي هارد ميگيره و همچنين توي مموري بهش نياز داره و محل شروع و اتمام اون روي هارد و محل شروع و اتمام اون توي حافظه و.... ميباشه .
خوب حالا وقتي لودر اختيار اين ماشين مجازي رو به دست برنامه ميده برنامه بايد از كجا شروع كنه
اينجا يكي ديگه از اطلاعات هدر به كمك لودر مياد يعني محل شروع يا entry point كه مابهش ep ميگيم . دونوع ادرس براي ep وجود داره مجازي ( يا محل شروع اون توي حافظه ) و واقعي كه محل شروع كد رو روي هارد ميگه .
خوب يه برنامه پكر چيكار ميكنه ؟
هيچي مياد هر سكشن رو تغيير ميده و بعد كد يا كمپرس كرده و روي هارد ذخيره ميكنه .
وقتي برنامه اجرا ميشه و لودر ويندوز همه كارها رو كرد و اختيار ماشين مجازي رو بدست برنامه داد . ابتدا لودر پكدر اجرا ميشه وهمه چيز رو از حالت كد شده در مياره و درست در محل هاي خودش قرار داه و بعد با پرش به ep برنامه اصلي اختيار رو بدست برنامه ما ميده .
راستي هنگامي كه يه برنامه تحت ويندوز نوشته بشه احتياج داره كه از يكسري از كتابخانه هاي ويندوز استفاده كنه ولي چه طوري ؟
خوب هنگامي كه لودر ويندوز برنامه مارو لود كرد مياد و سري به iat ميزنه و ميبينه كه چه تابع هاي لود شدن مياد و بر اساس اون تابعها ( برنامه هاي لود شده قبلي مثل كرنل و يا لود شده توسط لودر مثل dll هاي مورد نياز برنامه) پرشها و كالها رو بصورت ويرچوال يا مجازي ( يعني روي هارد اين ادرسها موجود نيستند) ادرس دهي ميكنه و برنامه رو قادر ميسازه كه از اين ادرسها استفاده كنن .
نكته : ماشين مجازي توي حلقه 3 كار ميكنه مثل كرنل و يا يوزر !!!!!!!!!!
اطلاعات پايه در زمينه انپك كردن رو بدست اورديم براي بدست اوردن نحوه كار بصورت دقيق مي تونيد به مقاله هاي كه در زمينه ساختار pe وجود داره ( منتشر شده توسط مايكروسافت ) يا ديگر منابع رجوع كرد.
توي اين مبحث بايد از قسمتهاي كه كار انپك كردن رو انجام ميدن بگذريم و هنگامي كه فايل انپك شد اون رو روي هارد ذخيره كنيم .
خوب ما ميخوايم برنامه اي رو ان پك كنيم روش كار به اين صورت كه ابتدا بايد eop برنامه رو بدست بياريم
نكته : حتي فايل هاي dll و... كه توي بالا ذكر كردم و به تنهايي نميتونيم اون ها رو اجرا كنيم و حتما بايد يه فايل exe اونها رو كال كنه هم محل شروع كد دارن كه يكسري از متغيرهاي عمومي و در صورت لزوم فانكشن هاي اصلي يا main function توي اون تعريف و مقدار دهي ميشن
بعد بايد يه جوري خودمون رو به اين كد برسونيم و با تريس كد هنگامي كه كد لودر فايل پك شده رو لود كرد و اون رو ان پك كرد و خواست به ابتداي كدمون بپره يقشو بچسبيم و فايل انپك شده رو روي هارد ذخيره كرده و با تصحيح اون اماده بشيم براي در اوردن فايل اصلي
:::شروع بازي :::
خوب فايل ocx كه پك شده رو با PEiD چك ميكنيم اين اطلاعات رو ميده ( همه اعداد در مبناي hex)
ep روي هارد يا offset ep ( كه بهش ميگيم از اين به بعد O_PE) :1470
ep در حافظه يا ويچوال اون (كه بهش ميگيم از اي به بعد V_PE):9070
كه اين مقدار رو بعلاوه محل بلر گذاري كدها ميكنيم يعني بعلاوه 11000000) ميتونيد اين رو توي سومين دكمه > بدست بياريد همون image base)
و محلي يا سكشني كه EP توش وجود قرار داره :UPX1
وكد ي كه در eP قرار داره ( متونيد اين كد رو با زدن دومين دكمه > بدست بياريد ):
کد:
11009070: 80 7C 24 08 01 CMP BYTE PTR [ESP+08],01
11009075: 0F 85 86 01 00 00 JNZ 11009201
1100907B: 60 PUSHAD
1100907C: BE 00 80 00 11 MOV ESI,11008000
11009081: 8D BE 00 90 FF FF LEA EDI,[ESI+FFFF9000]
11009087: 57 PUSH EDI
همون طوري كه ميبينيد كد شروع برنامه ما با 807c240801 شروع ميشه
براي اينكه بتونيم برنامه رو تريس كنيم از قابليت si استفاده ميكنيم يعني كد اول رو به اين تغيير ميديم cc7c240801 و بعد فايل رو سيو ميكنيم cc يعني ماشين كد دستور Int 3
نكته: براي اين كار برنامه test.ocx رو با hexeditor مون باز ميكنيم و بعد بازدن Alt+F5 ( گزينه goto)و انتخاب از ابتداي فايل مقدار 1470 در حالتي كه دكمه راديو اي hex انتخاب شده توي editBoxميزنيم و Go رو ميزنيم
ما بايد همچين كدي رو ببينيم 80 7c 24 08 01 و ....
خوب وارد si ميشيم و توي كامندش ميزنيم Bint 3 يعني روي int 3 بريك پوينت ميزاريم
f5 رو زده و برنامهمون رو اجرا ميكنيم ( يعني testocx.ocx) بينگو si بالا اومد خوبه ما در ابتداي كديم ولي يه مشكلي هست ابتداي كد رو تغيير داديم
براي برگدوندن اون به حالت اول توي خط كد ميزنيم e eip يعني ميخوايم كد اي كه eip نشون ميده رو اديت كنيم و اينتر ميكنيم كنترل به پنجره كد ميره
توي پنجره data مقدار cc رو به 80 تغيير داده و اينتر ميزنيم حالا ميتونيم كد رو تريس كنيم
قسمت هاي مهم كد رو كه بايد از روشون رد شد ( در واقعه توابع اي كه برنامه رو انپك ميكنم رو ميگم و كاري به اينكه دقيقا چيكار ميكنم ندارم - بعدا همشون رو توضيح ميدم )
اونقدر F10 ميزنيم تا به كد زير برسيم
کد:
1100909A: 8B 1E MOV EBX,[ESI] <---شروع كد انپك كردن
1100909C: 83 EE FC SUB ESI,FC
1100909F: 11 DB ADC EBX,EBX
110090A1: 72 ED JB 11009090
110090A3: B8 01 00 00 00 MOV EAX,00000001
110090A8: 01 DB ADD EBX,EBX
دوباره اونقدر F10 ميزنيم تا به كد زير برسيم
==> 11009125 8A02 MOV AL,[EDX]
01A7:11009127 42 INC EDX
01A7:11009128 8807 MOV [EDI],AL
01A7:1100912A 47 INC EDI
01A7:1100912B 49 DEC ECX
01A7:1100912C 75F7 JNZ 11009125 (JUMP ^)
01A7:1100912E E963FFFFFF JMP 11009096 <--- پرش به اول حلقه كد انپك كردن *1
01A7:11009133 90 NOP
01A7:11009134 8B02 MOV EAX,[EDX] <--- محلي كه ميتونيم بريك پوينت بزاريم *2
خوب روي خط *1 بريك پوينت گذاشته و F5 رو ميزنيم و بعد از زدن F10 به اين كد ميرسيم
1A7:11009096 01DB ADD EBX,EBX
01A7:11009098 7507 JNZ 110090A1
01A7:1100909A 8B1E MOV EBX,[ESI]
01A7:1100909C 83EEFC SUB ESI,-04
01A7:1100909F 11DB ADC EBX,EBX
01A7:110090A1 72ED JB 11009090
<--- پرش به محل اي كه مقداير انپك شده رو توي حافظه ميزاره
با زدن F10 به اين كد ميرسيم :
01A7:11009090 8A06 MOV AL,[ESI] <---گرفتن مقدار انپك شده
01A7:11009092 46 INC ESI <--- افزايش كانتر
01A7:11009093 8807 MOV [EDI],AL <--- قرار دهي كد درون ادرس
01A7:11009095 47 INC EDI
01A7:11009096 01DB ADD EBX,EBX
01A7:11009098 7507 JNZ 110090A1
حالا اگر توي si بزنيم d edi توي پنجره كد ميتونيم مقادير انپك شده رو ببينم. هر دفعه كه F5 بزنيم محتوايات اين پنجره عوض ميشه .
خوب بايد اين مرحله رو رد كنيم چيكار كنيم ايندفعه كه f5 زديم و وارد Si شديم بريك پوينت قبلي رو برميداريم و بعد كد رو اناليز ميكنيم كه كجا بريكپوينت بزاريم
کد:
01A7:1100912C 75F7 JNZ 11009125
01A7:1100912E E963FFFFFF JMP 11009096 (JUMP ^) <--- we here
01A7:11009133 90 NOP |--'if we hmp from this jmp
01A7:11009134 8B02 MOV EAX,[EDX] <---' we land here
01A7:11009136 83C204 ADD EDX,04
01A7:11009139 8907 MOV [EDI],EAX
01A7:1100913B 83C704 ADD EDI,04
01A7:1100913E 83E904 SUB ECX,04
01A7:11009141 77F1 JA 11009134
01A7:11009143 01CF ADD EDI,ECX
01A7:11009145 E94CFFFFFF JMP 11009096 <--- again to top
01A7:1100914A 5E POP ESI <--- we Bpx here
بر اساس توضيحاتي كه دادم ما روي خط 1100914A بريك پوينت ميزاريم
-F5 رو ميزنيم خوب قسمت اول انپك رو رد كرديم بريم ببينيم قسمت دوم رو ميتونيم رد كنيم يا نه
كد رو اناليز ميكنيم
کد:
01A7:1100914A 5E POP ESI <-- we here
01A7:1100914B 89F7 MOV EDI,ESI
01A7:1100914D B907000000 MOV ECX,00000007
01A7:11009152 8A07 MOV AL,[EDI] <--- آغاز يه حلقه
01A7:11009154 47 INC EDI
01A7:11009155 2CE8 SUB AL,E8
01A7:11009157 3C01 CMP AL,01
01A7:11009159 77F7 JA 11009152 <-- پرش به بالا
01A7:1100915B 803F00 CMP BYTE PTR [EDI],00
01A7:1100915E 75F2 JNZ 11009152 <-- دوباره پرش به بالا
01A7:11009160 8B07 MOV EAX,[EDI]
01A7:11009162 8A5F04 MOV BL,[EDI+04]
01A7:11009165 66C1E808 SHR AX,08
01A7:11009169 C1C010 ROL EAX,10
01A7:1100916C 86C4 XCHG AL,AH
01A7:1100916E 29F8 SUB EAX,EDI
01A7:11009170 80EBE8 SUB BL,E8
01A7:11009173 01F0 ADD EAX,ESI
01A7:11009175 8907 MOV [EDI],EAX
01A7:11009177 83C705 ADD EDI,05
01A7:1100917A 89D8 MOV EAX,EBX
01A7:1100917C E2D9 LOOP 11009157 <-- ادامه حلقه
01A7:1100917E 8DBE00700000 LEA EDI,[ESI+00007000] <-- محل مناسب
خوب روي خط 1100917E بريك پوينت مي زاريم
دوباره چندتا f10 ميزنيم ميبينيم هي به اين كد ميرسيم
کد:
==> 110091A1 8A07 MOV AL,[EDI]
01A7:110091A3 47 INC EDI
01A7:110091A4 08C0 OR AL,AL
01A7:110091A6 74DC JZ 11009184
01A7:110091A8 89F9 MOV ECX,EDI
01A7:110091AA 7907 JNS 110091B3
01A7:110091AC 0FB707 MOVZX EAX,WORD PTR [EDI]
01A7:110091AF 47 INC EDI
01A7:110091B0 50 PUSH EAX
01A7:110091B1 47 INC EDI
01A7:110091B2 B95748F2AE MOV ECX,AEF24857
01A7:110091B7 55 PUSH EBP
01A7:110091B8 FF96949A0000 CALL [ESI+00009A94]
01A7:110091BE 09C0 OR EAX,EAX
01A7:110091C0 7407 JZ 110091C9
01A7:110091C2 8903 MOV [EBX],EAX
01A7:110091C4 83C304 ADD EBX,04
01A7:110091C7 EBD8 JMP 110091A1 (JUMP )<--كد تكرار شونده
01A7:110091C9 61 POPAD
<--- اگه اينجا بريك پوينت بزاريم هيچ وقت به si برنميگرديم چون اين در صورتي صورت ميگيره كه خطايي روي بده از روي صفر كردن eax و تابع خروج فهميدم ( ميتونيد تست كنيد )
کد:
01A7:110091CA 31C0 XOR EAX,EAX
01A7:110091CC C20C00 RET 000C
خوب حال چيكار بايد كرد تنها پرش هاي ما توي اين چرخه يكي خط 11001a6 وديگري 110091c0 هستش
خط دوم كه هيچي( بالا توضيح دادم چرا )ولي كدي كه توي خط اول بهش پرش ميشه اينه
کد:
01A7:11009184 8B07 MOV EAX,[EDI]
01A7:11009186 09C0 OR EAX,EAX
01A7:11009188 7445 JZ 110091CF <--- پرش به انتهاي حلقه
خوب معلومه روي خط 110091CF بريك پوينت ميزاريم و F5 رو ميزنيم بينگو اين مرحله رو هم رد كرديم
چنتا F10 ميزنيم ميبينيم كه هي به اين پرش ميرسيم :
کد:
==> 110091D5 31C0 XOR EAX,EAX <--- اغاز شروع حلقه
01A7:110091D7 8A07 MOV AL,[EDI]
01A7:110091D9 47 INC EDI
01A7:110091DA 09C0 OR EAX,EAX
01A7:110091DC 7422 JZ 11009200 <---ممكنه خروج از حلقه باشه 1
01A7:110091DE 3CEF CMP AL,EF
01A7:110091E0 7711 JA 110091F3 <---2ممكنه خروج از حلقه باشه
01A7:110091E2 01C3 ADD EBX,EAX
01A7:110091E4 8B03 MOV EAX,[EBX]
01A7:110091E6 86C4 XCHG AL,AH
01A7:110091E8 C1C010 ROL EAX,10
01A7:110091EB 86C4 XCHG AL,AH
01A7:110091ED 01F0 ADD EAX,ESI
01A7:110091EF 8903 MOV [EBX],EAX
01A7:110091F1 EBE2 JMP 110091D5 (JUMP ^) پرش به ابتداي حلقه
01A7:110091F3 240F AND AL,0F
01A7:110091F5 C1E010 SHL EAX,10
01A7:110091F8 668B07 MOV AX,[EDI]
01A7:110091FB 83C702 ADD EDI,02
01A7:110091FE EBE2 JMP 110091E2 <---پرش بدرون حلقه قبلي
01A7:11009200 61 POPAD
01A7:11009201 E9AA7FFFFF JMP 110011B0
خوب خط 2 نمي تونه خروج از حلقه باشه چون به جاي ميپره كه بعد دوباره ما رو بدون حلقه برميگردونه پس خط 1 خروج از حلقه است خوب روي 11009200 بريك پوينت ميزاريم و f5 رو ميزنيم بله درست بود .
يه نگاه به كد ميشه فهميد كه به پرش به oep نزديك شديم !!!!!!!1
چرا خوب نگاه كنيد ما اول كد داشتيم PushAD يعني همه چيز ذخيره بشه و حالا داريم popAD يعني همه چيز برگدونده بشه به حالت اول انگار نه انگار لودر پكري بوده خوب پس جامپ بعدي يعني جامپ يه Oep ( يعني نقطه شروع اصلي)
براي اطمينان تريسش ميكنيم ميبينيم كه اولين لود Api روي داده يعني خط ×× پس خط 110011b0 همون OEP ماست .
حالا چيكار كنيم كه فايل انپك شده رو روي هارد بريزيم خوب هنگامي كه به خط 11009201 رسيدم اين كار رو ميكنيم كدش رو به EBFE تغيير ميديم يعني بپر به خودم يا در واقعه وايسا
براي اين كار بت زدن e eip كدرو تغيير ميديم بعد ميزنيم bd* يعني همه بريك پوينت را از كار بنداز
f5 رو ميزنيم و حالا برنامه ProcDump32 رو اجرا كرده واز ليست taskاي با نام testocx.exe رو انتخاب ميكنيم
حالا توي ليست Module روي test.ocx كليك راست كرده و گزينه dump(full) رو ميزنيم و بعد همون جاي كه فايل testocx.ocx هست رو انتخاب و با نام test-dump.exe ذخيره ميكنيم . حالا توي ليست task روي testocx.exe كليك راست كرده و گزنه killtask رو ميزنيم
نكته : فايل ما با پسوند exe ذخيره ميشه پسوند اون رو بايد بصورت دستي ocx كنيم
حالا ما يه فايل داريم كه انپك شداست ولي دو مشكل داره يكي اينكه ep اون اشتباه است ( ادرس لودر رو داره ) و دومين مشكل اينكه iat مشكل داره .
خوب حل مشكل يك توي ProcDump32 روي دكمه pe editor كليك كرده و فايل test-dump.ocx رو انتخاب ميكنيم و بعد مقدار ep رو برابر 11b0 ميزاريم چون
کد:
110011B0-baseimage(110000000)=11B0
ok كرده و ProcDump32 رو ميبنديم خوب مشكل اول حل شد .
اما مشكل دوم
ابتدا test.ocx رو با فايل اصلي جايگزين ميكنيم يا اينكه بايت اوليه كه برابر 80 و ما كرديمش cc ميكنيمش 80
بعد فايل رو اجرا كرده
حال برنامه ImportREC اجرا و توي قسمت Attach to an ... فايل testocx.exe رو انتخاب و گزينه pick dll رو ميزنيم
test.ocx رو انتخاب ميكنيم توي قسمت لود اين مقدار ديده ميشه
کد:
modle selected :xxxxxxx\test.ocx
كه نماينده xxxxxxx مسير فايله.
خوب توي قسمت OEP مقدار بدست امده رو كه برابر 11b0 ايت رو وارد كرده IAT AutoSearch رو ميزنيم
يه چيزاي ميگه كه مهم نيست ( براي ما اما بعضي از وقت ها كمك ميكنه)
ok رو ميزنيم دكمه get imports رو ميزنيم توي پنچره imported Function found يه خط مياد كه ميگه msvbm60.dll پيدا شده ( و نكته مهم اينكه كه ميگه اين valid)
خوب دكمه fix dump رو زده و فايل test-dump.ocx رو انتخاب ميكنيم حالا توي ليست log بايد نوشته باشه
کد:
D:\CRACK\crack ocx\test-dump_.ocx saved successfully.
براي امتحان برنامه testocx.exe رو ميبنديم و test.ocx اصلي رو به نام اي مثلا test1.ocx تغيير نام ميديم و همچنيم فايل test-dump_.ocx رو به نام test.ocx تغيير نام داده و فايل testocx.exe رو اجرا ميكنيم
بينگو همه چيز درسته
اميدوارم توضيحات كامل باشه و كمك تون كنه از اينكه اينهمه سرتون رو درد اوردم معذرت ميخوام
:lol: :wacko: :wacko: