Reverse Code Engineering

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

Reverse Code Engineering

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

Reverse Code Engineering

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

آخرین نظرات

۱۶ مطلب در بهمن ۱۳۹۳ ثبت شده است

توی برنامه نویسی از دستور if برای تغییر روند اجرا مبتنی بر یک شرط خاص استفاده میشه که ما میخوایم اینجا به بررسی کدهای دیس اسمبل تولید شده با دستور if بپردازیم.

در زیر کد زبان سی و همچنین کد دیس اسمبل شده ی اون رو مشاهده میکنید توجه کنید که دستور if در اینجا با پرش شرطی jnz پیاده سازی شده البته توی کدهای دیس اسمبل شده این یادتون باشه که هر پرش شرطی دلیل بر وجود دستور  if نیست.


int x = 1;

int y = 2;

 

if(x == y){

      printf("x equals y.\n");

}

else{

      printf("x is not equal to y.\n");

}

کد دیس اسمبل شده برنامه بالا:

00401006        mov     [ebp+var_8], 1

0040100D        mov     [ebp+var_4], 2

00401014        mov     eax, [ebp+var_8]

00401017        cmp     eax, [ebp+var_4]  (1)

0040101A        jnz     short loc_40102B  (2)

0040101C        push    offset aXEqualsY_ ; "x equals y.\n"

00401021        call    printf

00401026        add     esp, 4

00401029        jmp     short loc_401038  (3)

0040102B loc_40102B:

0040102B        push    offset aXIsNotEqualToY ; "x is not equal to y.\n"

00401030        call    printf

با تغییر دادن بعضی از فیلد های فایل های اجرایی (PE) میشه عملکرد بعضی از نرم افزارهای مهندسی معکوس مثل olly رو مختل کرد.



عبارت junk code رو احتمالا توی مباحث مرتبط با مهندسی معکوس مثل مبهم سازی , Anti reversing , کدهای چندریختی و ... باهاش مواجه شدید.

توی این پست قراره در مورد junk code ها به صورت خلاصه توضیح بدم تا یه آشنایی کلی باهاش پیدا کنید.

 

Junk code چیست؟

خوب همونطور که از اسمش پیداس, کدهایی هستند که کاری انجام نمیدند و روی عملکرد برنامه هم تاثیری ندارند و فقط فضایی رو بین دستورات اصلی برنامه اشغال می کنند.

 

دلیل استفاده از junk code ها؟

دلیل استفاده از این هم میتونه متفاوت باشه, میشه برای مبهم کردن عملکرد برنامه برای آنالیز کننده, ناشناس کردن یه بدافزار برای آنتی ویروس, کندتر کردن روند مهندسی معکوس و محافظت بیشتر از نرم افزار استفاده کرد.

 

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

البته این روش هم دارای یه سری نقاط ضعف هستش,بعنوان مثال کدهای بلااستفاده بیشتر روند مهندسی معکوس روی توی آنالیز ایستا سخت می کنند نه آنالیز پویا, این کدها رو میشه با کمی تجربه تشخیص داد یا میشه با نوشتن اسکریپت هایی برای Olly یا IDA این کارو بصورت اتوماتیک انجام داد.

 

یه سری از دستورات اسمبلی که هیچ کاری انجام نمیدند رو در زیر مشاهده میکنید:


• NOP                       ;No Operation

• PUSH AX POP AX            ;push ax onto the stack and then pop it back off

• XCHG BX,BX                ;trade BX for BX (same as NOP literally in 8086)

• MOV AX,AX                 ;move ax register to AX register

• ROL AX,CL ROR AX,CL       ;rotate register left then rotate right.

• INC CX DEC CX             ;increase CX decrease CX


میتونید از ترکیب دستورات بالا استفاده کنید و یه بلوک کد بلااستفاده همراه با یه سری پرش ایجاد کنید, خلاقیت توی junk code ها حرف اول رو میزنه:)

 

