۱۹-مرداد-۱۳۸۶, ۱۹:۵۴:۱۹
دیدم چند روزیه که بحث اینجکشنو حلقه ها خیلی داغ شده برا همین تصمیم گرفتم آموزشش رو بزارم اینجا
البته این آموزش در چهار قسمت خواهد بود که من در چهار مقاله کوتاه اونا رو بیان میکنم و اما در این قسمت به طور خلاصه یک پیش مقدمه در باب تعریف اینجکشن و چهار روش Injection میزارم امیدوارم که مفید باشه
این آموزش صرفا برای برنامه نویسان زبان ویژوال بیسیک نیست و برنامه نویسان زبان سی++ حتی بهتر میتونن از اون بهره ببرن
سطح مقاله هم متوسط به بالاست
موضوع به دام انداختن پیغامها همیشه یکی از مهمترین بحثها بین برنامه نویسان بوده و منم که علاقه بسیار شدید به این مبحث دارم خوب نتیجه تمام تحقیقاتمو میزارم برای همه
در واقع اینجکشن کد با استفاده از حلقه ها یا توابعی که معرفی خواهم کرد به شما این اجازه رو میدن که بتونین کنترول یک قسمت مشخص از کد اجراشده از یک پروسس رو در دست بگیرید و در واقع حلقه ها به شما اجازه تغییر رفتار برنامه هایی رو میده که شما حتی سورس اون برنامه ها رو هم ندارید
خیلی از برنامه های بزرگ دنیا از همین تکنیک حلقه ها استفاده میکنن که بتونن قدرت مانور خودشون رو در سیستم عامل افزایش بدن
همونجور که میدونیم از سیستم عامل داس و سیستم ویندوز xxx.3 به بعد بود که ما شاهد قسمتی بودیم که میتونست آدرس پروسس ها رو بطور جداگونه در جایی برای دسترسی به اونا ذخیره کنه یعنی در ویندوز 9x و NT/2K و XP این دسترسی ها ایجاد شد
خوب فایده کلی که این جور برنامه ها دارن (جاسوسی با حلقه ها) اینه:
موارد اساسی که برای ایجاد یک حلقه احتیاج دارین
خوب در این مرحله شما باید محیط کاری و نیازمندی های خودتون رو اجرا کنید
منظور اینه که شما میخوای فقط یک برنامه رو کنترول کنید لازم نیست حلقه رو به صورت گسترده(Wide) پیاده کنید اما اگر میخوایین کل پیغام های سیستم رو کنترول کنید اصلا بزارید با یک مثال توضیحش بدم مثلا اگه شما بخوای فقط تابع TerminateProcess رو جاسوسی کنید مجبورید حلقه رو روی سیستم به صورت گسترده پیاده کنید چون تقریبا تمام برنامه ها از این تابع استفاده میکنند
خوب به اختصار فقط نام روشها رو اینجا مینویسم و در مقاله های بعد به صورت کامل اونا رو توضیح میدم
البته در پایین چهار روش رو گفتم که روش اول در واقع یک ترفند هست و آسانترین و بهترین روش(از نظر من) که باعث اینجکت کد در پروسه های دیگه میشه
خوب میخواییم حول این چهارتا روش یک مسیررو دنبال کنیم و اونم بدست آوردن محتوای TextBoxها در پروسه های دیگه هست که دارای Styleی با نام ES_Password هستند
برای بدست آوردن محتویات یک TextBox که میتواند به پروسه شما متعلق باشد یا نه به طور معمول از پیغام WM_GETTEXT استفاده میکنیم بصورت زیر
که در خط بالا مقدار یا محتوای TextBox در متغیر Buffer قرار میگیرد
حال اگر این TextBox متعلق به یک پروسه دیگه باشه و همچنین دارای Styleی با نام ES_PASSWORD باشه نمیتونیم اون محتوا رو بصورت معمول بدست بیاریم برای این کار مجبوریم به اینجکشن رو بیاریم
در آموزش هایی که قرار خواهم داد چهار روش رو توضیح خواهم داد
راستی اگه نظراتتون رو ندید آموزش ها رو نمیزارم ها
سوالاتتون رو هم حتما بپرسین اگه مطلبی هم برای کامل کردن مقاله ها داشتین حتما بگین
البته این آموزش در چهار قسمت خواهد بود که من در چهار مقاله کوتاه اونا رو بیان میکنم و اما در این قسمت به طور خلاصه یک پیش مقدمه در باب تعریف اینجکشن و چهار روش Injection میزارم امیدوارم که مفید باشه
این آموزش صرفا برای برنامه نویسان زبان ویژوال بیسیک نیست و برنامه نویسان زبان سی++ حتی بهتر میتونن از اون بهره ببرن
سطح مقاله هم متوسط به بالاست
موضوع به دام انداختن پیغامها همیشه یکی از مهمترین بحثها بین برنامه نویسان بوده و منم که علاقه بسیار شدید به این مبحث دارم خوب نتیجه تمام تحقیقاتمو میزارم برای همه
در واقع اینجکشن کد با استفاده از حلقه ها یا توابعی که معرفی خواهم کرد به شما این اجازه رو میدن که بتونین کنترول یک قسمت مشخص از کد اجراشده از یک پروسس رو در دست بگیرید و در واقع حلقه ها به شما اجازه تغییر رفتار برنامه هایی رو میده که شما حتی سورس اون برنامه ها رو هم ندارید
خیلی از برنامه های بزرگ دنیا از همین تکنیک حلقه ها استفاده میکنن که بتونن قدرت مانور خودشون رو در سیستم عامل افزایش بدن
همونجور که میدونیم از سیستم عامل داس و سیستم ویندوز xxx.3 به بعد بود که ما شاهد قسمتی بودیم که میتونست آدرس پروسس ها رو بطور جداگونه در جایی برای دسترسی به اونا ذخیره کنه یعنی در ویندوز 9x و NT/2K و XP این دسترسی ها ایجاد شد
خوب فایده کلی که این جور برنامه ها دارن (جاسوسی با حلقه ها) اینه:
- جاسوسی کردن بر سر توابع فراخوانده شده که شما رو قادر میکنه که بتونین یه سری عملیات مخفی حین فراخونی اون تابع داشته باشین(البته برداشت بد نکنین)
- در کنار روشهای استاندارد برای دیباگ کردن حلقه ها میتونند یکی از کمک کننده ترین برنامه ها برای اشکال یابی در این قسمت باشن
- و آخرین و مهمترین قسمت هم تغییر در ساختار اجرایی برنامه هاست برای ایجاد عملکردی بهتر یا ساختن محیط اجرایی برنامه به صورت اختصاصی برای پیشبرد اهداف شما

