درود به همه خوش اومدین به چنل
اینجا بهتون یاد میدم چطوری وارد مهندسی معکوس بشید و بعد که یاد گرفتید مفاهیم رو با هم میریم جلو
اینجا بهتون یاد میدم چطوری وارد مهندسی معکوس بشید و بعد که یاد گرفتید مفاهیم رو با هم میریم جلو
👍7
مفهوم مهندسی معکوس :
مهندسی معکوس ی روشیه که توی اون یک محصول یا سیستم یا نرم افزار مورد بررسی قرار میگیره و با بررسی و تجزیه و تحلیل سعی میکنن اونو بازسازی کنن و یا ساختار و عملکردش رو بفهمن کاربرد هاشم عملکرد فنی و ارزیابی خطر های احتمالی یا افزایش کارایی اون محصوله
#Reverse_engineering
#مهندسی_معکوس
مهندسی معکوس ی روشیه که توی اون یک محصول یا سیستم یا نرم افزار مورد بررسی قرار میگیره و با بررسی و تجزیه و تحلیل سعی میکنن اونو بازسازی کنن و یا ساختار و عملکردش رو بفهمن کاربرد هاشم عملکرد فنی و ارزیابی خطر های احتمالی یا افزایش کارایی اون محصوله
#Reverse_engineering
#مهندسی_معکوس
👍6
معرفی دستوراتCPU:
حرکت داده ها بین Registers(ثبات ها)
کار با memory (حافظه)
عملیات حسابی اولیه
به عنوان یک قانون CPU هر معماری CPU دستورات خاص خودشو داره
#Registers
#CPU
حرکت داده ها بین Registers(ثبات ها)
کار با memory (حافظه)
عملیات حسابی اولیه
به عنوان یک قانون CPU هر معماری CPU دستورات خاص خودشو داره
#Registers
#CPU
👍4
کد ماشین machine code:
کدی که CPU مستقیم پردازش میکنه شامل 0 و 1 هستن و توسط انسان قابل خوندن نیست و فقط کامپیوتر اونا رو میفهمه
هر دستورالعمل معمولا توسط چند تا byte code کدگزاری میشه
#byte_code
#بایت_کد
کدی که CPU مستقیم پردازش میکنه شامل 0 و 1 هستن و توسط انسان قابل خوندن نیست و فقط کامپیوتر اونا رو میفهمه
هر دستورالعمل معمولا توسط چند تا byte code کدگزاری میشه
#byte_code
#بایت_کد
👍3
معرفی دیس اسمبلرها disassembler:
برنامه ای که زبان ماشین رو به زبان اسمبلی تبدیل میکنه چند تا دیس اسمبلر معروف
Ida
Ollydbg
Ghidra
Windbg
#disassembler
#دیس_اسمبلر
#ghidra
#ollydbg
برنامه ای که زبان ماشین رو به زبان اسمبلی تبدیل میکنه چند تا دیس اسمبلر معروف
Ida
Ollydbg
Ghidra
Windbg
#disassembler
#دیس_اسمبلر
#ghidra
#ollydbg
👍4
اعداد باینری binary number:
هر عدد یا شماره رو با دو رقم نشون میدن مثل 0,1 اعداد باینری در مبنای 2 هستن
#binary
اعداد اکتال octal number:
اعداد اکتال بر مبنای 8 هستن و هشت رقم شماره وجود داره برای شمردن
0 1 2 3 4 5 6 7 8 9 10 & ....
#octal
اعداد هگزادسیمال hexadecimal number:
اعداد هگزادسیمال بر مبنای16 هستن و در شمارش میگیم هر رقم 4 بیت داره
0 1 2 3 4 5 6 7 8 9 A B C D E F
#hexadecimal
یعنی مثلا وقتی میخایم بگیم 14 نمیگیم 14 میگیم E
👍4
ما در مهندسی معکوس نرم افزار چند تا معماری داریم معماری اول Arm یا همون شامل برنامه ها و اپ های اندرویدی میشه و معماری دوم x64 x86 شامل برنامه های ویندوزی یا همون سیستم عامل 64 86 میشه و معماری دیگه هم داریم mips که شامل مجموعه دستور العمل (isa) برای کامپیوتر های کم دستور (risc)هست معماری اول میپس 32 بیتی بود و بعد ها 64 بیتی به اون اضافه شد
#x86
#x64
#arm
#x86
#x64
#arm
👍3
نمونه کد اسمبلی معماری x64 که یک تابع function خالی هست
f:
push rbp
mov rbp, rsp
nop
pop rbp
ret
👍4
پشته stack:
یکی از انواع ساختار ها داده است که برای
ذخیره و بازیابی داده ها استفاده میشه و در
طراحی و پیاده سازی نرم افزار ها کاربرد داره
پشته از خارج برعکس عمل میکنه یعنی چی
LIFO:
یعنی اخرین ورودی اولین خروجی last input first output
FIFO:
یعنی اولین ورودی اولین خروجی first input first output
خب حالا میخایم بریم سراغ مهم ترین عملیات اصلی stack
Push:
یک عنصر رو به بالای پشته اضافه میکند
Pop:
عنصر بالای پشته رو حذف میکنه
Peek:
عنصر بالای پشته رو بازیابی میکنه ولی حذف نمیکنه
StackEmpty:
خالی بودن پشته رو تست میکنه
Clear:
تمام عنصر ها element ها رو حذف میکنه
Contains:
مشخص میکنه که عنصری توی پشته وجود داره یا نه
CooyTo:
محتویات پشته رو در ارایه از نوع object شی کپی میکند
در حقیقت پشته از سه پخش اختصاص داده شده به یک برنامه در حال اجرا در حافظه (RAM ) هست این سه بخش شامل:
بخش کد (کد برنامه)
پشته (stack)
بخش داده(Heap & Bss)
#stack
#lifo
#fifo
#push
#pop
یکی از انواع ساختار ها داده است که برای
ذخیره و بازیابی داده ها استفاده میشه و در
طراحی و پیاده سازی نرم افزار ها کاربرد داره
پشته از خارج برعکس عمل میکنه یعنی چی
LIFO:
یعنی اخرین ورودی اولین خروجی last input first output
FIFO:
یعنی اولین ورودی اولین خروجی first input first output
خب حالا میخایم بریم سراغ مهم ترین عملیات اصلی stack
Push:
یک عنصر رو به بالای پشته اضافه میکند
Pop:
عنصر بالای پشته رو حذف میکنه
Peek:
عنصر بالای پشته رو بازیابی میکنه ولی حذف نمیکنه
StackEmpty:
خالی بودن پشته رو تست میکنه
Clear:
تمام عنصر ها element ها رو حذف میکنه
Contains:
مشخص میکنه که عنصری توی پشته وجود داره یا نه
CooyTo:
محتویات پشته رو در ارایه از نوع object شی کپی میکند
در حقیقت پشته از سه پخش اختصاص داده شده به یک برنامه در حال اجرا در حافظه (RAM ) هست این سه بخش شامل:
بخش کد (کد برنامه)
پشته (stack)
بخش داده(Heap & Bss)
#stack
#lifo
#fifo
#push
#pop
👍5
برای اموزش و یاد گرفتن کلی مطالب و دانلود کردن ابزار مهندسی معکوس یا دیباگر ها یا هر چی میتونید از این چند تا سایت استفاده کنید
https://legend.octopuslabs.io/
https://www.tuts4you.com/
https://www.dr-farfar.com/
#Reverseengineering
https://legend.octopuslabs.io/
https://www.tuts4you.com/
https://www.dr-farfar.com/
#Reverseengineering
👍3
سینتکس در زبان اسمبلی:
یک برنامه اسمبلی می تونه به سه بخش زیر تقسیم شه:
بخش data این بخش برای اعلام داده ها های اولیه یا ثابت استفاده میشه این داده در زمان اجرا تغییر نمیکنه سینتکس به صورت زیره
section.data
بخش bss این بخش برای اعلام متغیر ها استفاده میشه سینتکس به سورت زیره
section.bss
بخش tetx این بخش برای نگه داشتن کد اصلی استفاده میشه این بخش با اعلام متغیر سراسری _start شروع میشه که به هسته (core ) میگه که اجرای برنامه از کجا باید شروع بشه سینتکس به صورت زیره
section.text
section_start
:start_
کامنت ها در زبان اسمبلی با (;) شروع میشن
مثال
This program a good;
برنامه های نوشته شده با زبان اسمبلی به سه دستور تقسیم میشن:
دستورالعمل اجرایی: یا دستور العمل های ساده
به پردازنده (CPU) میگن چه کاری انجام بده
هر دستورالعمل شامل یک نوع کد عملیاتیه که
بهش میگن opcode هر دستورالعمل اجرایی
یک دستورالعمل زبان ماشین تولید میکنه
دستورالعمل های اسمبلر:
در مورد جنبه ها مختلف روند مونتاژ به اسمبلر میگن که این دستورات غیر قابل اجران و دستورالعمل زبان ماشین تولید نمی کنن
ماکروها:
ماکروها اساسا مکانیسم جایگزینی متن هستن
هر کدام از دســتورات زبان اســمبلی در یک
سطر جدا نوشته میشن همه ی اون ها از قالب زیر استفاده میکنن
[lable] mnemonic operands
[comment]
یک دستورالعمل شامل دو بخش هست یکی قسمت اول نام دستورالعمل mnemonic که قراره اجرا بشه و دومی ان عملوند ها operands یا پارامتر های دستور هستن
#syntax
#command
#Assembly
#CPU
یک برنامه اسمبلی می تونه به سه بخش زیر تقسیم شه:
بخش data این بخش برای اعلام داده ها های اولیه یا ثابت استفاده میشه این داده در زمان اجرا تغییر نمیکنه سینتکس به صورت زیره
section.data
بخش bss این بخش برای اعلام متغیر ها استفاده میشه سینتکس به سورت زیره
section.bss
بخش tetx این بخش برای نگه داشتن کد اصلی استفاده میشه این بخش با اعلام متغیر سراسری _start شروع میشه که به هسته (core ) میگه که اجرای برنامه از کجا باید شروع بشه سینتکس به صورت زیره
section.text
section_start
:start_
کامنت ها در زبان اسمبلی با (;) شروع میشن
مثال
This program a good;
برنامه های نوشته شده با زبان اسمبلی به سه دستور تقسیم میشن:
دستورالعمل اجرایی: یا دستور العمل های ساده
به پردازنده (CPU) میگن چه کاری انجام بده
هر دستورالعمل شامل یک نوع کد عملیاتیه که
بهش میگن opcode هر دستورالعمل اجرایی
یک دستورالعمل زبان ماشین تولید میکنه
دستورالعمل های اسمبلر:
در مورد جنبه ها مختلف روند مونتاژ به اسمبلر میگن که این دستورات غیر قابل اجران و دستورالعمل زبان ماشین تولید نمی کنن
ماکروها:
ماکروها اساسا مکانیسم جایگزینی متن هستن
هر کدام از دســتورات زبان اســمبلی در یک
سطر جدا نوشته میشن همه ی اون ها از قالب زیر استفاده میکنن
[lable] mnemonic operands
[comment]
یک دستورالعمل شامل دو بخش هست یکی قسمت اول نام دستورالعمل mnemonic که قراره اجرا بشه و دومی ان عملوند ها operands یا پارامتر های دستور هستن
#syntax
#command
#Assembly
#CPU
👍2
بخش های مختلف حافظه (memory) را به سه بخش تقسیم میکنیم:
* ســگمنت داده ( data segment)
با ســگمنت data. و .bss
نمایش داده میشــه از سگمنت data. برای اعلام منطقه حافظه که عناصر داده برای برنامه ذخیره میشن استفاده میشه این سگمنت بعد از اعلام عناصر داده قابل گسترش نیست و در طول برنامه مون ایستا میمونه یعنی نمیشه تغییرش داد ثابته
* سگمنت bss. یک سگمنت حافظه استاتیکه که
شامل بافر برای داده ها در برنامه است که بعدا اعلام میشه
* ســگمنت کد(code segment) توسط سگمنت text. اعلام میشه این یک فضا از حافظه را تعریف میکنه که کدهای
دستورالعمل را ذخیره میکنه این بخش ثابته
* سگمنت پشــته یا Stack – این سگمنت شامل مقادیر داده هست که به توابع و رویه های درون برنامه منتقل میشه
#memory
👍1
ثبات ها (Registeres) در زبان اسمبلی
عملیات انجام شــده توسط پردازنده بیشتر شامل پردازش داده هاست این داده ها
میتوانند داخل حافظه ذخیره شن و از اون جا به اونا دسترسی داشت خوندن داده و ذخیره داده ها داخل حافظه فرایند پردازنده را کند میکنه چون این کار فرآیندهای پیچیده ای برای ارسال درخواست داده از طریق باس کنترل و به
واحد ذخیره سازی حافظه و گرفتن اطلاعات از طریق همون کاناله
برای سرعت بخشیدن به عملیات پردازنده، پردازنده شامل برخی از مکان های ذخیره
سازی داخلی به نام ثبات یا رجیستر هست
رجیسترها عناصر داده را برای پردازش بدون نیاز به دسترسی به حافظه اصلی، ذخیره
میکنن تعداد ثبات ها در تراشه پردازنده محدوده
ده معماری 32 بیتی و 6 پردازنده 16 بیتی در معماری IA32- وجود دارد. ریجستر
ها به سه دسته تقسیم میشن:
1- ثبات های عمومی Registers General
2- ثبات های کنترل Registers Control
3- ثبات های سمگنت Registers Segment
حالا خود ریجستر های عمومی به سه دسته تقسیم میشن
ثبات داده Registers Data
ثبات های اشاره گر Registers Pointer
ثبات های ایندکس Registers Index
Registers Data ثبات داده
چهار رجیستر داده 32 بیتی برای عملیات محاسباتی، منطقی و سایر موارد استفاده
میشه این رجیسترهای 32 بیتی به سه روش قابل استفاده ان
به عنوان ثبات 32 بیتی کامل EAX، EBX، ECX، EDX
بخش کم ارزش از رجیسترهای 32 بیتی میتوانند به عنوان چهار رجیستر داده
16 بیتی استفاده شن AX، BX، CX و DX.
بخــش کم ارزش و پر ارزش از چهــار ثبات 16 بیتی به عنوان
هشت ثبات داده 8 بیتی استفاده شود:
AH، AL، BH، BL، CH، CL، DH و DL.
#Registers
#Assembly
عملیات انجام شــده توسط پردازنده بیشتر شامل پردازش داده هاست این داده ها
میتوانند داخل حافظه ذخیره شن و از اون جا به اونا دسترسی داشت خوندن داده و ذخیره داده ها داخل حافظه فرایند پردازنده را کند میکنه چون این کار فرآیندهای پیچیده ای برای ارسال درخواست داده از طریق باس کنترل و به
واحد ذخیره سازی حافظه و گرفتن اطلاعات از طریق همون کاناله
برای سرعت بخشیدن به عملیات پردازنده، پردازنده شامل برخی از مکان های ذخیره
سازی داخلی به نام ثبات یا رجیستر هست
رجیسترها عناصر داده را برای پردازش بدون نیاز به دسترسی به حافظه اصلی، ذخیره
میکنن تعداد ثبات ها در تراشه پردازنده محدوده
ده معماری 32 بیتی و 6 پردازنده 16 بیتی در معماری IA32- وجود دارد. ریجستر
ها به سه دسته تقسیم میشن:
1- ثبات های عمومی Registers General
2- ثبات های کنترل Registers Control
3- ثبات های سمگنت Registers Segment
حالا خود ریجستر های عمومی به سه دسته تقسیم میشن
ثبات داده Registers Data
ثبات های اشاره گر Registers Pointer
ثبات های ایندکس Registers Index
Registers Data ثبات داده
چهار رجیستر داده 32 بیتی برای عملیات محاسباتی، منطقی و سایر موارد استفاده
میشه این رجیسترهای 32 بیتی به سه روش قابل استفاده ان
به عنوان ثبات 32 بیتی کامل EAX، EBX، ECX، EDX
بخش کم ارزش از رجیسترهای 32 بیتی میتوانند به عنوان چهار رجیستر داده
16 بیتی استفاده شن AX، BX، CX و DX.
بخــش کم ارزش و پر ارزش از چهــار ثبات 16 بیتی به عنوان
هشت ثبات داده 8 بیتی استفاده شود:
AH، AL، BH، BL، CH، CL، DH و DL.
#Registers
#Assembly
👍2
ثبات AX انباشــتگر اصلی accumulator primary در ورودی
خروجی و بیش تر دستور های محاسباتی استفاده میشه به عنوان مثال
عملیات ضرب یک operands با اســتفاده از رجیستر EAX یا AX یا AL با توجه به
اندازه عملوند ذخیره میشه
ثبات BX به عنوان ثبات پایه Register Base شناخته میشه چون داخل ادرس دهی استفاده میشه
ثبات CX به عنوان ثبات شمارنده Register Count شناخته میشه ثبات
های ECX، CX تعداد تکرار حلقه ها را داخل عملیات های تکراری ذخیره میکنن
ثبات DX به عنوان ثبات داده Register Data شــناخته میشــه در عملیات
ورودی خروجی هم اســتفاده میشه همچنین با استفاده از ثبات AX به همراه DX
برای ضرب و تقسیم مقدار های بزرگ هم کاربرد داره
#accumalator_primary
#operands
خروجی و بیش تر دستور های محاسباتی استفاده میشه به عنوان مثال
عملیات ضرب یک operands با اســتفاده از رجیستر EAX یا AX یا AL با توجه به
اندازه عملوند ذخیره میشه
ثبات BX به عنوان ثبات پایه Register Base شناخته میشه چون داخل ادرس دهی استفاده میشه
ثبات CX به عنوان ثبات شمارنده Register Count شناخته میشه ثبات
های ECX، CX تعداد تکرار حلقه ها را داخل عملیات های تکراری ذخیره میکنن
ثبات DX به عنوان ثبات داده Register Data شــناخته میشــه در عملیات
ورودی خروجی هم اســتفاده میشه همچنین با استفاده از ثبات AX به همراه DX
برای ضرب و تقسیم مقدار های بزرگ هم کاربرد داره
#accumalator_primary
#operands
👍2
ثبات های اشاره گر Registers Pointer
رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP،
هستن IP,BP سه دسته اشاره گر داریم:
اشاره گر دستورالعمل (IP) instruction pointer
ثبات 16 بیتی IP
آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه
ثبات های اشاره گر Registers Pointer)
رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP،
هستن IP,BP سه دسته اشاره گر داریم:
1 اشاره گر دستورالعمل (IP) instruction pointer
ثبات 16 بیتی IP
آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه جمع IP با ثبات CS (به عنوان CS:IP) ادرس کاملی از دستور فعلی در سگمنت کد به ما میده
2 اشــاره گر پشــته یا Pointer Stack
ثبات 16 بیتی SP مقدار
افســت موجود در پشته برنامه رو میده اجتماع SP و SS به شکل SS:SP به موقعیت فعلی داده یا ادرس پشته در برنامه اشاره میکنه
3 اشاره گر پایه BP Pointer Base
ثبات 16 بیتی BP به طور زیاد
در اجرا متغیرهای پارامتری انتقال داده شده
به زیر مجموعه ها کمک میکنه در رجیستری SS با offset در BP برای به دست آوردن محل پارامتر
ترکیب میشــن BP همچنین میتونه با DI و SI به عنوان ثبات های پایه
برای آدرس دهی های ویژه استفاده شه.
#Registers
#register_pointer
رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP،
هستن IP,BP سه دسته اشاره گر داریم:
اشاره گر دستورالعمل (IP) instruction pointer
ثبات 16 بیتی IP
آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه
ثبات های اشاره گر Registers Pointer)
رجیسترهای اشاره گر شامل ثبات های 32 بیتی EIP، ESP و EBP و ۱۶ بیتی SP،
هستن IP,BP سه دسته اشاره گر داریم:
1 اشاره گر دستورالعمل (IP) instruction pointer
ثبات 16 بیتی IP
آدرس افست دستورالعمل بعدی رو که باید اجرا شه ذخیره میکنه جمع IP با ثبات CS (به عنوان CS:IP) ادرس کاملی از دستور فعلی در سگمنت کد به ما میده
2 اشــاره گر پشــته یا Pointer Stack
ثبات 16 بیتی SP مقدار
افســت موجود در پشته برنامه رو میده اجتماع SP و SS به شکل SS:SP به موقعیت فعلی داده یا ادرس پشته در برنامه اشاره میکنه
3 اشاره گر پایه BP Pointer Base
ثبات 16 بیتی BP به طور زیاد
در اجرا متغیرهای پارامتری انتقال داده شده
به زیر مجموعه ها کمک میکنه در رجیستری SS با offset در BP برای به دست آوردن محل پارامتر
ترکیب میشــن BP همچنین میتونه با DI و SI به عنوان ثبات های پایه
برای آدرس دهی های ویژه استفاده شه.
#Registers
#register_pointer
👍3