نکته: البته یادتون باشه اگه از دستوراتی استفاده می کنید که روی رجیسترها تاثیر میزارند حتما قبلش رجیسترها رو داخل پشته ذخیره کنید (pushad) و بعد از اتمام کار رجیسترها رو به حالت اول برگردونید (popad)

خوب همونطور که میبینید اینم یه نقطه ضعف هستش و jnuk code هارو لو میده:)

 

توی زبان های سطح بالا, ایجاد junk code ها خلاقیت برنامه نویس رو بیشتر میطلبه. میتونید یه کلاس برای اینکار تعریف کنید و هر از چندگاهی اونرو لابه لایه کدهای برنامتون بکار ببرید ...

 

می تونید برای نمونه کد یا دستورات جستجو کنید. 

اینم یه نمونه junk code دیس اسمبل شده توی IDA:


میبینید که با دستور pushad شروع شده

پایین هم انتهای این کد رو مشاهده می کنید که با دستور popad تمام رجیسترها به حالت اول برمیگرده.





انواع مختلفی از عملیات ریاضی رو میشه توی زبان سی پیاده سازی کرد در اینجا هم ما چند نمونه از این عملیات رو مثل جمع و تفریق, - - , ++ و % رو مورد بررسی قرار میدیم.

کد برناممون هم بصورت زیر هستش:

int a = 0;

int b = 1;

a = a + 11;

a = a - b;

a--;

b++;

b = a % 3;

این یک کتابخانه ی ویندوزی هستش که وابسته به کتابخانه های پشتیبانی شده نیست. شما می تونید ازش برای خوندن شماره سریال هارد دیسک استفاده کنید,همانطور که می دونید این شماره سریال منفرد هستش و از این شماره سریال می تونید برای ساختنن یک Machine ID یا encrypt number استفاده کنید.

بیشتر زبان های برنامه نویسی رو هم پشتیبانی می کنه.

خصیصه های اصلی:

* Easy to obtain the serial number of hard disk.
* Any operation can not to change the serialnumber of harddisk, include Format and Partition etc.
* Retrieve REAL serial number of hard disk. NOT Partition ID, NOT Volume ID.
* Support reading several physics hard disks.
* Many development languages are supported, such as the Delphi, C++Builder, VC, C#, VB, VB.NET, PowerBuilder, Visual Foxpro, Microsoft VBA, Clarion etc is available.
* Read more parameters, such as Model Number, Revision Number, Buffer Size, Cylinders, Heads, Sectors per track, etc.
* Not require administrator rights in Windows 7/Vista/2003/XP/2000/98.


لینک دانلودش اینجاس , این نسخه trial هستش.


برای پروژه های دلفی هم از این استفاده کنید که البته رایگان نیستش.


ImpREC, CHimpREC, Imports Fixer ... همه اینها ابزارهای خوبی برای بازسازی جداول ورودی (import table) هستند. اما دارای اشکالاتی هم هستند.


Scylla مزایای زیر رو داره:

•x64 and x86 support
•full unicode support
•written in C/C++
•plugin support (ImpREC plugins are supported)
•works great with Windows 7

نویسنده این ابزار پیشنهاد میکنه که اونرو توی ویندوز سون نسخه ی 64بیتی استفاده کنید,چونکه برای این سیستم عامل طراحی شده و ممکنه توی سیستم عامل های دیگه کمی دچار مشکل بشه


قابل دانلود از:

https://github.com/NtQuery/Scylla

PE analysis toolkit

۱۰
بهمن

pev یه پروژه متن باز هستش که برای آنالیز فایل های اجرایی نوشته شده, این toolkit شامل چندین ابزار برای بررسی فایلها هستش که لیستش رو در زیر مشاهده می کنید:


* pehash - calculate PE file hashes
* pedis - PE disassembler
* pepack - packer detector
* pescan - search for suspicious things in PE files, including TLS callbacks
* pesec - check security features in PE files
* pestr - search for unicode and ascii strings in PE files
* readpe - show PE file headers, sections and more
* rva2ofs - convert RVA to raw file offsets
* ofs2rva - convert raw file offsets to RVA


