سلام
خوب هستيد
mri_6889 نوشته است:من هم برنامه آقا امین رو دیدم، و هم کرک آقا سعید رو. هر دو خیلی جالب بودند.
امّا آقا سعید، فکر کنم اصلا برای کرک هیچ کاری(مثلا برنامه نویسی و دستکاری سورس و...) نکردی بلکه یه برنامه بوده که آدرس برنامه اصلی رو بهش میدادی و اون دکمه پتچ رو میزدی و کرک تحویلت میشده.
خيلي ممنون از نظرتون
اما در مورد اينكه برنامه اي استفاده كردم
بله يك ديباگر !!!!!!!! يعني همون اولي ديباگر نه يك برنامه اصلي كه بياد و اتوماتيك كار رو انجام بده !!!!
فكر كنم چون پچر رو ديد اينطور فكر كرديد.
بعد از كرك چون بايد دوباره فايل اصلي رو اپ ميكردم و اينترنتم سريع نبود ( توي خونه ) يك پچر ساختم كه حجم كمتري داره همين!
اتفاقا برنامه نويسي كردم نه با زبان هاي سطح بالا نه!! با زيان سطح پايين يا همون اسمبلي اون قسمت هاي كه امير جان گفتند رو خودم نوشتم پس برنامه نويسي كردم .
يه چيز جالب يكي ميگفت برنامه نويسي سطح اسمبلي برنامه نويسي نيست !!!!!!!!!!
اما امير جان
نقل قول: حالا سوال من از آقا سعید تو همون تصویر دوم هست که رمز اصلی رو چطوری محاسبه می کنن .
من محاسبه نكردم امين جان دستش درد نكننه اين كار رو ايشون كرده!!!!!!!!!
فكر كنم يك ذره مبهمه
بگذاريد توضيح دهم :
همانطور كه ميدوني وي بي يك زيان مفسره اي نه كامپايلري : يعني دستورات فايل وي بي به ران تايم هاش وابسطه است .
خوب بر اساس كار با برنامه هاي وي بي در سطح ديباگر يك چيز هاي ادم ياد ميگره مثلا چگونگي چك شدن دو تا استرينگ
كد نمونه اون اينه :
push eax ذخيره استرينگ اول
push ecx دخيره استرينگ دوم
.
.
.
call __vbavartstEq
خوب توي كد برنامه اقا امين هم اين كد چك كردن وجود داشت
eax شامل كد اصلي است توي برنامه اقا امين .
براي نمايش دادن اين كد ابتدا بايد كد در جايي ذخيره بشه و بعد هنگام نمايش اين كد توي حافظه ذخيره بشه تا نمايش داده بشه
چند نكته هنگام اضافه كردن توابع به فايل ها :
هميشه كدي رو كه اضافه ميكنيد براي اينكه استيك تغيير نكنه و برنامه كرش نكنه توي pusha و popa ميگذاريم تا مشكلي به وجود نياد
و اينكه كد هاي كه بجاشون دستور جامپ گذاشتيم رو بايد بعد از popa قرار دهيم و سپس به خط اي كه بعد خطوط اشغال شده با دستور جامپ پر شده اند پرش كنيم
و در وي بي استرينگ ها بصورت مستقيم اشاره نميشن
مثل eax برابر 1525c است شما در اين ادرش چيزس نميبنيد بچز مثلا 8 اما ميدونيد اين بايد اشاره گر به استرينگي باشد اما چيزي جز يك 8 نداريم !!!!!!!
اين 8 يعني ادرس محل ذخيره استرينگ eax+8 است و يا اگر اين عدد 1f بود محل ادرسي كه استرينگ توشه ميشد eax+1f حال فرض كنيم در اين حال عدد 00 15 f3 1c توي اين ادرس باشد يعني استرينگ توي ادرس 00151cf3 قرار دارد
توضيح كد هاي اضافه شده ( بر اساس تصاويري كه امير جان گذاشته اند )
تصوير 2
ابتدا از همه متغير ها يك بك اپ ميگريم خط 4195bd
خط بعدي ebx رو صفر ميكنيم
خط بعد همون عدداي رو كه بايد به eax اضافه شه تا به ادرس محل كد برسيم رو توي bl ميريزيم
خط بعد به eax اين مقدار رو اضافه ميكنيم يعني حالا eax خودش ادرس - ادرسي كه محل ذخيره رو داره رو در بر داره ---- به دوتا ادرس توجه كنيد
خط با استفاده از دستور اي كه ميبنيد محلي كه Eax بهش اشاره ميكنه رو به ebx منتقل ميكنيم . در واقعه محتوي ادرس اي كه Eax داره رو ميزيزيم توي ebx يعني يك ادرس از ادرس - ادرس محل ذخيره حذف ميشه : ادرس محل ذخيره اي كد درست ( قبلا توي برنامه اي كه اقا امين نوشته اند جهت تست با كدي كه ما وارد كرده بوديم حساب شده بود )
يك متغيير مي سازيم از كدمون كه اين ادرس رو ذخيره كنه
خط بعد محل ذخيره اين ادرس رو توي ecx ميريزيم
خط بعد حال ادرس محل ذخيره رو به درون ادرسي كه ecx به اون اشاره ميكنه انتقال ميديم
خط بعد تمامي ريجيستري ها رابه حالت اول بر ميگردونيم
سه خط بعد و جامپ بعد از اون در واقعه كد هاي كه براي جامپ به كدمون تغيير داديم و پرش به محل اصلي است
حال ميرسم به تصوير شماره 4
ما ميدونيم كه eax اشاره گر درجه 2 به متني كه بايد نشون داده بشه پس مي ايم و ادرس رشته اي كه متغير اشتباه است رو تغيير ميديم به ادرس اي كه شامل كد صحيح است
خط 1 و2 وو 43 مثل شكل 2 است يعني همان كار ها را مينمايد
خط 5 : محل ذخيره كد درست ك هتوي قسمت قبل نوشته بوديم رو ميزيريم ت وي ecx
خط 6 : ادرس محل كد رو بااين دستور ميزيريم توي ecx
خط 7 :محل ادرس پيغام خطا رو كه توي eax با ادرس محل ذخيره كد درست تغيير ميديم
خط 8 : تمامي ريجيستري ها رابه حالت اول بر ميگردونيم
دو خط بعد و جامپ بعد از اون در واقعه كد هاي كه براي جامپ به كدمون تغيير داديم و پرش به محل اصلي است
همانطور كه ميبينيد توي اسمبلي يك كار ساده چقدر دردسر داره
اميدوارم توضيحات كامل بوده و كمك كنه