خوب در این مرحله شما باید محیط کاری و نیازمندی های خودتون رو اجرا کنید
منظور اینه که شما میخوای فقط یک برنامه رو کنترول کنید لازم نیست حلقه رو به صورت گسترده(Wide) پیاده کنید اما اگر میخوایین کل پیغام های سیستم رو کنترول کنید اصلا بزارید با یک مثال توضیحش بدم مثلا اگه شما بخوای فقط تابع TerminateProcess رو جاسوسی کنید مجبورید حلقه رو روی سیستم به صورت گسترده پیاده کنید چون تقریبا تمام برنامه ها از این تابع استفاده میکنند
خوب به اختصار فقط نام روشها رو اینجا مینویسم و در مقاله های بعد به صورت کامل اونا رو توضیح میدم
البته در پایین چهار روش رو گفتم که روش اول در واقع یک ترفند هست و آسانترین و بهترین روش(از نظر من) که باعث اینجکت کد در پروسه های دیگه میشه
- روش اول قرار دادن کدمون در یک Dll و اینجکت کد با استفاده از رجیستری
- روش دوم قرار دادن کدمون در یک Dll و اینجکت کد با استفاده از حلقه ها
- روش دوم قرار دادن کدمون در یک Dll و اینجکت کد با استفاده از دو تابع CreateRemoteThread & LoadLibrary
- و روش آخر به جای استفاده از درست کردن Dll کدمون رو مستقیم با استفاده از تابع WriteProcessMemory به پروسه مذکور اینجکت کنیم و توسط CreateRemoteThread اونو اجرا کنیم
خوب میخواییم حول این چهارتا روش یک مسیررو دنبال کنیم و اونم بدست آوردن محتوای TextBoxها در پروسه های دیگه هست که دارای Styleی با نام ES_Password هستند
برای بدست آوردن محتویات یک TextBox که میتواند به پروسه شما متعلق باشد یا نه به طور معمول از پیغام WM_GETTEXT استفاده میکنیم بصورت زیر
کد:
SendMessage hWnd, WM_GETTEXT, 256, Buffer
که در خط بالا مقدار یا محتوای TextBox در متغیر Buffer قرار میگیرد
حال اگر این TextBox متعلق به یک پروسه دیگه باشه و همچنین دارای Styleی با نام ES_PASSWORD باشه نمیتونیم اون محتوا رو بصورت معمول بدست بیاریم برای این کار مجبوریم به اینجکشن رو بیاریم
در آموزش هایی که قرار خواهم داد چهار روش رو توضیح خواهم داد
راستی اگه نظراتتون رو ندید آموزش ها رو نمیزارم ها

سوالاتتون رو هم حتما بپرسین اگه مطلبی هم برای کامل کردن مقاله ها داشتین حتما بگین