نکات اصلی این toolkit :


- No need for Windows API. We use our own PE library called libpe.
- Tested on Windows, Linux and OS X.
- Support for 32 and 64-bit PE files.
- Written entirely in C, using C99 standard. So, it's multiplatform.
- Fully scriptable. All pev tools uses CLI and produces outputs in clear text and CSV (HTML, XML and JSON in development).


در کل بنظرم ارزش معرفی رو داشت, هرچند که یکم من باهاش مشکل دارم:)
میتونید از اینجا دانلودش کنید.


Enigma Protector

۱۰
بهمن

سیستم قوی برای محافظت از فایل های اجرایی.
تو سایتش که اینطور معرفی کرده:)

ویژگی های این پروتکتور:

File Protection

    A range of features and technologies to help protect the executable file from hacking, analysis, modification and disassembly. A Virtual Machine technology enables part of the application and protection code to be executed in its own virtual CPU, which makes the code practically impossible to analyze.


 Licensing System

    The licensing system allows prompt integration of registration key verification functions, binding license to a specific computer, limiting the term of license. Rich functionality of the licensing system allows you to create your own key generators and to use the built-in or easily customizable CGI key generators.


 Virtual Box

    The unique technology which allows combining the files used by your application into a single module without loss of efficiency. This function supports all kinds of files, including dll, ocx, mp3, avi, etc. Virtual Box will protect your files and prevent them from being copied and used in third-party products.


محصولات دیگه هم داره که میتونید توی سایتش مشاهده کنید:

http://enigmaprotector.com

آخرین نسخش تا اونجا که می دونستم 9.3.3 بودش, یه دیباگر برای ویندوز7 و ماقبلش هستش, البته نسخه ی 64 بیتی هم داره (نسخه 2.9) که نیاز به NET framework. داره و باهاش میشه برنامه های NET. رو هم دیباگ کرد.البته این دیباگر قابلیت دیباگ سورس کد رو نداره.


میتونید از اینجا هر دو نسخه رو دانلود کنید

نسخه های VB.NET که پشتیبانی میشن:
2003, 2005, 2008, 2010, 2012, 2013 


هر نوع پروژه ای هم قابل تبدیل هستش:
Win Forms, Web, Class Library, Compact Framework, Silverlight و ..

آخرین ویژگی هایی هم که به زبان VB اضافه شده هم پشتیبانی شده مثل:


Await/Async
Multiline Lambdas
Implicit Line Continuation
Auto-Implemented Properties
Collection Initializers
Array Literals
Nullable Optional Parameters
Generic Variance
LINQ
WPF applications
In line XML w/"code holes"
The new "If" operator
Object initializers
Extension methods
Lambda expressions
Nullable data types
Implicit types
Anonymous types

etc...

خصیصه های اصلی:

Support for the latest Visual Studio features - The latest VB.Net / C# features are supported, including Await/Async, Implicit Line Continuation, Multiline Lambdas, Nullable Optional Parameters, LINQ, XML, WPF, Lambda expressions, and extension methods.
Support for All Project Types - Win Forms, Web, Class Library, Compact Framework, Console, etc.
High Accuracy - This release was stress tested on thousands of sample programs. Tested were hundreds of Microsoft sample projects (Visual Studio SDK samples, DirectX SDK projects, Windows 7 SDK samples, etc.), in house and customer projects, third party control samples (Infragistics, ComponentOne, Telerik, etc.), and open source projects from SourceForge and CodePlex.
Ease of Use - While the conversion logic itself is complex, using the converter isn't.  You are guided through each step of the process with easy, clear instructions.
Customization - Not every project is the same.  With dozens of conversion options to choose from, you are in control of the conversion process.
Convert Single Projects or Groups of Projects - You can create lists of programs and convert them with one click.  There's also a command line version included.
Comprehensive Reporting - There are reports showing potential trouble spots in your code, interesting things which happened during the conversion process, and any C# compiler errors which need to be fixed.


