سلام .
در این مقاله طریقه از بین بردن محدودیت زمانی را آموزش میدهم .ابزار :
1. OllyDBG
2. فایل exe برای کرک کردن هم در پایین پیوست شده که تمامی توضیحات هم براساس آن میباشد .
» آموزش :
برای اینکه یک برنامه بفهمد که چه مدت بر روی کامپیوتر نصب شده است یا چند بار اجرا شده است باید از registry یا فایلی را که قبلا در هارد ذخیره کرده است را برگرداند.برای اینکار از تابع های زیادی از جمله توابع زیر استفاده میکند
GetLocalTime
GetSystemTime
GetSystemTimeAsFileTime
(با زدن کلید CTRL+A در ollydbg به توضیحات بیشتری دست پیدا میکنیم)
حالا برنامه را در ollydbg لود میکنیم.یک breackpoint بوسیله bpx GetSystemTime قرار میدهیم.کلید F9 را میزنیم تا برنامه در قسمت موردنظر بایستد
کد:
0040100C |. 6A 00 PUSH 0
0040100E |. 68 80000000 PUSH 80
00401013 |. 6A 03 PUSH 3
00401015 |. 6A 00 PUSH 0 \خواص امنیتی ندارد
00401017 |. 6A 00 PUSH 0 \حالت اشتراک ندارد
00401019 |. 68 000000C0 PUSH C0000000 \برای خواندن و نوشتن باز کند
0040101E |. 68 A2304000 PUSH timetria.004030A2 \DATA.DET قراردادن
00401023 |. E8 DE010000 CALL <JMP.&KERNEL32.CreateFileA> \بازکردن فایل
00401028 |. 83F8 FF CMP EAX,-1 \مقایسه میکند که اگر باز نکرده باشد
0040102B |. 74 07 JE SHORT timetria.00401034 \اگر این طور بود برو به پیغام خطا
0040102D |. A3 14314000 MOV DWORD PTR DS:[403114],EAX \دستور ذخیره کردن
00401032 |. EB 18 JMP SHORT timetria.0040104C \پرش
00401034 |> 6A 30 PUSH 30
00401036 |. 68 38304000 PUSH timetria.00403038
0040103B |. 68 02304000 PUSH timetria.00403002
00401040 |. 6A 00 PUSH 0
00401042 |. E8 B3010000 CALL <JMP.&USER32.MessageBoxA>
00401047 |. E9 22010000 JMP timetria.0040116E \بپر به خروج از برنامه
0040104C |> 6A 00 PUSH 0
0040104E |. 68 E0304000 PUSH timetria.004030E0 \خواندن بایت
00401053 |. 6A 32 PUSH 32 \حداکثر 50 بایت بخواند
00401055 |. 68 AB304000 PUSH timetria.004030AB \ذخیره داده های فایل در حافظه موقت
0040105A |. FF35 14314000 PUSH DWORD PTR DS:[403114] \;Push file handle
00401060 |. E8 B9010000 CALL <JMP.&KERNEL32.ReadFile>
00401065 |. 833D E0304000 >CMP DWORD PTR DS:[4030E0],0B \چک میکند که آیا 11 بایت بخواند
0040106C |. 0F85 E9000000 JNZ timetria.0040115B \اگر نبود برود به پیغام خطا
00401072 |. BB AB304000 MOV EBX,timetria.004030AB \EBX ذخیره اشاره گر حافظه موقت در
00401077 |. 68 E4304000 PUSH timetria.004030E4 \قراردادن اشاره گر در ساختمان زمان سیستم
0040107C |. E8 97010000 CALL <JMP.&KERNEL32.GetSystemTime>
00401081 |. 803B 00 CMP BYTE PTR DS:[EBX],0 \چک کند که اگر بعضی چیزها هنوز ذخیره نشده اند
00401084 |. 75 22 JNZ SHORT timetria.004010A8 \اگر اینطور نبود
00401086 |. 51 PUSH ECX \ذخیره زمان و ساعت فعلی
00401087 |. 33C9 XOR ECX,ECX \; in a SYSTEMTIME struct (part) in the buffer
00401089 |. EB 15 JMP SHORT timetria.004010A0 \; and do a XOR...
0040108B |> 66:8B81 E43040>/MOV AX,WORD PTR DS:[ECX+4030E4]
00401096 |. 66:8981 AB3040>|MOV WORD PTR DS:[ECX+4030AB],AX
0040109D |. 83C1 02 |ADD ECX,2
004010A0 |> 83F9 08 CMP ECX,8 \اگر به خواندن 8 بایت رسید
004010A3 |.^76 E6 \JBE SHORT timetria.0040108B \بپر به پایان حلقه
004010A5 |. 59 POP ECX
004010A6 |. EB 3A JMP SHORT timetria.004010E2
در کد بالا اگر فایل باز شدد(فقط اگر موجود بود،و اگر برنامه دیگری از آن استفاده نمیکرد)محتوای فایل خوانده میشود.این باید 11 بایت باشد.
10 بایت اول قسمتی از زمان سیستم است(سال،ماه،هفته،روز،ساعت؛هر کدام 2 بایت)،هر بایت XORred با 069h میشود
کد:
004010A8 |> 8B0D AB304000 MOV ECX,DWORD PTR DS:[4030AB] \ecxاز حافظه موقت در dword ذخیره
004010AE |. 81F1 69696969 XOR ECX,69696969 \از کد خارج کردن به سال-ماه
004010B4 |. A1 E4304000 MOV EAX,DWORD PTR DS:[4030E4] \eax ذخیره زمان سیستم در
004010B9 |. 3BC1 CMP EAX,ECX \چک کن اگر برابر بود
004010BB |. 0F85 85000000 JNZ timetria.00401146 \اگر نبود برو به پیغام خطا
004010C1 |. 66:8B0D B13040>MOV CX,WORD PTR DS:[4030B1] \cx ذخیره کلمه روز از بافر در
004010C8 |. 66:81F1 6969 XOR CX,6969 \از کد خارج کردن روز
004010CD |. 66:A1 EA304000 MOV AX,WORD PTR DS:[4030EA] \ax ذخیره روز فعلی در
004010D3 |. 66:2BC1 SUB AX,CX \تحت روز فعلی از روز شروع
004010D6 |. 66:83F8 03 CMP AX,3 \چک کن اگر بیشتر از 3 روز بود(در مقاله اصلی کمتر
004010DA |. 77 6A JA SHORT timetria.00401146 \اگر اینطور بود برو به پیغام خطا
004010DC |. 2805 00304000 SUB BYTE PTR DS:[403000],AL \Sub the difference from the max allowed value (days)and store.
004010E2 |> A0 B5304000 MOV AL,BYTE PTR DS:[4030B5] \گرفتن 11 بایت از بافر
004010E7 |. 34 69 XOR AL,69 \از کد خارج کردن آن
004010E9 |. 3C 00 CMP AL,0 \اگر صفر بود
004010EB |. 74 59 JE SHORT timetria.00401146 \اگر بود برو به پیغام خطا
004010ED |. FEC8 DEC AL \و گرنه از ارزشش 1 کم کن
004010EF |. A2 01304000 MOV BYTE PTR DS:[403001],AL \ذخیره ارزش
004010F4 |. 34 69 XOR AL,69 \کد بندی آن
004010F6 |. A2 B5304000 MOV BYTE PTR DS:[4030B5],AL \ذخیره در بافر فایل
004010FB |. 6A 00 PUSH 0
004010FD |. 6A 00 PUSH 0
004010FF |. 6A 00 PUSH 0
00401101 |. FF35 14314000 PUSH DWORD PTR DS:[403114]
00401107 |. E8 18010000 CALL <JMP.&KERNEL32.SetFilePointer> \قرار دادن اشاره گر فایل در ابتدای فایل
0040110C |. 6A 00 PUSH 0
0040110E |. 68 E0304000 PUSH timetria.004030E0
00401113 |. 6A 0B PUSH 0B
00401115 |. 68 AB304000 PUSH timetria.004030AB
0040111A |. FF35 14314000 PUSH DWORD PTR DS:[403114]
00401120 |. E8 05010000 CALL <JMP.&KERNEL32.WriteFile> \نوشتن بافر(حافظه موقت) در فایل
00401125 |. 833D E0304000 >CMP DWORD PTR DS:[4030E0],0B
0040112C |. 75 2D JNZ SHORT timetria.0040115B
0040112E |. 6A 00 PUSH 0
00401130 |. 68 74114000 PUSH timetria.00401174
00401135 |. 6A 00 PUSH 0
00401137 |. 6A 01 PUSH 1
00401139 |. FF35 F4304000 PUSH DWORD PTR DS:[4030F4]
0040113F |. E8 B0000000 CALL <JMP.&USER32.DialogBoxParamA> \نمایش دیالوگ برنامه
اگر بعضی چیزهایی در فایل موجود بود،آنها را از کد خارج میکند و با زمان فعلی مقایسه میکند.اگر اختلاف بیشتر از 3 روز بود برنامه پایان پیدا میکند.چک کردن بعدی،11 بایت در فایل چک میشود،این شماره sessions left میباشد.این با هر بار اجرا کاهش پیدا میکند
پچ کردن برنامه
سه تغییر لازم است
1-در صورت چک کردن زمان سیستم نپرد
004010BB 0F8585000000 jne 00401146 -> NOP (x6)
0F8585000000 -> 909090909090
2-
004010DA 776A ja 00401146 -> NOPNOP
776A -> 9090
3-
004010EB 7459 je 00401146 -> NOPNOP
7459 -> 9090
لازم نیست کارهای زیر را انجام دهید
To make the values make sense in the DialogBox, you could patch the following too:
004010DC 280500304000 sub byte ptr [00403000], al -> mov byte ptr [00403000], 03h
004010EF A201304000 mov byte ptr [00403001], al -> mov byte ptr [00403001], 09h