آژانس هواپیماییexchanging

اموزش مهندسي معكوس يا (craking)

شروع موضوع توسط saeedsmk ‏5 اکتبر 2005 در انجمن برنامه نویسی

  1. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    بنام خدا
    قبلنا توي قسمت متفرقه همچين تاپيكي رو en2fa شروع كرده بود و چون اون موقه سايت هك شد بيشتر مباحث از بين رفتن . از اونجاي كه اين مسئله رابطه مستقيمي با برنامه نويسي داره مخصوصا با اسمبلي گفتم اينجا مطرحش كنم .حالا اگه درست نيست يكي از مدير ها لطف كنه اين رو به جاي كه بهتره انتقال بده

    قبل از هر چيز مي خوام در مورد اهدافم از آموزش كرك برنامه ها بگم .

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

    - نشان دادن نحوه شكستن قفل هاي نرم افزاراي تا كساني كه با كامپيوتر كار مي‌كنن فرق كپي كردن با نرم افزارهاي مثل Clone CD و قفل شكنها رو بفهمن.

    - آموزش Software Cracking براي اداي احترام به كساني كه از رو نوشتهاي اونها اين كار رو ياد گرفتم

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

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

    ديگه برسيم سر اصل مطلب.

    Software Cracking يعني چي؟

    اولا Cracking نرم افزار يعني وادار كردن يه برنامه به اجراي چيزي كه شما از اون برنامه انتظار دارين مثل انجام يه كار يا حذف يه Nag Screen يا اضافه كردن يه منو به برنامه .

    اما Cracking در Hack به معناي استفاده از يك سري روش ها و برنامه هاس تا از طريق ارتباط دور با يك دستگاه ارتباط بر قرار نموده و بعد يكسري خراب كاري روي اون سيستم انجام دهد اين افراد معمولا افراد مجربي نيستند ولي سوراخهاي امنيتي رو بخوبي ميشناسن و با Hacker هاي واقعي در عدم مجرب بودن و نحوه نگرش شون فرق می كنن.

    قبل از به انتها رسوندن اين مطلب لازمه مواد مورد نياز Software Cracking كه من ديگه بهش مي گم "كرك" رو بگم .

    - آشنايي با اسمبلي كه بسيار لازمه . البته به مختصري در مرودش توضيح ميدم

    - آشنايي با برنامه نويسي سطح بالا : بسيار لازم نيست. اما اگه بلد باشين خوبه بهترينش زيان براي ياد گرفتن در راستاي كرك c هست .

    - چندين و چند برنامه مثه Soft ice كه بعدا كم كم همشون رو ميگم

    - و كمي هم در مورد API ويندوز بهتره يه رفرنس داشته باشين

    - ترجيحا يه ويندوز ديگه بجز ويندوز اصلي سيستمتون كه بهتره 98 يا 98 Se باشه چون بعضي از وقتا مجبور ميشيم هسته رو هم كرك كنيم ( واي).
    حالا اگه كسي حاضره شروع كنم درسها رو بگه
    :cool:
     
  2. MehdiC#

    MehdiC# کاربر تازه وارد

    تاریخ عضویت:
    ‏2 نوامبر 2004
    نوشته ها:
    55
    تشکر شده:
    0
    محل سکونت:
    ابهر
    سلام سعید
    شروع کن ، من اول از همه اعلام آمادگی می کنم.
    بسم الله
     
  3. HRH

    HRH کاربر تازه وارد

    تاریخ عضویت:
    ‏13 آگوست 2005
    نوشته ها:
    13
    تشکر شده:
    0
    محل سکونت:
    Esfahan
    من هم خيلي دوست دارم در اين مورد بيشتر بدونم چون ديگه كم كم در ايران همه دارن ميرن به طرف نرم افزارهاي با قفل و مشتري دوست داره كسي بدون اجازه اون از نرم افزارش استفاده نكنه ....:f34r:
     
  4. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    بنام خدا
    ميدونم اين مطالب خيلي ها ميدونم گفتم بزارم تا وقتي صحبت از اين مطالب شد يه رفرنس دست و پا شكسته داشته باشيم. به هر حال ببخشين اگه خيلي پيش پا افتاده بود:p

    براي ياد گرفتن اسمبلي بايد با مبناهاي عدد نويسي ، ساختمان داخلي كامپيوترو برنامه نويسي آشنا باشيم .
    ما از Debug استفاده خواهيم كرد . (در سطح داس) اما در محيط ويندوز براي Debug كردن يك برنامه از برنامه هاي نظير(SI (Soft Ice و يا trw2000 debuger و ديگر برنامه هاي نظير اين دو برنامه استفاده مي نماييم
    براي شروع ابتدا نگاهي به حافظه ميكنيم :

    حافظه و آدرس دهي

    هر كامپيوتر مبتني بر8086 داراي حداقل640 كيلوبايت حافظه است . اين 640 كيلوبايت به قطعات 64 كيلوبايتي تقسيم شده و ما اين قطعات را "قطعه " يا Segment ميناميم . هر سگمنت هم به خانه هاي تك بايتي ديگري تقسيم شده است.
    براي بدست آوردن مقدار يك بايت مشخص از حافظه ما بايد عدد مربوط به سگمنت وهمچنين شماره آن بايت در سگمنت ( كه آفست ناميده ميشود) را بدانيم . Offset يعني يك آدرس در مبناي 16 كه 16 بيتي است و( يا در حالت win32 يك عدد 32 بيتي مي باشد. ) و مثلا اگر مقدار مورد نظر در قطعه 0030h باشد و افست آن 13C4h باشد ما بايد قطعه اي كه شماره آن 0030h است را بيابيم و بعد در همان قطعه افست 134C را بدست آوريم .
    براي نمايش اين حالت بين عدد سگمنت و آفست علامت ( : ) قرار ميدهيم . يعني
    0030:134C در حالت داس و 0030:0000134C در حالت ويندوز. Segment:Offset
    ** هميشه در آدرس دهي ها از اعداد مبناي 16 استفاده ميكنم .

    Registers ثباتها

    رجيسترها مكان هائي ازCPU هستند كه براي نگهداري داده ها (DATA) و كنترل اجراي برنامه بكار ميروند . ما ميتوانيم آنها را مقدار دهي كرده و يا بخوانيم و يا باتغيير محتواي آنهاCPU را مجبور به انجام يك پروسه (رويه ياProcedure ) كنيم .

    دسته اي از رجيسترها كه ما آنها را "ثباتهاي همه كاره يا همه منظوره " ميخوانيم و شامل ax,bx,cd,dx هستند در حالت داس ( حالت 2 بايتي ) ودر حالت ويندوز eax,ebx,ecx,edx ( بصورت 4 بايتي) ، براي انتقال مقادير بين رجيستر ها وCPU بكار ميروند.
    در حالت ويندوز ثباتهاي معروف ديگر( كه هر كدام قانون خاصي دارد ) عبارتند از :
    EIP
    اين ثبات مقدار شماره خط در حال اجرا نمايش مي دهد.
    ESP
    قبل از توضيح اين ثبات بايد در باره پشته صحبت كنيم . پشته يا Stack (نميدونم درست نوشتمش يا نه ) محلي است كه برنامه مقادير ذخيره شده ثباتهاي ديگر را در آن قرار مي دهد . قانوني پشته در اين است كه هر چيز كه اول وارد آن گردد آخر سر خارج مي شود.The 1st input is the last one come out
    خوب معلوم است كه اين ثبات شماره پشته را در خود نگه مي دارد.
    براي روشن تر شدن قضيه و چگونه استفاده از پشته يه مثال ميزنم . فرض كنيم يك MsgBox بايد نمايش داده شود .
    در اين حالت مكان يا آدرس جايي كه رشته مورد نمايش در حاقظه قرار دارد در ثباتي مثل Eax قرار داده مي شود يعني
    1- Mov eax,00450F1C eax آدرس رشته مورد نظر در خودش قرار ميده
    حالا اين ادرس ذخيره ميشه :
    2-Push eax در پشته قرار دادن اين آدرس
    متغير رو صفر ميكنه :
    Xor eax,eax صفر كردن متغير يا ثبات براي فرا خواني تابع
    صدا زدن تابع :
    [jmp dword ptr [004121F0
    برنامه به محلي كه رويه Messageboxa توسط برنامه مورد مثال فرا خواني مي شود ارسال مي گردد.
    ( دستوارت بعدا توضيح داده مي شود).
    همانطور كه ديده ميشه براي انتقال متغير به تابع سه راه حل وجود داره
    استفاده از ثباتها ويا تركيبي از اونها
    استفاده از پشته
    استفاده هم از پشته هم از ثباتها
    توي مثال بالا هم از از پشته هم از eax استفاده شد

    ثبات( EDI (Data Index
    اين ثبات براي نگه داري اطلاعات مورد نظر برنامه استفاده مي شود. تقريبا مثل ثبات همه كاره
    ثبات(ESI(Segment Index
    همانند EDI

    ثباتهاي همه منظوره به دو نيم ثبات تك بايتي تقسيم ميشوند . بايت بالائي با نمادH و بايت پائيني با نمادL نشان داده ميشود . مثلا ثبات AX داراي دو نيم- ثبات AH,AL است .
    در داس:
    اگر AX را بصورت ABCD نمايش دهيم CD درAl و AB درAh قرار مي گيرد حال اگر مقدار 1234h (h نمايينده قرار گرفتن در مد Hex مي باشد) درAX قرار داده شود ( هنگامي كه از حافظه برنامه مقدار دهي شود .) مقدار 12 درAl و مقدار 34 درAh قرار مي گيرد.(Eax=3412)
    در حالت ويندوز
    اين حالت بر قرار است اماEax=XXXXABCD
    AB معرف Ah وCD معرف Al مي باشد.
    در درس بعدي اعداد پايه 16 تايي و 8 تايي و 10 تاي و چند دستور آموزش داده مي شود.

    قبل از هر چيز برنامه هاي مثه Soft Ice و W32DASMو يك Hex Editor مثه Hex Workshop را تهيه كنيد.( آدرس آنها را قبلا دادم به سرچي كنيد مي تونيد پيداشون كنيد )
    براي ديدن ثباتها در سطح داس (98) (Dos Promt يا Dos Mode) دستور Debug را زده و بعد از اجرا در خط فرمان Debug ( همان خطي كه اول آن - دارد ) دستور R يا Registersرا تايپ و enter را بزنيد مقدار رجيستر ها ( ثباتها ) به نمايش در مي آيد .
    براي خروج q تايپ و Enter را بزنيد.

    اميدوارم مطالب كمكتون كنه و بد توضيحشون نداده باشم :)
     
  5. QITQ

    QITQ کاربر تازه وارد

    تاریخ عضویت:
    ‏1 اکتبر 2005
    نوشته ها:
    21
    تشکر شده:
    0
    سلام.
    منم منتظرم پس چرا ادامه نميدين؟
     
  6. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    ببخشيد از بابت دير كرد اين دو قسمت رو باهم ميزارم چون بيشتريهه با قسمت اول اشتايي دارن .
    قسمت اول
    به نام خدا

    با سلام

    فكر كنم امروز نوبت رسيدن به حساب عدد ها باشه؟ نه

    كلاس رسمي است.

    ما معمولا اعداد را بر پايه ده نشان مي دهيم . يعني اعداد پايه ده. زيرا بعد از شمردن از 0 تا عدد 9 ، اعداد دو رقمي شده و يا به عبارت ديگر يكي به دهگان عدد اضافه مي شود .بطور مثال عدد 128 را در نظر بگيريد. اين عدد يعني

    128=8*10^0+2*10^1+1*10^2

    همانطور متوجه شديد رتبه دهگان و صدگان و هزارگان در واقعه معرف توان ده در رابطه بالا مي باشد.بعلت استفاده 10 به عنوان پايه توان اين مبنا را ده دهي مي گويند.
    اعداد در پايه هاي ديگر هم داراي رابطه اي شبيه رابطه بالا مي باشند مثلا رابطه عدد 128 در پايه x بصورت زير نوشته مي گردد:

    128(x)=8*x^0+ 2*x^1 +1*x^2

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

    پايه دو دوبي: ( Binary)

    همانطور كه از اسم اين پايه معلوم است مبنا اعداد در اين پايه دو بوده و اعداد تشكيل دهنده اين مبنا عبارتند از 0،1(اعداد كوچكتر از پايه با انضمام 0 )يك عدد در اين مبنا بصورت مينيمم 1 بيت را مورد استفاده قرار مي دهد.2^0=1 ماكزيمم عدد تشكيل دهنده

    پايه هشت هشتي يا اكتال

    شبيه پايه دو بوده ولي اعداد بكار رفته در آن عبارت است از: 0،1،2،3،4،5،6،7. هر عدد در اين مبنا حداقل 3 بيت مورد مصرف قرار
    مي دهد
    2^0+2^1+2^2=7
    ( هر كدام از جواب به توان رساندن يك بيت را اشغال مي نماييد )

    پايه هگزا دسيمال (Hex)

    اعداد بكار رفته در آن عبارت است از:F،E،D،C،B،A،9،8، 0،1،2،3،4،5،6،7. كه در آن A معرف 10و B معرف 11 و ... E معرف 15
    مي باشد هر عدد در اين مبنا حداقل 4 بيت مورد مصرف قرار مي دهد
    2^0+2^1+2^2+2^3=15

    چگونگي تبديل پايه هاي ديگر به ده دهي:

    براي تبديل هر عدد در مبناي x به مبناي ده دهي از روش زير استفاده مي كنيم: ( فرض كنيد عدد ما در مبنا x برابر QWER مي باشد )

    QWER(x)=R*x^0+E*x^1+W*x^2+Q*x^3+….

    حاصل جمع ما همان عدد در پايه ده دهي (مثلا TYUIO) يعني

    TYUIO(10)=QWER(x)

    حال مي رسيم به تبديل اعداد پايه 10 به پايه هاي ديگر

    براي اين كار از روش تقسيمهاي متوالي استفاده مي نماييم عدد را بر پايه مورد نظر ( x ) تقسيم نموده .باقي مانده را در بجاي اولين عدد معادل قرار مي دهيم حال خارج قسمت را بر x تقسيم نموده و باقي مانده را در كنار باقي مانده قبلي در سمت چپ آن قرار مي دهيم آنقدر اين كار را انجام داده تا خارج قسمت از x كمتر گردد .حال آخرين خارج قسمت را نيز دز سمت چپ باقي مانده ها قرار مي دهيم ( آخرين باقيمانده را نيز قبل از اضافه كردن خارج قسمت به اعداد اضافه مي نماييم) عدد حاصله معادل عدد ده دهي در پايه x مي باشد.
    الگوريتم آن عبارت است از:

    1- عدد را بگير
    2- اگر عدد كوچكتر از x است به مرحله6 بپر
    3- عدد را بر x تقسيم كن باقيمانده را در سمت چپ عدد معادل كنار اعداد ديگر بنويس اگر عددي نبود آن را ياد داشت كن
    4- خارج قسمت را جاي عدد بگذار
    5- به مرحله 2 برو
    6- عدد را به سمت چپ اعداد اضافه كن
    7- نمايش رشته

    قسمت دوم

    دستورات اسمبلی


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

    Mov Dest,source​
    با اجراي اين دستور منبع درون مقصد كپي مي شود. منبع و يا مقصد مي تواند يكي از حالات زير باشه:
    -ثبات يا رجي ستر
    -آدرس حافظه
    - رجي ستري كه به حافظه اي اشاره مكنه
    -رجي ستري كه به حافظه اي كه نسبي اشاره مي كنه
    ( بعدا در نحوه آدرس دهي اين مفاهيم توضيح داده مي شود)
    مثال

    Mov eax,ebx ​
    كه مقدار ebx تو eax مي ريزد.

    Push value​

    وظيفه آن قرار دادن value در Stack memory مي باشد.
    مثال

    Push eax / Push [004044ca] ​
    كه مقدار eax را تو پشته قرار مي دهد./ مقداراي را كه در حافظه [004044ca] مي باشد را در پشته قرار مي دهد.


    Pop value​
    معكوس Push بوده و مقداري را كه با Push در حافظه قرار گرفته را بر مي گرداند.
    مثال

    eax= 10h push eax
    eax=1000h mov eax,1000h
    ebx=12h mov ebx,12h
    ebx=ebx+eax=1012h add ebx,eax
    eax=10h Pop eax​


    ×هميشه متغيري كه در حافظه قرار ميگيرد لزوما با همان متغير برداشته نمي شود


    Push eax
    ….
    Pop ebx

    PopA /PushA​

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

    Lea reg,Source​

    مقدار آدرس موثر(واقعي با سگ منت و افست ) منبع را در رجي ستر قرار مي دهد.

    Jmp value​

    اگر value آدرس موثر باشد ( كه معمولا نيست ) به آن آدرس برنامه فرستاده مي شود .و اگر موثر نباشه به اندازه مقدار value به آدرس كنوني اضافه كرده و به اونجا مي رود
    اگر ياد تون باشد EIP شماره خط در حال حاضر رو تو خودش دارد پس دو دستور زير با هم معادل اند:


    Jmp 02 ,jump to address that is equal to current address+02
    Add EIP +02 , EIP equal to EIP (Current Address)+2

    Cmp Op1,Op2​

    مقدار اولي و دومي را مقايسه مي كند . (اولي منهاي دومي ) بر اساس نتيجه مقدار رجي ستر وضعيت ( قبلا معرفيشون نكردم فقط وضعيت مقايسه را تو خودش قرار مي دن )( شامل بيتهاي zf,sf,pf,of,cf,af است ) ست مي كند. مهمتر ينشون zf (حاصل تفريق 0 است zf=1 يعني با هم برابر اند)

    Jz,Jnz,…​
    تمامي دستوراتي كه يا z شروع مي شن يعني اگر ... و پرش .مثلا JZ ( Jump if Zero)يعني اگر بيت zf از رجي ستر وضعيت 1 باشد به خط مورد نظر پرش نما


    بيت معادل شرط
    zf=1 = Jz=Je
    zf=0 != Jnz
    zf=0 and cf=0 بزرگتر Ja
    cf=0 بزرگترو مساوي Jae
    cf=1 كوچكتر Jb
    cf=1 or zf=0 كوچكتر و مساوي Jbe
    ecx=0 اگر cx برابر 0 شد Jcxz ​


    (دستوراتي هم مثل JGو يا JL و هستن كه براي اعداد علامت دار مصرف ميشوند كه ثبات وضعيتشون يادم نيست به هر صورت خود تون ياد بگيريد.)

    ADD و ADC( Adding & Adding With Carry)​
    هر دو مقدار اول را بعلاوه مقدار دوم كرده و نتيجه را در اوليه مي گذارند . قبل از اينكه فرقشون رو بگم بهتر كه Overflow رو بگم . در حالت اعداد طبيعي هر بايت نمايانگر يك عدد بين 0 تا 255 مي باشد ولي در حالت اعداد صحيح هر بايت نمايانگر يك عدد بين 128- تا 127 است.
    بيت معمولي بيت معمولي بيت معمولي بيت معمولي بيت معمولي بيت معمولي بيت معمولي بيت علامت
    اگر بيت علامت يك باشد يعني عدد منفي است و 0 بودن آن يعني عدد مثبت است .
    حال فرض كنيم 96 را با 32 جمع كنيم نتيجه 128 مي شود ولي در حالت بالا عدد معادل 0 منفي است كه باعث سر ريز شده است .
    در حالت جمع ADC اين حالت پيش نيامده و همچنين اگر دو بايت را يا هم جمع كرديم و بر16 ) مثل بر 10 ) در جمع آنها را نيز دخالت مي دهد. مثلا اگر يك كلمه را با كلمه ديگر جمع كنيم جواب درست نمايش داده مي شود.

    SUB و SBB​
    عمل تفريق را انجام مي دهد .SBB داراي خصوصيات ADC است ولي عمل تفريق را انجام مي دهد.

    Neg ​
    علامت عدد را معكوس مي نمايد. از روش متمم دو

    INC x​
    به عدد x يك عدد اضافه مي نمايد.( x مي تواند حافظه و يا آدرس و يا رجي ستر باشد)

    DEC x​

    از x يك عدد كم مي كند.

    MUL x​

    برابر eax=eax*x

    IMUL x​
    مثل mul است ولي براي اعداد علامت دار

    DIV x وIDIV x​
    تقسيم مثل MUL وMULI

    جداول عملياتي

    ANDوORوXORوNOTوTest
    NOT A
    A=NOT A XOR A,B
    A=A XOR B AND A,B
    A=A AND B OR A,B
    A=A OR B B A
    1 0 0 0 0 0
    1 1 0 1 1 0
    0 1 0 1 0 1
    0 0 1 1 1 1 ​

    عمل TEST A,B مثل عمل AND بوده ولي باعث تغيير A نمي شود .ولي در صورت برابري AوB مقدار zf را يك مي كند.

    فعلا تا بعد:lol:
     
  7. appbannerkhuniresbanner
  8. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    سلام انگار كسي حال و حوصله نداره 72 نفرر اين تاپيك رو ديدن ولي هيشكي نه نظر داده نه سئوال كرده و........... بجز همون چند سه نفر اول اگه بنظرتون جالب نمياد بگين نه خودمو خسته كنم و نا شما ها رو و نه هاست اقا احسان رو پر كنم :blink:

    Debuggers

    با سلام . امروز تصميم دارم در مورد (Soft ice (SI صحبت كنم : Si يك Debugger كه وظيفه غلط يابي و ... را بر عهده داره:

    اصولا debug ها دو نوع مي باشند . يك نوع همومنه كه هنگام برنامه نويسي غلط برنامه را مي گره – compiler debuggers

    دومين نوع debugger ها، برنامه يا سخت افرازي كه بين سيستم عامل و برنامه اجرايي قرار گرفته و در نتيجه قابليت trace رد يابي رو به ما مي ده.

    debugger نوع اول رو همه برنامه نويسها باهاش آشنا هستن و در مورد نوع دوم :

    همانطور كه گفتم اين نوع از Debugger ها نرم افزار اند مثل Trw2000و SI ollyDebuger و يا سخت افزارند مثل كنترل كننده هاي Ice ها (تسترها پروگرمها – مودولها تست برنامه و ... ). ما با رسته دوم از دسته دوم كاري نداريم و ميريم به سراغ رسته اول از دسته دوم.

    خوب اين نوع از ديباگرها نرم افزاري خودشون به دو نوع دسته تقسقم ميشن

    ديباگر هسته ( Kernel debugger ) كه هسته رو در بر ميگيره و كنترل كننده هستش. اگه بخوايم بگيم كه ديباگرها كجا ست ديباگر بين سيستم عامل و برنامه قرار داره منظورم از سيستم عامل داس پايين ترين قسمت يه سيستم عامله كه حتي هسته براي اجرا به اون نيازمنده مثلا توي ويندوز 98 داريم

    سيستم عامل dos با نسخه 7 <> كرنل ديباگر (مثلا SI ) <> كرنل ويندوز <> برنامه

    دومين دسته software debugger ها هستن كه بين ويندوز و برنامه اي كه اجرا كردن قرار ميگيرن – يعني فقط قابليت ديباگ كردن همين برنامه رو دارن نه بيشتر . در حالي در دسته اول اين به علت قرار گيري ديباگر قبل از كرنل و يا بصورت هم طراز و كمي قبل تر از هسته ( ويندوز خانواده ان تي ) همه چيز رو ميتونن ديباگ كنن اگه بخام چارتي رو معين كنم همچين چيزي ميشه :

    سيستم عامل ويندوز <> كرنل ويندوز <> سافتور ديباگر (مثلا ollydebuger ) <> برنامهاي كه دستگيره اون توسط ollydebuger باز شده است.

    حالت ديگري هستش كه مثل دسته اول ه ولي ديباگر كاملا هم طراز هسته است .
    مثل TRW2000 كه Debugger با هسته بصورت پاياپاي در حال اجرا است و تسلط كامل بر برنامه هاي هسته نداشته ولي تسط كاملي بر برنامه و برنامه هاي ديگر را دارد.

    خوب معلومه كه SI بهتره و بخاطر همين مزيت و ديگر مسائل بهترين Debugger براي Windows شناخته شده البته توي dos هم رو دست نداشت منظورم داس 6.02 و به پايين .

    اين هم خلاصه اي از نحوه عملكرد Debugger ها .ميرسيم به نصب SI.

    نصب SI:
    ابتدا اينجا رو كامل بخوانيد بعدش عمل كنيد

    براي نصب بهتره دو تا ويندوز داشته باشيد يكي 98 براي آموزش كركينگ و و سيستم عامل دوم مورد نظر خودتون

    بعد دانلود softice 4.05 براي ويندوز 98

    هنگام نصب برنامه از شما نوع Monitor نوع موس رو ميپرسه . براي Monitor انتخاب اول بهترينه يعني يونورسيال . ولي براي Mouse اگر موش شما Ps2 باشه بهتره بعد از انتخاب نوع آن جعبه Checkbox زير آن را انتخاب كنيد.(Microsoft IntelliMouse). اگه usb باشه مشكل پيدا ميكننين با موس بايد يه سر به سايت nugma شركت توليد كننده softice بزنين

    البته اگر موس شما در Soft ice درست كار نكرد بعدا مي توانيد ان را از Programs\NuMega SoftICE\Mouse Setup و همينطور براي Monitor از Programs\NuMega SoftICE\Display Adapter Setup تصحيح كنيد.

    خوب بعد از عمليات نصب برنامه دستگاه رو ريست مكنه. بعدشم هم SI نصب شده براي خاطر جمعي از نصب CTRL+ D رو بزنيد بايد يك صفحه مشكي كه بصورت متني است بروي صفحه تون نمايش داده بشه

    براي خروج مي تونيد از X>Enter و يا كليد F5 و يا .... استفاده كنيد . در بعضي از دستگاه ها بعد از برگشت به Windows كليد ها درست كار نكرده . براي رفع مشكل . دكمه Alt رو فشار بدين و بعد ول كنيد .( در صورت درست نشدن همين عمليات رو با كليد CTRLانجام بدين ).

    × اگر اين مشكل رو داشتيد هميشه با SI اين مشكل رو داشته و براي رفع آن از ALT يا Ctrl ( بر اساس تست اوليه ) استفاده كنيد .

    اگر SI رو نصب كرده باشيد تو پوشه نصب شده يك فايل هست به نام loader32.exe كه اسم window ايش Numega Softice Loader .( تو programs توي start توي پوشه SI كليد ميان بر Short cut اون قرار داره.

    بازش كنين تو منوي edit تو قسمت

    SoftIce Initializing setting ...

    مي تونيم Si رو تربيت كنيم. هر دفعه يك تربيت رو ميگم

    General->Initializing Setting

    مقادير زير رو وارد ميكنيد.

    Fault off;Code on; Lines 60; Wc 15;wd 15;x;

    ( براي اينكه بفهميد هر كدوم چي كار ميكنن تو محيط SI توي خط فرمانش بزنيد <مورد نظر > H مثلا :

    H WD

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


    و توي قسمت export اين چند قسمت رو اضافه ميكنيم يعني اينكه اين توابع موجود توي اين برنامه ها رو بشناس .
    EXP=d:\win98\system\kernel32.dll
    EXP=d:\win98\system\user32.dll
    EXP=d:\win98\system\gdi32.dll
    البته بايد مسير ويندوز خودتون رو بذارين .

    فعلا تا بعد.:)
     
  9. QITQ

    QITQ کاربر تازه وارد

    تاریخ عضویت:
    ‏1 اکتبر 2005
    نوشته ها:
    21
    تشکر شده:
    0
    بااينكه از اسمبلي به شدت متنفرم:( ولي به خاطر اين تاپيك بيشتر روش كار ميكنم .
    ممنون آقا سعيد .:)
     
  10. MehdiC#

    MehdiC# کاربر تازه وارد

    تاریخ عضویت:
    ‏2 نوامبر 2004
    نوشته ها:
    55
    تشکر شده:
    0
    محل سکونت:
    ابهر
    سلام سعید جان
    اصلا هم اینطور نیست ، خیلی هم کارت مفیده و داریم استفاده می کنیم ،
    راستش این قسمتای اولش رو میدونستم ، درسته که ماها تازه کاریم ولی نه دیگه انقدر
    ، منتظرم بری رو کار عملی و آموزش کرک کردن یه نرم افزار.
    دستت طلا
     
  11. m3hrz4d

    m3hrz4d Registered User

    تاریخ عضویت:
    ‏21 سپتامبر 2005
    نوشته ها:
    620
    تشکر شده:
    1
    محل سکونت:
    اصفهان
    دستت درد نكنه.منم منتظر بقيشم.
     
  12. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    مي خواستم يه توضيح در مورد api ها از نظر يه كركر بدم ديدم ديگه اين رو همه ميدونن خواستين بگين كه توضيح رو بدم ولي حال
    :::::::::::( كرك آغاز ميشود )::::::::::::::::
    خوب تا حالا با ديباگر ها و تمام موارد مورد نياز اشنا ديم .
    يه توضيح كوتاهي بدم:
    ببينيد هر برنامه نويسي براي هر چند كوتاه تبديل به كركر ميشه . منظورم مهندس معكوس , ميخواد فلان كار رو بكنه ميگه فلان برنامه اين كار رو كرد حالا ميايد و از طريق منطقي و دانشي كه داره برنامه رو بازسازي ذهني مكنه .
    توي مهندسي معكوس اين يه نكته بسيار مهمه !!!!!!!!!!!!!!!!
    ميرسيم به كار عملي :

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

    براي اينكه يه كركر بتونه يه قفل رو حالا هر چيزي كه هست رو تغيير , بازسازي و ... كنه احتياج به اطلاعات، بازسازي ذهني برنامه و نحوه انجام عمليات داره . پس نقطه ضعف يه قفل چگونگي ارتباط با عنصر (كليد) قفله. اين كليد ميتونه : سريال نامبر- اسم- يكه ورودي ريجستري-يه ديسك سخت( فلاپي )- يه برنامه قفل گذارنده روي ديسك سخت( بعضي از برنامه ها روي هارد يه چيزي رو شبيه سازي ميكنن كه به عنوان قفل عمل ميكنه )- يه سخت افزار نصب شونده اعمم از:دانگل- كارت اضافي توسعه دهنده - سخت افزار مربوط( يه سخت افزار كه به پورت اصلي نه پورت مجازي توي tcpip وصل ميشه )

    خوب براي آشنايي بيشتر اول درمورد عمومي ترين نوع قفل گذاري يعني يوزر و سريال نامبر صحبت ميكنيم:
    هر برنامه مبتني بر اين نوع از قفل گذاري براي ادمه كار چكينگ و وجود يا عدم وجود صحت قفل از يه تابع و يا مجموعه اي از توابع استفاده ميكنه. و همه اين توابع بايد يه جوري اين مقدار واردي رو دريافت كنن يا بصورت مستقيم كه در اين روش كامپايلر تصمصم ميگيره كه از چه روشي استفاده بشه بر اساس نوع كامپايلر و نوع ويندوزهاي بچه يا برنامه نويس اين كار رو ميكنه : با استفاده از توابع مختلف كمكي( api ها - Dllها - كتابخانه ها و ...)

    نكته : توي اسمبلي child ها به دسته عناصري گفته ميشن كه داراي دستگيره ميباشن و اصولا با MDI فرق دارن - هر بچه اي توي اسمبلي يه دستگيره ( هندل ) داره و داراي پروسسه هاي جدا گانه است و در صورتي كه اتفاقي افتادكه بايد به بالاتر از خودش گذارش بده اون وقته كه به والد گزارش رد در ميكنه ( برره اي شد يهو )

    **MDI=Multiple document interface**

    توابع اي كه معمولا كامپايلرها براي گرفتن تكس استفاده ميكنن عبارت اند از :
    getwindowtext
    getwindowtexta
    getwindowtextw
    getdlgitemtext
    getdlgitemtexta
    getdlgitemtextw
    getdlgitemint
    و....
    خوب بقه بحث تئوري بمونه براي بعد
    خوب اميد وارم همتون si رو نصب و تنظيم كرده باشيد
    اول برنامه اجرا ميكنيم
    و بعد بازدن ctrl+d وارد siشده و ميزنيم :
    bpx getwindowtexta​
    يعني به si مگيم كه اگه اين تابع صدا زده شده اون برنامه رو متوقف كن و به ما اسمبلي اون رو نشون بده كه كجا بوده
    خوب f5 رو زده و وارد منوي helpشده و گزينه enter password رو ميزنيم
    و يه پسورد الكي مثل saeedsmk وارد كرده وok رو ميزنيم ميبينيم كه يه پيغام كه اشتباه بودن رو نشون ميده نشون داده شد . يعني اين قسمت از برنامه از اين تابع استفاده نميكنه !!!!
    بعد بازدن ctrl+d دوباره وارد siشده و ميزنيم :
    bc*​
    يعني هميه بريك پينته ويا وقفه ها رو پاك كن و بعد ميزنيم
    bpx getdlgitemtexta​
    خوب f5 رو زده و وارد منوي help شده و گزينه enter password رو ميزنيم
    و يه پسورد الكي مثل saeedsmk وارد كرده وok بينگو وارد si شديم( يعني اين قسمت از كد از اين تابع استفاده كرده )
    حالا f11 رو ميزنيم
    يعني اينكه به پروسه اي كه اين تابع يا ساب رو تين رو صدا زده برگردد .
    خوب يه جاي هستيم مثل اين كد

    کد:
    01-:004012C2 E8D5010000                    Call USER32.GetDlgItemTextA
    02-:004012C7 83F801                             cmp eax, 00000001
    :004012CA C74510EB030000           mov [ebp+10], 000003EB
    :004012D1 72CC                                jb 0040129F
    :004012D3 B801000000                     mov eax, 00000001
    :004012D8 EB07                                jmp 004012E1
    :004012DA B800000000                    mov eax, 00000000
    :004012DF EBA1                                jmp 00401282
    :004012E1 50                                       push eax
    :004012E2 FF7508                               push [ebp+08]
    03-:004012E5 E894010000                       Call  USER32.EndDialog
    :004012EA B801000000                     mov eax, 00000001
    :004012EF EB91                                  jmp 00401282
    توي خط دو چك ميشه مقدار eax برابر 1 هست يا نه ( يعني چيزي وارد نشده ) يكي از مقدارهاي برگشتي اين تابع كه اندازه رشته هست توسط eax برگردونده ميشه اگه دقت كنيد eax برابر 8 . توي خط 3 يه تايع ديگه صدا زده شده يعني اينكه ما با ديالوگ باكس ها سر كار داريم پس بعد از خروج از اين تابع كنترل به كرنل يا يوزر برميگرده . حالا اونقدر f10 ميزنيم تا به Ret برسيم حالا يه f10 كنترل به كرنل رسيد.

    نكته - براي اينكه به ret برسيم ميتونيم از p ret استفاده كنيم

    حالا اونقدر f12 ميزنيم تا اختيار به دست برنامه مورد نظر ما برسه

    نكته - براي فهميدن برنامه داراي اكشن به بالاي يا پايين پنجره كد نگاه ميكنيم ( همون پنجره اي كه كد اسمبلي توش نوشته شده ) اين پنجره توسط دو خط بال و پايين از پنجره هاي ديگه جدا شده اگه روي اين خطوط نام اجرايي برنامه ما و يا هيچ چيزي نوشته نشده بود اختيار دست برنامه ما است

    نكته - براي فهميدن يا مشخص كردن پنجره كد توي خط فرمان si ميزنيم wc قسمت كد حذف ميشه (خاموش شده ) و بازدن wc دوباره روشن ميشه .

    خوب اگه درست پيش رفته باشيم به كد زير ميرسيم :

    کد:
    :00401213 6804214000              push 00402104
    :00401218 FF35CA204000            push dword ptr [004020CA]
    :0040121E E849020000              Call USER32.DialogBoxParamA
    :00401223 83F800                  cmp eax, 00000000       <----------- we land hear
    :00401226 74BE                    je 004011E6      <---------- check if cancel clicked or not
    :00401228 687E214000              push 0040217E         <----------*1
    :0040122D E833010000              call 00401365           <----------*2
    :00401232 687E214000              push 0040217E	       <----------*3
    :00401237 E87C010000              call 004013B8          <----------*4
    :0040123C 83C404                  add esp, 00000004      <---------- corect stack memory 
    :0040123F 84C9                    test cl, cl		<---------- test if serial corect
    :00401241 7407                    je 0040124A	<---------5- true: go to show good gay
    :00401243 E801010000              call 00401349    
    :00401248 EB9C                    jmp 004011E6	<----------go to show bad gay
    نكته - با زدن f8 ميتونيم وارد صدازدن ها (call) بشيم و با f10 از روي صدا زدن ها بپريم

    حالا با زدن f8جلو مبريم ( وقتي ميگم رسيدم به خط فلان يعني f10 رو ميزنيم تا به اين خط برسيم و وقتي ميگم ميريم توي تابع يعني f8 زديم و اگه حرفي نزدم يعني f10 رو زديم )به خط 1 ميرسم و ردش ميكنيم حالا اگه توي si بزنيم d 4011e6 توي قسمت ديتا بايد سريالي كه وارد كرديم يعني saeedsmk رو ببينيم .

    كته - براي فهميدن يا مشخص كردن پنجره ديتا توي خط فرمان si ميزنيم wd قسمت كد حذف ميشه (خاموش شده ) و بازدن wd دوباره روشن ميشه .

    خط 1 يعني اين مقدار رو توي حافظه گذاشته و با صدا زدن تابع خط 2 اين مقدار رو تغيير داده و خروجي رو توي همين حافظه برميگردونه ( بر اساس تريس بدرون تابع )

    خط سه هم اين مقدار تغيير كرده در حافظه براي تابع خط 4 ذخيره كرده و اين تابع چكينگ رو انجام داده و اگه چكينگ درست بود مقدار cl رو برابر صفر ميكنه و اگه نبود يه مقدار ي بجز صفر برميگردونه .

    خط 5 هم در صورتي كه سريال درست باشه ( يعني cl برابر 0) به قسمت نشان دادن سريال درست ميره
    خوب اگه كد خط 5 رو بكنيم jmp چي- هيچي هميشه برنامه پيغام درست رو نشون ميده

    براي اين كار
    1- برنامه رو ميبنديم ( ازش خارج ميشيم )
    2- وارد si دشه و با زدن فرمان زير تمامي بريك پوينت ها رو ديسيبل ميكنيم
    bd*​
    3- برنامه اگزه رو با يك هگزا اديتور باز كرده و دنبال اين عبارت ميگرديم
    7407e801010000eb9c و 74 رو با eb تغيير ميديم يعني jz يا je رو با jmp عوض ميكنيم برنامه رو سيو كرده و دوباره اجرا ميكنيم .چك ميكنيم درسته برنامه كرك شد
    كدي كه بالا گفتم دنبالش ميگرديم همون كد خط 5 و دو خط بعد از اونه -

    نكته - توي حالت اگزه كدهاي ماشين پشت هم مياد و اين si كه اون رو براي ما تبديل به كدهاي اسمبلي ميكنه . پس توي فايل ما خطوط جدا از هم نداريم و كدهاي ماشين پشت هم ميادكه هر كدي يه شناسه داره و يه مقدار كه بعدا توضيحشون ميدم

    حالا براي تمرين سعي كنيد بفهميد كه توابع خطوط 2 و خطوط 4 چيكار ميكنن و سريال رو هم اگه تونستيد در بياريد و همينجا پست كنيد. (شيوه معلم هاي خشن )

    كمك:
    1- براي اينكه روي خطي بريك پوينت بزاريد با موس روي پنجره كد كليك كرده و با بالاو پايين كردن خط مورد نظر رو پيدا ميكيم و روش كليك كرده و f9 ميزنيم ويا توي قسمت كامند si ميزنيم
    شماره خطbpx​

    2- براي پاك كردن يه بريك پوينت ميزنيم
    bc num​
    3- كه num شماره بريك پوينت ( يا * براي همه بريك پوينت ها ) كه ميشه با زدن دستور زير بدستش اورد
    bl
    اين دستور ليست بريك پوينت هاي فعال يا غير فعال رو نشون ميده كه اگه يه بريك پوينتي بعد از شمارش * داشت يعني غير فعال شده .
    4- مي تونيم با زدن كد زير بريك پوينتي رو موقتا از كار بندازيم ( num هم كه معلوه شماره بريك پوينته )
    bd num
    يا بجاي num ميتويند از * براي غير فعال كردن همه بريك پوينت هاي گذاشته شده استفاده كرد

    6- مي تونيم با زدن كد زير بريك پوينتي رو كه موقتا از كارانداخته بوديم فعال كنيم ( num هم كه معلوه شماره بريك پوينته (
    be num
    و از * براي ....

    7- و همچنين با زدن كد زير ميتونيم تاريخچه بريك پوينت هاي ست شده رو بدست اوريم :
    bh

    فعلا تا بعد
    اگه تا اون موقه كسي نگفته بود اين توابع چيكار ميكنن:blink: توي جلسه بعد درموردشون بحث مي كنيم :)
    :lol:
     

    فایل های ضمیمه:

    • Crackme1.zip
      اندازه فایل:
      3 KB
      نمایش ها:
      126
  13. m3hrz4d

    m3hrz4d Registered User

    تاریخ عضویت:
    ‏21 سپتامبر 2005
    نوشته ها:
    620
    تشکر شده:
    1
    محل سکونت:
    اصفهان
    سلام آقا معلم.دستت درد نكنه اين آموزش هم خوب بود.سريال برنامه RIDERSOFTHESTORM هستش.
    تابع اولي اول ظاهرا چك ميكنه كه كاراكتر هاي پاسوردي كه وارد شده بين A تا Z هست يا نه اگه نبود 32 تا ازش كم ميكنه .بعد هم تك تك كاراكتر ها رو با كلمه ي Messing_in_bytes XOR ميكنه.
    تابع دوم هم چك ميكنه كه متن جديد برابر با اين هست يا نه :
    1F 2C 37 36 3B 3D 28 19 3D 26 1A 31 2D 3B 37 3E​
    كه اگه بود CL برابر 0 ميشه.حالا اگه ما بيايم اين دو تا كلمه رو XOR كنيم جواب به دست مياد.​

    کد:
    MOV BYTE PTR DS:[402118],0
    MOV ESI,DWORD PTR SS:[ESP+4]
    PUSH ESI
    MOV AL,BYTE PTR DS:[ESI]
    TEST AL,AL
    JE SHORT Crackme1.00401390
    INC BYTE PTR DS:[402118]
    CMP AL,41
    JB SHORT Crackme1.00401385
    CMP AL,5A
    JNB SHORT Crackme1.00401388
    INC ESI
    JMP SHORT Crackme1.00401371
    CALL Crackme1.004013B2
    INC ESI
    JMP SHORT Crackme1.00401371
    POP ESI
    CALL Crackme1.00401399
    JMP SHORT Crackme1.00401398
    RETN
    XOR EBX,EBX
    XOR EDI,EDI
    MOV CL,BYTE PTR DS:[EDI+4021A3]
    MOV BL,BYTE PTR DS:[ESI]
    TEST BL,BL
    JE SHORT Crackme1.004013B1
    XOR BL,CL
    MOV BYTE PTR DS:[ESI],BL
    INC ESI
    INC EDI
    JMP SHORT Crackme1.0040139D
    RETN
    SUB AL,20
    MOV BYTE PTR DS:[ESI],AL
    RETN
    و مرحله 2:​
    کد:
    XOR EDI,EDI
    XOR ECX,ECX
    MOV CL,10
    MOV ESI,DWORD PTR SS:[ESP+4]
    MOV EDI,Crackme1.00402150
    REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    RETN
    

    نمرم چنده (البته از OllyDBG استفاده كردم) ؟؟؟ :D

    فقط من توي كد قبليي كه نوشتي يه چيزي رو نفهميدم :
    0040123C 83C404 add esp, 00000004 <---------- corect stack memory
    اين دقيقا چكار ميكنه؟؟!

     
  14. avajang.com .leftavajang.com.right
  15. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4

    من اقا معلم نيستم !!!!!!!!!!!!! منم مثل شما نو اموزم :)
    خوب كاملا درست گفتي همين كار رو ميكنه
    فقط تابع اول كارش در واقعه تبديل حروف كوچك به بزرگ يعني دستور ucase درvb و تابع Xor اوليه است كه كد ورد شده رو با مقدار messing_in_by_tes و بعد چك كردن با مقدار پيش فرض

    نمره خوبه قبولي:lol: :lol: :lol:

    فرقي نميكنه از چه ديباگري استفاده كردي هر دو جواب مبده اما بهتره روش كارت رو دقيقا توضيح بدي تا يقه كه مي خوان از ollydebuger استفاده كنند روش كار دستشون بياد

    خوب اين برميگرده به نحوه اسمبلي برنامه ها بعضي از اوقات وقتي يه تابع صدا زده ميشه تابع بجاي پوش كردن و پاپ كردن ( يعني ذخيره و بدست اوري متغيرها ) از اين خط دستورات يا شبيه اون استفاده ميكنن
    مثلا براي بدست اوردن متغيري كه مرحله سه است ( يعني دو تا مقدار بعد از اون توي پشته قرار گرفته و فرض اينكه تمام متغيرها چهار بايتي هستند ) از اين دستور استفاده ميشه
    mov eax, [esp+12]​
    ويا براي قرار دادن يه متغير در پشته در مرحله 0 مي نويسن ( بازم چهار بايت طول كلمه مورد نظر )
    mov [esp-4], eax​
    كه اين كد معادل push eax
    نتيجه مقدار Esp كه ادرس پشته است تغيير نكرده ولي مقدارهاي توي پشته ذخيره يا بازيابي شده
    و چون مقدار esp قبل از صدا زدن و بعد از صدا زدن و مقدار هاي گرفته شده بايد برابر بشه ( يعني اگه اين قانون اجرا نشه ممكنه esp به صفر برسه اما بازم متغيري pop بايد بشه ) و يا متغيرهاي درست بازيابي نشن برنامه كرش ميكنه . نتيجتا برنامه بايد بعد از صدا زدن در صورت لزوم پشته رو تنظيم كنه كه بهش ميگن corect stack

    توي برنامه مورد نظر يه مقداري pop شده اما هيچ وقت push نشده ( يا مثلا از يه فانكشن كه مقدار برگشتي رو با پشته برميگردونه به عنوان ساب استفاده شده و مقدار برگشتي مهم نبوده ) و نتيجتا esp تغيير كرده و برنامه اون رو بايد درست كنه

    كلي زور زدم تا بتون اين مفهوم رو برسون نمي دونم تونستم يا نه
    شرمنده داشتم رو يه پروژه كار ميكردم نرسيدم يه تاپيك ديگه بزنم سر فرصت يكي ديگه ميزنم تا اون موقعه فعلا
    :lol:​
     
  16. m3hrz4d

    m3hrz4d Registered User

    تاریخ عضویت:
    ‏21 سپتامبر 2005
    نوشته ها:
    620
    تشکر شده:
    1
    محل سکونت:
    اصفهان
    سلام :) .ممنون متوجه شدم ;)
     
  17. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    plus جان ميتوني روش كارت رو توضيح بدي ؟

    تا يكي مثل من كه با ollydbg غريبه است بيشتر ياد بگيره يا نه؟

    برنامه بعدب رو دام حاضر ميكنم بفرستمش بالا فعلا تا بعد :happy:
     
  18. m3hrz4d

    m3hrz4d Registered User

    تاریخ عضویت:
    ‏21 سپتامبر 2005
    نوشته ها:
    620
    تشکر شده:
    1
    محل سکونت:
    اصفهان
    سلام
    خوب اول فايل Crackme1.exe رو با OllyDBG باز ميكنيم.
    توي خود برنامه ديديم كه اگه سريال رو اشتباه وارد كنيم برنامه Error ميده كه :No luck there, mate
    خوب حالا ما ميخواهيم دنبال اين متن توي كد ها بگرديم تا بتونيم اونجاييكه اين متن نشون داده شده رو پيدا كنيم و كد رو عوض كنيم.

    توي پنجره ي CPU- main thread, module Crackme1 كه Disassembly فايل اصلي ما هستش راست كليد ميكنيم:
    Search For > All Referenced Text Strings رو ميزنيم.ليست همه ي رشته ها مياد.رشته ي مورد نظر رو از توي ليست انتخاب ميكنيم و روش كليك ميكنيم
    برنامه توي همون پنجره ي اصلي به جايي از كد كه از اين رشته استفاده شده ميره.(خط 00401375)
    با توجه به اين خط و 2 سه تا خط قبل و بعدش كاملا مشخصه كه برنامه توي اين قسمت تابع MessageBox رو صدا زده.
    توي همين صفحه اگه به ستون دوم نگاه كنيم ميبينيم كه يه خط كه سرو تهش بستس(مثل كروشه) دوره اين چند تا خط قرار داره(از خط 0041349 تا 0041364)
    تا اونجا كه من ميدونم اين يعني اين چند تا خط كه پيام رو نشون ميدن يه تابع هستش.به اولين خط اين تابع ميريم.(علامت $) .
    وقتي روي اولين خط كليك كنيم پايين پنجره ي اصلي مينويسه: Local Call From 00401243 يعني اينكه خط 00401243 اين تابع رو فراخواني كرده
    به همين خط ميريم.اين خط و خط هاي اطرافش اين طوري هستن:
    کد:
    CMP EAX,0
    JE SHORT Crackme1.004011E6
    PUSH Crackme1.0040217E
    CALL Crackme1.00401365
    PUSH Crackme1.0040217E
    CALL Crackme1.004013B8
    ADD ESP,4
    TEST CL,CL
    JE SHORT Crackme1.0040124A
    CALL Crackme1.00401349 (خطي كه تابع رو فراخواني كرده)
    JMP SHORT Crackme1.004011E6
    CALL Crackme1.00401334
     JMP SHORT Crackme1.004011E6
    از اينجا مشخصه كه اول چك ميشه كه EAX برابر 0 هست يا نه.اگه بود برنامه به جاي ديگه ميره.
    بعد اگه نبود برنامه با فرستان مقدار Crackme1.0040217E تابع هاي Crackme1.00401365 و Crackme1.004013B8 رو فراخواني ميكنه.
    حالا ما ميخواهيم بفهميم اين مقدار ها چي هستن.روي خط PUSH Crackme1.0040217E ميريم(كليك ميكنيم)
    و با زدن F2 يك Break Point درست ميكنيم كه وقتي برنامه به اينجا رسيد متوقف بشه.حالا با زدن F9 برنامه رو اجرا ميكنيم.
    برنامه كه اجرا شد توي قسمت زدن سريال ميريم و سريال رو وارد ميكنيم.
    وقتي OK رو بزنيم و سريال رو وارد كنيم OllyDBG فعال ميشه و صفحه ي اصلي به خطي كه روش BreakPoint زده شده اشاره داره.
    يعني الان برنامه ميخواد اين خط رو جرا كنه.توي همين خط توي ستون سمت راست مقداري كه قراره Push بشه يعني Crackme1.0040217E رو نوشته
    و ما ميبينيم كه اين همين سرياليه كه وارد كرديم.(مثلا نوشته "ASC "serailtest )
    خوب ما از اينجا ميفهميم كه توي اين قسمت ، برنامه سريالي كه ما وارد كرديم رو براي 2 تا تابع ارسال ميكنه و اونها رو فراخواني ميكنه
    و بعد تست ميكنه كه CL برابر 0 هست يا نه.ميبينيم كه اگه CL برابر 0 باشه برنامه به خط 0040124A ميره.
    سراغ اين خط ميريم.ميبينيم كه نوشته CALL Crackme1.00401334 .يعني اينكه توي اين خط تابع Crackme1.00401334 فراخواني شده.
    اگه سراغ اين تابع بريم ميبينيم كه كار اين تابع نشون دادن يه MessageBox حاوي متنيه كه نشون ميده سريال درست وارد شده.
    خوب از اينجا معلومه كه اگه CL صفر باشه همه چي حله.مشخصه كه 0 بودن CL به 2 تابع بالايي بستگي داره.
    ميريم سراغ اولي (Crackme1.00401365)ببينيم چكار ميكنه:
    کد:
    MOV BYTE PTR DS:[402118],0
    MOV ESI,DWORD PTR SS:[ESP+4]
    PUSH ESI
    MOV AL,BYTE PTR DS:[ESI]
    TEST AL,AL
    JE SHORT Crackme1.00401390
    INC BYTE PTR DS:[402118]
    CMP AL,41
    JB SHORT Crackme1.00401385
    CMP AL,5A
    JNB SHORT Crackme1.00401388
    INC ESI
    JMP SHORT Crackme1.00401371
    CALL Crackme1.004013B2
    INC ESI
    JMP SHORT Crackme1.00401371
    POP ESI
    CALL Crackme1.00401399
    JMP SHORT Crackme1.00401398
    RETN
    اينجا رو كه خودت ميدوني چكار ميكنه.اما براي اينكه (اگه ندونيم) متوجه بشيم روي خط اول تابع يه BreakPoint ميزنيم.
    تا حالا برنامه ما روي خط قبليي كه روش BreakPoint زده بوديم متوقف بود.يه بار ديگه F9 رو ميزنيم.
    برنامه اجزا ميشه و به خطي كه BreakPoint دوم رو روش زديم متوقف ميشه.حالا براي اينكه بفهميم كار اين تابع دقيقا چيه
    با زدن F8 يا F7(فرقشون اينه كه F8 از روي Call ها ميپره و اون ها رو يكجا اجرا ميكنه و داخل كد اون ها نميشه) خط به خط برنامه رو اجرا ميكنيم
    همينطور كه داريم F8 ميزم سمت راست برنامه ي اصلي مقداري كه توي ثبات ها هست نشون داده ميشه.با توجه به كد اسمبلي و مقدار ثبات ها
    ديگه بايد كار اين تابع رو متوجه شيم! اما خوب چون همه رو توضيح دادم اين رو هم ميگم.

    خط PUSH ESI رو كه رد كنيم سمت راست ميبينيم كه توي ESI همون رشتهمون قرار گرفت(اين كه واضحه)
    بعد هم توي خط بعدي :
    کد:
    MOV AL,BYTE PTR DS:[ESI] 
    ظاهرا حرف اول از سريالي كه ما وارد كرديم توي AL قرار ميگيره و توي خط بعد هم چك ميشه كه AL صفر هست يا نه.
    اگه صفر باشه كه يعني به انتهاي رشته رسيده و برنامه به خط 0041390 و از اونجا به خط 00410399 كه همون تابع XOR كردنه ميره كه بعدا توضيح ميدم
    اگه CL صفر نباشه طي 2 مرحله(براي هر حرف) چك ميشه كه تك تك حروف بين A تا Z هستن يا نه.اگه نبودن توي خط
    00413B2 يعني : SUB AL,20 از اون ها 32 واحد كم ميشه يعني همونطور كه گفتي تابع UCASE .فهميدن اين مساله با خط به خط اجرا كردن كد خيلي راحت تر ميشه.
    اين رو هم بگم كه بعد از اينكه هر كاراكتر چك شد توي خط INC ESI به ESI يكي اضافه ميشه تا به حرف بعدي سريال ما اشاره كنه و دوباره برنامه به اول تابع ميره تا حرف بعدي هم چك بشه.
    حالا ميرسيم به تابع XOR كردن.اول همين پاراگراف گفتم كه اگه AL برابر 0 باشه يعني اينكه برنامه به انتهاي متن رسيده و همه ي حروف رو چك كرده و بعد از اون تابع 00301399 يعني اين رو فراخواني ميكنه :
    کد:
    XOR EBX,EBX
    XOR EDI,EDI
    MOV CL,BYTE PTR DS:[EDI+4021A3]
    MOV BL,BYTE PTR DS:[ESI]
    TEST BL,BL
    JE SHORT Crackme1.004013B1
    XOR BL,CL
    MOV BYTE PTR DS:[ESI],BL
    INC ESI
    INC EDI
    JMP SHORT Crackme1.0040139D
    RETN
    اگه خطوط اين تابع رو هم تك به تك اجرا كنيم به خط زير ميرسيم:
    کد:
    MOV CL,BYTE PTR DS:[EDI+4021A3]
    حالا از سمت راست مقدارEDI رو چك ميكنيم.اولين باري كه به اين قسمت از تابع برسيم EDI برابر 0 هستش.
    پس از اين خط از كد معلومه كه يه جايي از حافظه با آدرس 0 + 4021A3 توي CL قرار ميگيره.حالا ميخواهيم اين مقدار رو توي حافظه پيدا كنيم.
    از منوي View گزينه ي Memory رو انتخاب ميكنيم.قسمت هاي حافظه دسته بندي شدن .
    چون ما آدرس 4021A3 رو ميخواييم توي ستوي سمت چپ 00402000 رو انتخاب ميكنيم.حافظه از آدرس 00402000 تا 00403000 توي يه پنجره جديد نشون داده ميشه.
    به آدرس مورد نظر ميريم و متن Missing_In_Bytes رو ميبينيم و مشخصه كه خطي كه گفتم حرف اول اين متن يعني M رو توي CL قرار ميده.

    توي خط بعد يعني :
    کد:
     MOV BL,BYTE PTR DS:[ESI] 
    و با ديدن مقدار ESI كه الان برابر سريال ما هست ميفهمين كه حرف اول سريال توي BL قرار ميگيره.
    توي خط بعدي يعني XOR BL,CL مشخصه كه BL و CL با هم XOR ميشن.به خط بعد: MOV BYTE PTR DS:[ESI],BL
    كه رسيديم با ديدن پنجره ي كوچيك زير صفحه ي اصلي كه توش نوشته :
    کد:
    BL=37 ('7')
    DS:[0040217E]=44 ('D')
    متوجه ميشيم كه نتيجه توي همون جايي كه سريال توي حافظه قرار داشت(0042117E) ذخيره ميشه.(با رفتن به اين آدرس از حافظه هم ميشه فهميد)
    با زدن پشت سر هم F8 ميفهميم كه تك تك حروف سريال با متن Missing_In_Bytes تركيب ميشن و توي همون جاي خودشون قرار ميگيرن .به آخر كار اين تابع كه برسيم برنامه ميره با همون قسمت اول:

    کد:
    PUSH Crackme1.0040217E
    CALL Crackme1.004013B8
    ADD ESP,4
    TEST CL,CL
    و با Push كردن سريال جديد تابع دوم رو فراخواني ميكنه:

    کد:
    XOR EDI,EDI
    XOR ECX,ECX
    MOV CL,10
    MOV ESI,DWORD PTR SS:[ESP+4]
    MOV EDI,Crackme1.00402150
    REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    RETN
    با ديدن اين كد توي پنجره ي Memory به آدرس 00402150 ميريم و متن :

    کد:
    00402150  1F 2C 37 36 3B 3D 28 19 3D 26 1A 31 2D 3B 37 3E  ,76;=(=&1-;7>
    رو ميبينم و از كد متوجه ميشيم كه سريال جديد با اين متن مقايسه ميشه و اگه برابر بود CL صفر ميشه(اين تيكه رو خودم هم حدس زدم و از ظاهر كد نفهميدم!اگه ميشه خودت توضيح بده برام)

    حالا براي اينكه ما سريال رو بدست بياريم بايد متني رو پيدا كنيم كه وقتي با Missing_In_Bytes تركيب(منظورم همون XOR) ميشه حاصلش اين بشه:
    ;=(=&1-;7>
    .براي اين كار Missing_In_Bytes رو با اين متن XOR ميكنيم و سريال بدست مياد
    اميدوارم تونسته باشم خوب توضيح بدم.اگه جاييش اشكال داره بگو.در ضمن چون من هنوز تازه كارم ممكنه بعضي از كد ها رو اشتباه بيان كرده باشم خوشحال ميشم اگه اشتباهامو بهم بگي.
     
  19. m3hrz4d

    m3hrz4d Registered User

    تاریخ عضویت:
    ‏21 سپتامبر 2005
    نوشته ها:
    620
    تشکر شده:
    1
    محل سکونت:
    اصفهان
    در ضمن منتظر برنامه بعدي هم هستم
     
  20. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    سلام به همه
    خوب سئوال پرسيده شده اينه ؟
    اين كد چيكار ميكنه :
    کد:
    MOV CL,10
    MOV ESI,DWORD PTR SS:[ESP+4]
    MOV EDI,Crackme1.00402150
    REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
    اين يه روش چكينگه ببين تعداد بايت رو كه ميخواد مقايسه بشه توي cl و يا cx ميگذاريم دو تا استرينگ رو ادرشو توي esi , edi لود ميكنيم و بعد با دستور" cmos .... ادرس ريجيستر اول و دوم مقايسه -"انجام ميشه اگه هر بايتي نخونه همنجا از لوپ مياد بيرون يعني cl و يا cx مقدار بايتي رو در بر داره كه اولين عدم هم خوني وجود داشته
    حالا بجاي .... ميتونه byte و word و... باشه كه نوع واحد رو مشخص ميكنه
    اگه توضيح كم بود بگين بيشتر توضيح بدم

    ادامه تئوري :
    هر برنامه اي كه اجرا ميشه داراي يه هسته مركزي است كه به اين هسته تابع جوابگو گفته ميشه . كار اين تابع در واقع جواب گوي مناسب در راستاي اتفاق هاي انجام شده است
    مثلا اگه روي يه پنجره كليك كنيم يا منوي رو بزنيم اتفاق event اي كه روي ميده عبارت است از wm_command كه اين پيغام به تابع اصلي يا جوابگو فرستاده ميشه و اون تابع بر اساس كيس ها توابع ديگر رو صدا ميزنه .
    البته بايد بگم كه هر بچه اي هم تابع پاسخ گوي خودش رو داره و در صورت تغييرات اي كه بايد والد رو خبر كنه اون هم يه پيغام براي تابع اصلي ميفرسته .
    در واقعه برنامه هاي win32 اشيايي هستند كه توسط پيغام ها يا تحريك شده و يا نميشوند. اگر تحريك بشن يه پاسخ هر چند كه توسط چشم قابل ملاحظه نباشه ولي از نظر سيستم قابل درك توليد ميكنن و در غير اين صورت بصورت مقيقم يا معلق قرار ميگيرن .
    اين تحريك شدن يا توسط يوزر مانند كليك كردن , يا توسط سخت افزار مانند مودم , يا توسط خود برنامه يا برنامه هاي ديگر انجام ميشه .
    پس براي اينكه بتونيم پيغامهاي مناسب ( نه اوني كه توسط برنامه فرستاده ميشه بلكه اوني كه ما ميخوايم ) بفرستيم بايد بتونيم تابع اصلي يا تابع اصلي اون بچه رو مشخص كنيم .

    خيلي چرت و پرت گفتم نه !!!!!!!!!
    بقيه بحث تئوري بعدا
    كار عملي :
    خوب اين برنامه كرك مي كه با msam 7 نوشته شده رو دانلود كنيد .

    برنامه رو اجرا كرده و سعي كنيد با برنامه هاي مثل wdasm و يا ida دي اسمبلش كنيد . من كه نتونستم . نويسنده با دستكار بخش هاي از برنامه برنام رو از حالت وليد سكشن به حالت اينوليد سكشن تبديل كرده .

    خوب توي key no 1 ما يه عدد ميزنيم ( اگه موس رو روش نگاه داري مينويشه كه بايد عدد بزني نه حرف) تعداد اعداد زده شده بر اساس محدوديت برنامه 8 تا است ما هم هر 8 تاشو پر ميكنيم

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

    وارد si شده و روي چند تا از api هاي گرفتن تكس بريك پوينت ميگذاريم و از si خارج شده و دكمه رجيستر رو ميزنيم خوب ميبينمي كه روي getdlgitemtexta بريك پوينت عمل كرد . خوب همه بريك پوينت ها رو با bc* پاك ميكنيم و f11 ميزنيم يه جاي بايد مثل اينجا باشيم ( we land here):
    کد:
    [LEFT]01A7:004012DE  6A14                             PUSH      14                                
    01A7:004012E0  FF7508                          PUSH      DWORD PTR [EBP+08]                
    01A7:004012E3  E8FC850500                 CALL      USER32!GetDlgItemTextA             
    01A7:004012E8  83F808                          CMP       EAX,08    <-----We land here - check if lenght of string
    01A7:004012EB  7405                              JZ        004012F2             equal 8 or not if not go to end 
    01A7:004012ED  E9B2810500                 JMP       004594A4                           
    01A7:004012F2  33C0                              XOR       EAX,EAX                            
    01A7:004012F4  33DB                             XOR       EBX,EBX                            
    01A7:004012F6  33C9                              XOR       ECX,ECX                            
    01A7:004012F8  B108                              MOV       CL,08                              
    01A7:004012FA  BE7CB04500               MOV       ESI,0045B07C   <-----if u d 45b07c u can find ur key
    01A7:004012FF  BF85B04500                 MOV       EDI,0045B085   <-----buffer to recive hex of u code 
    01A7:00401304  E8DC810500                 CALL      004594E5 <---- call function to change dec->hex
    01A7:00401309  A185B04500                  MOV       EAX,[0045B085]  
                                                                                       ^---eax=reverse order of ur hex code
    01A7:0040130E  B103                               MOV       CL,03    <---conter seting
    01A7:00401310  8A9985B04500               MOV       BL,[ECX+0045B085] <---get 2 byte of hcode
    01A7:00401316  0ADB                              OR        BL,BL                              <---- chek if 0 --> bl=05
    01A7:00401318  7502                                 JNZ       0040131C                           
    01A7:0040131A  B305                               MOV       BL,05                              
    01A7:0040131C  99                                    CDQ                                          <---prepare registers
    01A7:0040131D  F7FB                              IDIV      EBX                                <--- start calculating
    01A7:0040131F  03C2                               ADD       EAX,EDX                            
    01A7:00401321  8A997CB04500              MOV       BL,[ECX+0045B07C]                  
    01A7:00401327  0ADB                             OR        BL,BL                              
    01A7:00401329  7502                               JNZ       0040132D                           
    01A7:0040132B  B304                             MOV       BL,04                              
    01A7:0040132D  99                                 CDQ                                          
    01A7:0040132E  F7EB                             IMUL      EBX                                
    01A7:00401330  E2DE                            LOOP      00401310                        <--- go up until cl>=1 
    01A7:00401332  3D00FB0453                 CMP       EAX,5304FB00         <--- check cal result with value
    01A7:00401337  7513                              JNZ       0040134C                           <--- if not ok -->jmp to end
    01A7:00401339  80FB30                        CMP       BL,30                              <--- check 1st leter equl 2 or not
    01A7:0040133C  750E                            JNZ       0040134C                           <--- if not ok--> jmp to end
    01A7:0040133E  80FA07                        CMP       DL,07                              <--- compare dl with 7
    01A7:00401341  7509                              JNZ       0040134C                           <---if not ok --> jmp to end
    01A7:00401343  803D83B0450033        CMP       BYTE PTR [0045B083],33
                                                                                                        ^---check last leter = "3"   01A7:0040134A  7405                              JZ        00401351            <--- if ok--> jmp to continue
    01A7:0040134C  E953810500                 JMP       004594A4                           <--- jmp to end
    01A7:00401351  C70518B0450001000000MOV       DWORD PTR [0045B018],00000001      
                                                                                                                                 ^-- set paramter that
    01A7:0040135B  6A1E                              PUSH      1E                                 mean we pass first protection
    01A7:0040135D  FF7508                          PUSH      DWORD PTR [EBP+08]                 
    01A7:00401360  E879850500                 CALL      USER32!GetDlgItem                  
    01A7:00401365  A328B04500                MOV       [0045B028],EAX                     
    01A7:0040136A  682CB04500               PUSH      0045B02C                           
    01A7:0040136F  FF3528B04500            PUSH      DWORD PTR [0045B028]               
    01A7:00401375  E8A6850500                CALL      USER32!SetWindowTextA              
    01A7:0040137A  6A15                             PUSH      15                                 
    01A7:0040137C  FF7508                         PUSH      DWORD PTR [EBP+08]                
    01A7:0040137F  E85A850500                CALL      USER32!GetDlgItem[/LEFT]                 
    اولا ببخشيد انگليسي من خيلي بده . دوما اونجاي كه نوشتم فلان چيز برابر چيزي با زدن d و به دنبال اون ادرس يا اسم ريجيستر مقدار اون رو توي پنجره ديتا ميتونيد ببينيد.
    خوب حالا معلومه كه چه خطاي و چه نقاطي رو بايد تغيير داد ( خودتون انجام بدين ) براي تبديل فلگ z كوچك ( يعني برابر 0 ) به Z بزيگ ( يعني 1) روي فگ مورد نظر كليك كرده و با زدن دكمه "insert" اون رو عوض ميكنيم .
    با عمل به قسمت هاي بالا ديده ميشه كه دكمه register به go on تغيير كرد و باكسي كه پيغام "ان ريجستر" رو مي داد تبديل شده به 1 to go تبديل شده و يه پنجره مون هم بزرگتر شده و يك تكس باكس هم پايين تكس باكس اوليه ه كد اول رو توش زديم و حالا ديسيبل شده مشخص شد كه بايد كد دوم رو توش بزنيم .
    خوب وارد si ميشيم با زدن bc* همه بريك پوينت ها رو پاك ميكنيم وبا زدن bh ( فهرست بريك پوينت هاي زده ) و انتخاب getdlg item texta ( با اينسرت ) اين بريك پوينت رو فعال ميكنيم ( اگه برنامكه نويس ميخواست كار رو سختر كنه ميتونست از يه روش ديگه براي بدست اوردن كد دوم استفاده كنه . اما چون اين برنامه اموزشي اين كار رو نكرده --------- در ضمن قابل توجه قفل نويسان عزيز --------)و از si خارج شده و يه كد دومي ميديم ( همونطور كه برنامه نويس توسط tooltip گفته بايد حرف باشه ) و روي go on كليك ميكنيم بينگو وارد si شديم اين دومين قسمت پروتكشن با زدن F11 به برنامه اصلي بر ميگرديم و به اين كد ميرسيم :

    کد:
    [LEFT]01A7:004013C7  6A11                PUSH      11              <--- max lenght of string                  
    01A7:004013C9  688AB04500          PUSH      0045B08A           <----bufer to recive string ***1                
    01A7:004013CE  6A15                PUSH      15                                 <---Constant value
    01A7:004013D0  FF7508              PUSH      DWORD PTR [EBP+08]       <--- handel          
    01A7:004013D3  E80C850500          CALL      USER32!GetDlgItemTextA            <--- get text
    01A7:004013D8  83F810              CMP       EAX,10                            <--- we land here
    01A7:004013DB  7405                JZ        004013E2                           <--- check if our code lenght equle to 16(dec)
    01A7:004013DD  E9BE800500          JMP       004594A0                           <-----jmp to end
    01A7:004013E2  33C0                XOR       EAX,EAX                            <----- start some calculating **
    01A7:004013E4  33DB                XOR       EBX,EBX                            
    01A7:004013E6  33C9                XOR       ECX,ECX                            
    01A7:004013E8  33D2                XOR       EDX,EDX                            
    01A7:004013EA  8B0D8AB04500        MOV       ECX,[0045B08A]                     
    01A7:004013F0  030D8EB04500        ADD       ECX,[0045B08E]                     
    01A7:004013F6  A18AB04500          MOV       EAX,[0045B08A]                     
    01A7:004013FB  99                  CDQ                                          
    01A7:004013FC  F73D8EB04500        IDIV      DWORD PTR [0045B08E]               
    01A7:00401402  8B158AB04500        MOV       EDX,[0045B08A]                     
    01A7:00401408  0FAF158AB04500      IMUL      EDX,[0045B08A]                     
    01A7:0040140F  03C2                ADD       EAX,EDX                            
    01A7:00401411  2BC8                SUB       ECX,EAX                            
    01A7:00401413  A18EB04500          MOV       EAX,[0045B08E]                     
    01A7:00401418  0FAFC1              IMUL      EAX,ECX                            
    01A7:0040141B  69C0D2070000        IMUL      EAX,EAX,000007D2                   
    01A7:00401421  8B0D8AB04500        MOV       ECX,[0045B08A]                     
    01A7:00401427  03C8                ADD       ECX,EAX                            
    01A7:00401429  81F1D3070000        XOR       ECX,000007D3                       
    01A7:0040142F  890D8AB04500        MOV       [0045B08A],ECX                     
    01A7:00401435  870D8EB04500        XCHG      ECX,[0045B08E]                     
    01A7:0040143B  890D8AB04500        MOV       [0045B08A],ECX                     
    01A7:00401441  8B0D92B04500        MOV       ECX,[0045B092]                     
    01A7:00401447  870D96B04500        XCHG      ECX,[0045B096]                     
    01A7:0040144D  890D92B04500        MOV       [0045B092],ECX                     
    01A7:00401453  8B0D92B04500        MOV       ECX,[0045B092]                     
    01A7:00401459  2B0D96B04500        SUB       ECX,[0045B096]                     
    01A7:0040145F  A192B04500          MOV       EAX,[0045B092]                     
    01A7:00401464  99                  CDQ                                          
    01A7:00401465  F73D96B04500        IDIV      DWORD PTR [0045B096]               
    01A7:0040146B  8B1592B04500        MOV       EDX,[0045B092]                     
    01A7:00401471  0FAF1592B04500      IMUL      EDX,[0045B092]                     
    01A7:00401478  03C2                ADD       EAX,EDX                            
    01A7:0040147A  2BC8                SUB       ECX,EAX                            
    01A7:0040147C  A196B04500          MOV       EAX,[0045B096]                     
    01A7:00401481  0FAFC1              IMUL      EAX,ECX                            
    01A7:00401484  69C0D2070000        IMUL      EAX,EAX,000007D2                   
    01A7:0040148A  8B0D92B04500        MOV       ECX,[0045B092]                     
    01A7:00401490  03C8                ADD       ECX,EAX                            
    01A7:00401492  81F1D3070000        XOR       ECX,000007D3[/LEFT]                       
    اگه از خط ** بگذريم ميبينيم اين كد هي تكرار ميشه ( با زدن F10) يعني برنامه نويس با نوشتن اين كدها پشت سرهم و عدم قرار دهي اونها توي لوپ سعي كرده كركر رو خسته كنه ( كه روش جالبي بود)
    حالا ما چيكار يايد بكنيم !!!!!!!!!!!!!!1
    استفاده از روش مهندسي معكوس
    1- بعد از محاسبات نتيجه بايد با چيزي مقايس بشه
    2- در صورتي كه درست بود ....
    3-و نه ازتابع خارج بشه
    قسمت سه رو زياد ديدم نه ؟؟؟؟ اما كدوم خروج !خوب خروجي كه مال قسمت دوم پروتكشنه
    يعني اين خط 004594A0
    خوب حال چه جوري مي تونيم به اين خط برسيم
    براي اين كار توي si از دستور g معادل go است استفاده ميكنيم
    دستور خط اون اينه
    g address
    خوب ما هم مينويسيم g 4594a0 و اينتر ميكنيم . ميبينيم كه si روي اين خط وايستاد
    * اگه بعد از زدن g و قبل از اينكه eip با شماره ادرس مورد نظر برابر بشه بريك پوينتي فعال بشه دستور g لغو ميشه
    خوب چند خط بالاتر داريم :

    کد:
    [LEFT]01A7:004593F5  890D92B04500        MOV       [0045B092],ECX                  <--- still calculating  
    01A7:004593FB  8B0D92B04500        MOV       ECX,[0045B092]                    
    01A7:00459401  2B0D96B04500        SUB       ECX,[0045B096]                     
    01A7:00459407  A192B04500          MOV       EAX,[0045B092]                     
    01A7:0045940C  99                  CDQ                                          
    01A7:0045940D  F73D96B04500        IDIV      DWORD PTR [0045B096]               
    01A7:00459413  8B1592B04500        MOV       EDX,[0045B092]                     
    01A7:00459419  0FAF1592B04500      IMUL      EDX,[0045B092]                     
    01A7:00459420  03C2                ADD       EAX,EDX                            
    01A7:00459422  2BC8                SUB       ECX,EAX                            
    01A7:00459424  A196B04500          MOV       EAX,[0045B096]                     
    01A7:00459429  0FAFC1              IMUL      EAX,ECX                            
    01A7:0045942C  69C0D2070000        IMUL      EAX,EAX,000007D2                   
    01A7:00459432  8B0D92B04500        MOV       ECX,[0045B092]                     
    01A7:00459438  03C8                ADD       ECX,EAX                            
    01A7:0045943A  81F1D3070000        XOR       ECX,000007D3                       
    01A7:00459440  890D92B04500        MOV       [0045B092],ECX                <---end calculating     
    01A7:00459446  B904000000          MOV       ECX,00000004                       <----set word to compare
    01A7:0045944B  BE8AB04500          MOV       ESI,0045B08A                     <--- our code change  
    01A7:00459450  BF51B04500          MOV       EDI,0045B051                       <--- check value
    01A7:00459455  F3A7                REPZ CMPSD                                   <--- comp if equle ecx=0
    01A7:00459457  7547                JNZ       004594A0                           <--- if not ok --> go to end 
    01A7:00459459  6844B04500          PUSH      0045B044                           
    01A7:0045945E  6A00                PUSH      00                                 
    01A7:00459460  6A0C                PUSH      0C                                 
    01A7:00459462  6A0A                PUSH      0A                                 
    01A7:00459464  FF7508              PUSH      DWORD PTR [EBP+08]                 
    01A7:00459467  E896040000          CALL      USER32!SendDlgItemMessageA         
    01A7:0045946C  6A1E                PUSH      1E                                 
    01A7:0045946E  FF7508              PUSH      DWORD PTR [EBP+08]                 
    01A7:00459471  E868040000          CALL      USER32!GetDlgItem                  
    01A7:00459476  A328B04500          MOV       [0045B028],EAX                     
    01A7:0045947B  FF3528B04500        PUSH      DWORD PTR [0045B028]               
    01A7:00459481  E828040000          CALL      USER32!DestroyWindow               
    01A7:00459486  6A00                PUSH      00                                 
    01A7:00459488  FF3508B04500        PUSH      DWORD PTR [0045B008]               
    01A7:0045948E  E827040000          CALL      USER32!EnableWindow                
    01A7:00459493  6A00                PUSH      00                                 
    01A7:00459495  FF350CB04500        PUSH      DWORD PTR [0045B00C]               
    01A7:0045949B  E81A040000          CALL      USER32!EnableWindow                
    01A7:004594A0  C9                  LEAVE                                        
    01A7:004594A1  C21000              RET       0010[/LEFT]                          
    خوب بقيه كارا بر عهده شما
    اميدوارم توضيحات كافي بوده باشه و هرجا كه نفهميد بگيد تا اگه تونستم جواب بدم
    راستي اگه تونستيد هم كد اول و هم كد دوم رو در بياريد منكه حوصلم نكشيد
    تا بعد فعلا
     
  21. saeedsmk

    saeedsmk مدیر بازنشسته

    تاریخ عضویت:
    ‏6 سپتامبر 2003
    نوشته ها:
    1,519
    تشکر شده:
    4
    من يادم رفت فايل رو بزارم صداي كسي هم در نيومد جالبه يعني همه اين اين مطلب رو دقيق خوندن ( اديت شده حرفمو پس ميگيرم )
    :blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink:

    به هر حال اين فايل

    ( فايل تصحيح شد )
     

    فایل های ضمیمه:

    • Crackme2.zip
      اندازه فایل:
      8 KB
      نمایش ها:
      93
  22. Persianit

    Persianit Registered User

    تاریخ عضویت:
    ‏19 ژوئن 2005
    نوشته ها:
    910
    تشکر شده:
    16
    محل سکونت:
    پای کامپیوتر