خود سایتش ادعا کرده که پروژه 5 میلیون خطی هم باهاش convert کرده و روی حدود 8هزار پروژه هم تست شده.به نظر که عالیه واسه کسایی که قرار یه پروژه مشابه با زبان سی شارپ بنویسن و میتونه کمک زیادی کنه.

میتونید از سایتش این نرم افزار رو دانلود کنید:
که البته رایگان نیست
help ها و مثال هایی هم توی سایت هستش که اگه قصد استفاده ازش رو دارید میتونه بهتون کمک کنه.

jakstab decompiler

۰۹
بهمن

ابزاری برای دیس اسمبل کردن و آنالیز ایستا برروی فایلهای اجرایی و تهیه گرافی از جریان کنترلی آن است. این ابزار به زبان جاوا نوشته شده و multi platform هستش که روی پردازنده های 0x86 برروی فایل های اجرایی PE و ELF قابل استفاده است.
این ابزار کد های ماشین رو به یک زبان میانی ترجمه میکنه و...

اطلاعات بیشتر رو میتونید از سایت اصلیش بدست بیارید:
http://www.jakstab.org/download

دلیل معرفی این ابزار هم متن باز بودنش هستش.


Process Explorer

۰۹
بهمن

This major Process Explorer release includes heat-map display for process CPU, private bytes, working set and GPU columns, sortable security groups in the process properties security page, and tooltip reporting of tasks executing in Windows 8 Taskhostex processes. It also creates dump files that match the bitness of the target process and works around a bug introduced in Windows 8 disk counter reporting.


دانلود آخرین نسخه

این برنامه می تونه فرآیند تشخیص هویت (authentication process) ویندوز رو bypass کنه, بدون اینکه پسورد قدیمی شمارو بازنویسی کنه.


System Requirements: Pentium III compatible processor, 10MB free space on the hard drive. CD-ROM, Floppy Drive or USB flash drive, keyboard, Internet connection (for product download). Compatible BIOS version. Windows system is required for installer to run. USB flash drive is required for the EFI version to work. Disk encryption is not supported. 

Supported target systems: All Windows systems starting from Windows XP to Windows 8.1 (please note, authorization through domain controller is not officialy supported). Regarding the EFI support only Windows 8/8.1 systems are supported. Kon-Boot is now able to bypass online account authorization on Windows 8/8.1.


خوشبختانه این برنامه نسخه رایگان هم داره که البته روی سیستم های 64 بیتی و ویندوز 7/8 جواب نمیده و برای XP-32bit هستش.

البته Kon-boot برای Mac OSX هم این برنامه رو ارائه کرده ولی چونکه این سیستم عامل جزء مباحث ما نیست بهش کاری نداریم.

آدرس سایتش:
http://kon-boot.com

PeFile

یک ماژول بسیار مفید به زبان پایتون برای آنالیز static فایل اجرایی یا همون PE , که باهاش میشه به هدر ها و عناصر دیگه مثل جدول ورودی و ... دسترسی داشت.
برای کار با این ماژول و ابزارهایی که برای آنالیز ایستاتیک فایل های اجرایی تهیه شده اند, نیاز به آشنایی حدالامکان نسبی با ساختار این فایلها هستش.
میتونید توی همین وبلاگ مقاله آشنایی با فایل های اجرایی رو پیدا کنید.
این ماژول رو می تونید از اینجا دانلود کنید

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

کار اصلی ما:

 

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

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

 

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

 

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

 

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

آخرین فیلد ساختار OptionalHeader یعنی فیلد DataDirectory که 128 بایت فضا اشغال کرده دارای 16 تا ساختار به نام IMAGE_DATA_DIRECTORY هستش و هر کدوم ازین ساختار ها 8 بایت سایز دارن.

این ساختار بشکل زیر هستش: