Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

逆向工程代码 обратная код машиностроения

Reverse Code Engineering

Share what I know............... learn what I don’t

آخرین نظرات

اضافه کردن یک DLL به فایل اجرایی

شنبه, ۴ بهمن ۱۳۹۳، ۰۸:۰۰ ب.ظ

روش ها و ابزارهای متفاوتی برای اینکار وجود داره, و برای اهداف مختلفی هم این کار انجام میشه.در اینجا هم ما از روش دستی و تزریق کدهای اسمبلی بجهت آموزش استفاده میکنیم.

کار اصلی ما:

 

1- لود کردن dll توی حافظه هستش (LoadLibraryA)

نکته:توجه داشته باشید که dll توی مسیر فایل باشه وگرنه نمیتونه لودش کنه

 

2- بدست آوردن آدرس تابعی که میخوایم فراخوانی کنیم(GetProcAddress)

 

3- فراخوانی تابع

 

4- آزاد سازی dll (FreeLibrary)  (این کار الزامی نیست میتونید فقط برای مخفی کاری این کارو انجام بدید)


نکته مهم:

توی این مواقع همیشه به قرارداد فراخوانی (یا همون calling-conventions) توجه کنید میشه گفت تقریبا همه توابع API توی ویندوز از STDCALL  استفاده می کنند (که یعنی پارامترها از راست به چپ روی پشته قرار میگیرند)

 

void __stdcall TestProc1(DWORD dwTest, double dTest);

 

حالا بصورت عملی انجام میدیم:

مواد مورد نیاز:

1- یه dll : که اینجا dll ما AddDll هستش و یه تابع به نام HelloWorld داره که با فراخوانیش فقط یه پیغام چاپ میشه و نیاز به هیچ آرگومانی نداره.

 

2- یه برنامه که بهش این DLL رو اضافه کنیم (از  notepad استفاده میکنیم)

 

حالا باید توی برنامه notepad یه فضا واسه اضافه کردن کد پیدا کنیم. برای اینکار notepad رو توی olly باز میکنیم و به قسمت های انتهایی کد میریم تا این فضا رو پیدا کنیم.مثلا من آدرس 010087B0 رو انتخاب میکنم.به نقطه شروع برنامه (0100739D) برمیگردیم و یه پرش به اینجا ایجاد میکنم قبلش باید دستورایی که میخوایم بازنویسی کنیم رو کپی کنیم.

نقطه ورود قبل از بازنویسی



نقطه ورود بعد از بانویسی




با اجرای برنامه, ابتدا به مکانی که ما تعیین کردیم پرش میشه. حالا باید کدهامون رو با توجه به ترتیبی که بالا گفتیم و قرارداد فراخوانی اضافه کنیم.

یه نکته دیگه هم اینه ما برای استفاده از رشته ها اول باید اونها رو توی یه قسمت ذخیره کنیم بعد از آفستش استفاده کنیم.یعنی اگه بخوام نام یه dll روی به تابع LoadLibraryA بفرستم اول باید اون رو جایی ذخیره کنم بعد آفستش رو به این تابع بفرستم.

پس با این توضیحات کد ما یه چیز تو مایه های این باید باشه:

push offset "AddDll.dll"   ; آفست نام کتابخانه روی پشته قرار میگیره
call LoadLibraryA              ; این تابع با آفست بالا فراخوانی می شه
push offset "HelloWorld"  ;  آفست روی پشته قرار میگیره,اگه نام نباشه اوردینال رو روی پشته قرار میدیم
push eax                              ; مقدار برگشتی تابع بالا توی این رجیستر هستش که رو پشته قرارمیدیم
call GetProcAddress            ; این تابع با دو آرگومان بالا فراخوانی میشه
push parameter1                   ; اگه تابع ما پارامتر داشته باشه  روی پشته قرار میدیم
call eax                                ; اینجا تابع ما فراخوانی میشه

حالا من نام dll (AddDll.dll) و نام تابع (HelloWorld) رو بالاتر از فضایی که پیدا کردم قرار میدم.


آفست شروع AddDll.dll (01008789) و آفست شروع HelloWorld (01008796) هستش.

 

مسئله دیگه ای که یادم رفته بود بگم قبل از اضافه کردن کد, نحوه فراخوانی توابع هستند یعنی ما اینجا نمیتونیم بنویسیم Call LoadLibraryA باید آدرس این تابع رو بدست بیاریم و ازطریق آدرسش فراخوانیش کنیم.

نحوه بدست آوردن آدرس توابع هم آسونه توی ollydbg دکمه های ctrl+N رو بزنید بعد توی پنجره ای که باز میشه نام توابع رو تایپ کنید بعد از پیدا کردن روی تابع راست کلیک کنید و گزینه ای که در شکل میبینید رو انتخاب کنید بعد ما به آدرس تابع میریم.آدرس تابع رو بردارید تا ازش استفاده کنیم.



حالا کدهارو وارد میکنیم:


توی شکل بالا, خط آخر جریان اجرای برنامه رو دستورات بعد از پرش اولی که ساختیم برمی گردونه, و دو خط بالای این پرش هم همون کدهایی هستش که بازنویسی شون کردیم.

 

بعد نتیجه رو ذخیره میکنیم و تست میکنیم میبینیم که اول یه پیغام نمایش داده میشه بعد notepad اجرا میشه. یادتون باشه که dll باید توی دایرکتوری باشه که notepad هستش.

 

اگه جایی رو متوجه نشدید بگید تا توضیح بیشتر بدم.

حاصل کارو ازینجا دانلود کنید

موفق باشید.

pass : pcrlth0n 


  • موافقین ۲ مخالفین ۰
  • ۹۳/۱۱/۰۴
  • ۱۹۸۳ نمایش

تزریق کد

نظرات (۴)

پسورد فایل قرار داده شد.
Pass: pcrlth0n
سلام
ممنون
عالی بود!
سلام . مفید . مختصر . کاربردی 
ممنون 

سلام وبلاگ خیلی خوبی دارین بار ها شده به وبلاگ مراجعه کردم برا آموزشای بیشتر ولی ظاهرا جدید نمیزارید !
کامل پست رو نخوندم ولی چجوری میشه این کارو با کد انجام داد !؟
از این مورد میتونید مثالی بگزارید !؟
پاسخ:
سلام دوست عزیز، ممنون از لطفتون
بله متاسفانه فرصت پیش نمیاد تا مطلب قرار بدم، ولی در اسرع وقت اینکارو میکنم.
سوالتون رو متوجه نشدم ،اگه منظورتون اضافه کردن کد بتنهایی هستش به یه فایل اجرایی، مثل کد لود کردن dll ، که فقط کافیه کمی اسمبلی بلد باشید یا اینکه با سی بنویسید و دیس اسمبل شدش رو با کمی تغییرات قرار بدید، برای کدهای کوچیک مناسبه، اگه کد بزرگی بخاید قرار بدید یه سری مشکلات از جمله توابع ویندوزی و این جور چیزاها اذیتتون میکنه و برای کدهای زیاد توصیه نمیشه، و روشهای دیگه مثل قرار دادن کدتون تو dll یا یه سکشن اضافه شده، مناسب تره
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی