هذا الشرح مقدم من مجد طرطوس وحصري لموقع سيريا شات
WWW.SYRIACHAT.XTGEM.COM
في الحقيقة أن موضوع الهندسة العكسية ضخم جدا ومتشعب ولايمكن للشخص العادي أن يلم به لدرجة كبيرة الا اذا تفرغ تماما لهذا الموضوع وكان عنده بعض المعلومات والخبرة عن البرمجة بشكل عام وأنا في الحقيقة لاأدعي أنني من الجهابذة في هذا الفن ولكن سوف أشارككم بما يتوفر لدي من خبرة في هذا المجال الصعب
في البداية بعض الناس يستغربون معنى كلمة الهندسة العكسية
انها عملية قراءة الشيفرة البرمجية للبرنامج والقدرة على تعديلها وبالتالي صنع الكراك أو الكيجن والتخلص من مشكلة النسخة التجريبية والبرامج غير المجانية
جميع من يعمل في الهندسة العكسية يعرف برنامج
ida-pro
انه البرنامج الأقوى والاشمل في هذا المجال وسوف يكون غالب الشرح عنه لأنه من اقوى واحدث برامج الهندسة العكسية على الاطلاق ولا يوجد له منافس
ماهية إيدا برو:
- متعدد المعالجات: يستحمل إيدا برو العديد من المعالجات مثل: Texas Instrument, ARM, MIPs الخ ولكننا لن نهتم هنا إلا بعائلة الحواسب الشخصية مع بنية 80x86 تحت أنظمة ويندوز.
- مفكك ذكي: يغاير إيدا برو المفككات البسيطة بأنه يقوم بتحليل الشفرة خاصة باستخدام طرق مثل FLIRT و PIT.
· FLIRT : (Fast Library Identification and Recognition Technology) تقوم هذه التكنولوجيا بتمكين التعرف على استدعاءات الوظائف من المكتبات الافتراضية من بعض المجمعات. مثال على برنامج من لغة سي، إذا قمت باستدعاء وظيفة strcpy(..) سيتعرف إيدا على مثل هذا الاستدعاء بدلا من إعطاء شيئا من قبيل هذا: call xxxxxx الذي يضطرك إلى استكشاف هذا الاستدعاء لمعرفة أن هذه الوظيفة استخدمت لنسخ سلسة حرفية. بدلا من ذلك تحصل على strcpy الذي يحافظ على وقتك ويسهل العملية.
· PIT : (Parameter Identification and Tracking) هذا يجعل إيدا يقوم بتتبع وتشخيص معاملات وظيفة ما من خلال المكدس للتعرف ووضع علامة على المعاملات المستخدمة. وهذا أيضا يسهل كثيرا عملية الهندسة العكسية. كما يستطيع إيدا برو تفكيك سليم للشفرة مع التفرقة بين الأكواد واعلان المتحولات فضلا عن الشفرات غير المستغلة من قبل البرنامج.
- تفاعلي: حتى يتسنى لك القيام بالتعديلات، إعادة تسمية المتحولات والوظائف، تحرير الملاحظات، تحديد معاملات للوظائف، إنشاء وظائف جديدة...
هذه بعض من الوظائف الأساسية الممكنة مع إيدا برو. طبعا هناك الكثير منها، ولكني أفضل استكشافك لها بنفسك.
من وينداسم (WinDASM) إلى إيدا برو:
ولأن وينداسم من أقدم المفككات وأكثرها انتشاراً بسبب بساطة استخدامه. فمن المحتمل أنك دخلت عالم الكراكينج عن طريق وينداسم. والحقيقة أن التحول من وينداسم إلى إيدا برو يشوش كثيرا من الناس. أولا أشير إلى أنني لا أقلل من قيمة وينداسم الذي يعتبر من أحسن الأدوات وخاصة للبرامج البسيطة التي لا يتطلب تفكيكها كبير تحليل، فيكون وينداسم هو المناسب في مثل هذه الأوضاع. شخصيا لا أستخدمه، أفضل عليه أولي ديبغ (OllyDbg)
الصعوبات الأولية تظهر مع SDR (البيانات المرجيعة للسلاسل الحرفية) لأنها الوسيلة السهلة والأولية التي نتعلمها في البداية لكسر الحمايات. لا للقلق ! مع إيدا برو أيضا يمكن إظهار السلاسل الحرفية المعلنة والمستخدمة من قِبَل البرنامج من خلال menu>view>name أو مباشرة في التعليقات أمام التعليمات. ستحصل على نافذة تظهر بها أسماء الوظائف والمتحولات الصريحة مرتبة حسب المحتويات. مثال سلسة حرفية تحتوي على "Merci de vous être enregistrés" يقوم إيدا برو بتسميته هكذا: "aMerciDeVous". في هذه النقطة بالذات يعتبر وينداسم أقوى (وخاصة النسخة 8.5)، لأنه في كثير من الأحيان يقوم بإظهار سلاسل زيادة أكثر من إيدا برو. ولكن !!! لا بد أن تعرف أن طريقة SDR ليست الوحيدة لكسر الحمايات. في الحقيقة هذه التقنية عفى عليها الزمن، فهي لم تعد تنفع إلا في قلة من البرنامج. ومع تقدمك في الكراكينج سيتبين لك أنها من الطرق التي يجب الابتعاد عنها لكونها بدائية وإمكانية احتواءها على أفخاخ المبرمجين.
وهناك أيضا إشكالية القفزات ومرجعية الاستدعاءات لأنها بكل بساطة مُعَرفَة بطريقة مغايرة. لنقارن جزءً مماثلاً من كود برنامج تحت وينداسم وإيدا برو لنقف على الفروق بينهما:
جزء الشفرة مفككة تحت وينداسم:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040105C(C)
|
:0040106D 817D0C11010000 cmp dword ptr [ebp+0C], 00000111
:00401074 0F850B010000 jne 00401185
:0040107A 8B4510 mov eax, dword ptr [ebp+10]
:0040107D 837D1400 cmp dword ptr [ebp+14], 00000000
:00401081 0F8407010000 je 0040118E
:00401087 8B5510 mov edx, dword ptr [ebp+10]
:0040108A C1EA10 shr edx, 10
:0040108D 660BD2 or dx, dx
:00401090 753B jne 004010CD
:00401092 6683F801 cmp ax, 0001
:00401096 7518 jne 004010B0
:00401098 6A30 push 00000030
* Possible StringData Ref from Data Obj ->"Enregistrement..."
|
:0040109A 6816304000 push 00403016
* Possible StringData Ref from Data Obj ->"Merci de vous être enregistrés "
->"!"
|
:0040109F 6828304000 push 00403028
:004010A4 6A00 push 00000000
* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:004010A6 E817010000 Call 004011C2
:004010AB E9D3000000 jmp 00401183
نفس الجزء تحت إيدا برو:
0040106D loc_40106D: ; CODE XREF: sub_40102B+31j
0040106D cmp [ebp+arg_4], 111h
00401074 jnz loc_401185
0040107A mov eax, [ebp+arg_8]
0040107D cmp [ebp+arg_C], 0
00401081 jz loc_40118E
00401087 mov edx, [ebp+arg_8]
0040108A shr edx, 10h
0040108D or dx, dx
00401090 jnz short loc_4010CD
00401092 cmp ax, 1
00401096 jnz short loc_4010B0
00401098 push 30h
0040109A push offset aEnregistrement ; "Enregistrement..."
0040109F push offset aMerciDeVousTes ; "Merci de vous êtres enregistrés !"
004010A4 push 0
004010A6 call j_MessageBoxA
004010AB jmp loc_401183
للقفزات ومراجع الاستدعاءات تحت وينداسم، نحصل على:
Referenced by a (U)nconditional or (C)onditional Jump at Address :0040105C(C)
أما تحت إيدا برو:
0040106D loc_40106D: ; CODE XREF: sub_40102B+31↑j
هذا السطر يحتوي على الكثير من البيانات !
نحن عند هذا العنوان
0040106D
هذه مُعَرَفة كلافتة، والتي نستطيع الوصول إليها باستخدام القفزات أو الاستدعاءات كأننا في أصل أسمبلي
loc_40106D:
يعلمنا أن المرجعية آتية من قسم الأكواد
CODE XREF:
هذا هو عنوان المرجعية
sub_40102B+31 ( = 0040105C )
كون هذا بداية الإجراء
sub_40102B
هذا السهم يشير إلى منبع المرجعية، فوق أو تحت
↑
يعلمنا أن المرجعية من نوع القفزات
j
ويكفي عمل نقرة مزدوجة على هذا للانتقال إلى القفزة
sub_40102B+31↑j
ونلاحظ أن العنوان 0040106D أعيد مرتين، هذا يسمح لـ إيدا برو بإضافة سطور ممتعة أو سطور تعليقات متعددة إلى العنوان. مثل XREF هنا.
كما نرى أيضا أن مراجع السلاسل الحرفية المشار إليها بواسطة العناوين تحت وينداسم، تم تسمية هذه المراجع تحت إيدا برو كأسامي متحولات صريحة تبتعها تعليقات تدل على محتوياتها. نستطيع أيضا عمل نقرة مزدوجة على اسم المتحول للانتقال مباشرة إلى مكان إعلان هذا المتحول متبوعا بـ XREF الخاص به.
00403016 aEnregistrement db 'Enregistrement...',0 ; DATA XREF: sub_40102B+6Fo
هذا المتحول من نوع نصوص، تم الإعلان عنه وكأننا في أصل أسمبلي مع استخدام شبه تعليمة db .
للإشارة إلى دالة MessageBox يخبرنا وينداسم هكذا:
* Reference To: USER32.MessageBoxA, Ord:01BBh متبوعا بـ Call 004011C2 حيث يدل Call 004011C2 على عنوان استدعاء MessageBox. أما تحت إيدا برو، نرى مباشرة اسم الوظيفة المستدعاة هكذا:
call j_MessageBoxA .
كذلك نرى أيضا أنه عند التعليمة الأولى cmp [ebp+arg_4], 111h نستخدم ebp+arg_4 مع أن وينداسم يستخدم القيمة الحقيقية ebp+0C . يشير arg_4 هنا بكل بساطة إلى أحد معاملات الإجراء المعلنة سابقا:
0040102B sub_40102B proc near ; DATA XREF: start+Eo
0040102B
0040102B arg_0 = dword ptr 8
0040102B arg_4 = dword ptr 0Ch
0040102B arg_8 = dword ptr 10h
0040102B arg_C = dword ptr 14h
يدل arg_4 فعلا على القيمة OC. وإذا قمنا بعمل نقرة يمنى على arg_4 عند cmp [ebp+arg_4], 111h ، ستنسدل قائمة فرعية طالبة منا اختيار القيمة الحقيقية حسب النظم المختلفة (ستعشري، عشري، ثنائي...). وسنرى لاحقا أنه يمكننا إعادة تسمية arg_4 باسم أكثر وضوحا.
الخيارات:
يمكننا التحكم في إظهار المعلومات بالقدر الذي نريده وكذلك تنظيم تلك المعلومات حسب الرغبة. يسمح لنا menu>options الولوج إلى هذه الخيارات. من عند الخيارات العامة، نستطيع تحديد العديد من المعلومات التي يمكننا تشخيص واجهتها مثل اللون، المسافة بين الأقسام المختلفة (موقع ابتداء التعليمات، ابتداء التعليقات، أو ابتداء مواضع XREF ... )، خواص تسمية السلاسل الحرفية، إظهار القيم الستعشرية للتعليمات، إظهار مؤشر المكدس حسب التعليمة (مفيد جدا حتى لا تضيع حالة المكدس عنا).
ولأن عدد الخيارات كبير، فلن أستطيع سردها كلها هنا، وأنصحك بالتضحية بشيء من وقتك لاستكشافها وتعديلها حسب رغبتك. تمهل قليلا عند الواجهة، والعب مع القوائم وكل ما يظهر أمامك.
استخدام إيدا برو – الأوامر والوظائف الأساسية :
أولا نبدأ بفتح الملف المراد تنقيحه عن طريق File>Open file… أو عن طريق زر الاختصار الموجود على شريط الأدوات. ستنفتح نافذة أمامنا طالبة منا تحديد عدة خيارات، فلا تغير شيئا فقط قم بالنقر على OK . حينئذ نرى تطور تحليل الكود في النافذة الصغيرة التحتية، وننتظر حتى الانتهاء من التحليل. وقد يطول هذا التحليل بالنسبة للبرامج الكبيرة.
المناطق:
نحصل أخيراً على كود مفكك، حيث نستطيع تقسيمه إلى عدة مناطق كالآتي:
-الكود، حيث توجد الأوامر (التعليمات)
-البيانات، حيث نرى إعلان المتحولات بواسطة تعليمات مثل db, dd, dw وكأننا في أصل أسمبلي.
-الأكواد الغير مستغلة، نتعرف عليها بكون مقاطع الأوست غير نشطة (الجزء الواقع شمالا). وهي تشبه إعلان المتحولات : (DB 82) . المناطق الغير مستغلة هي تلك المناطق التي لا تشير إليها لا الأكواد ولا البيانات.
يمكننا تعديل كل منطقة عن طريق اختيار السطر أو السطور ثم الضغط على:
C – لمنطقة الأكواد
D – لمنطقة البيانات (إذا كنا عند سطر يقوم باعلان متحول مثلا باستخدام db، يمكننا تعديل نوعه عن طريق الضغط على حرف d مع تمرير الأنواع)
U – للمناطق الغير مستغلة
القفزات والاقتفاء:
يتوقف تنشيط الخيارات تحت إيدا برو على موقع تواجد مؤشر الفأرة. ضع المؤشر على اسم متحول أو وظيفة لتفعيل الخيارات الخاصة بتعديله. يمكننا اقتفاء الشفرة باستخدام أسهم لوحة المفاتيح أعلى/أسفل أو نقل المؤشر أفقيا عن طريق أسهم يمين/شمال (أو باستخدام الفأرة). عند وضع المؤشر فوق تعليمة تحمل في طياتها قفزة أو استدعاء، يكفينا وضع المؤشر فوق اسم اللافتة والضغط على زر الإدخال للانتقال إلى القفزة أو الاستدعاء. ويمكننا أيضا عمل نقرة مزدوجة مباشرة لأداء نفس الغرض.
نستخدم مفتاح الهروب للرجوع عدد مرات تقدمنا (مفيد للعودة من قفزة أو استدعاء). كما يمكننا استخدام السهمين الجانبيين الموجودين على شريط الأدوات.
ومن menu>jump نحصل على العديد من القفزات الممكنة، أكثرها استخداما هي ‘jump to address’ . يمكننا الولوج إليها عن طريق ضغط زر G من على لوحة المفاتيح، ‘jump to entry-point’ للذهاب إلى نقطة بداية الكود، ‘jump to function’ إلخ. وكذلك لدينا إمكانية تحديد النقاط المفتاحية التي تسمى ‘Marque position’ ونقوم بتحرير وصف لهذه النقطة، ثم نستطيع الوصول إليها عن طريق ‘jump to marked position’ .
أوفست الملف والعنوان الحالي :
أوفست الملف الذي يسمح لنا بإيجاد موضع التعديل في المحررات الستعشرية، هذا الأوفست نجده بإلقاء النظر على شريط الحالة المحتوي على العديد من الخانات في الجزء السفلي من البرنامج. إذا وضعنا مؤشر الفأرة على الخانة الرابعة برهة من الزمن سوف نرى "current position in the input file" . الخانة التالية تدلنا على العنوان الحالي متبوعا باسم الإجراء الذي يوجد به هذا العنوان علاوة على العدد الذي يجب إضافته للحصول على العنوان الحالي.
التعليقات:
هناك نوعان من التعليقات: التعليقات الخاصة والتعليقات المتكررة.
الخاصة، بالضغط على النقطتين الفوقيتين ‘:’ يمكننا وضع التعليقات الخاصة، هذه التعليقات تظهر في موضع واحد فقط.
المتكررة، بالضغط على الفاصلة المنقوطة ‘;’ يسمح هذا النوع من التعليقات بالانتشار عبر الشفرة، مثلا إذا وضعنا مثل هذه التعليقات عند وظيفة ما، سوف نراها إثر كل استدعاء يشير إلى هذه الوظيفة.
الأسماء:
هذه هي قمة القوة التفاعلية لـ إيدا برو، يمكننا إعادة تسمية أي متحول، أية وظيفة، أية قيمة أو لافتة وإعطائها اسماً له مدلول أكثر من التسمية الافتراضية التي أعطاها البرنامج.
لإعادة تسمية لافتة ما أو إضافة اسم لها، كل ما نفعله هو وضع المؤشر فوق تلك اللافتة أو العنوان ثم الضغط على ‘n’ ستظهر صندوق ليسمح لنا بإدخال الاسم الذي نريده. ستتغير اللافتة تباعا وكل تعليمة تشير إلى تلك اللافتة، فمثلا إذا كان لدينا شيء كهذا:
00401112 loc_401112: ; CODE XREF: sub_40102B+116j
00401112 mov al, [esi]
00401114 test al, al
00401116 jz short loc_401143
وقمنا بإعادة تسمية loc_401112 إلى coucou ثم ذهبنا إلى القفزة (عن طريق السطر XREF) التي تشير إلى هذه القفزة، هناك لن نرى jmp loc_401112 بل سنرى jmp coucou .
لتغيير اسم وظيفة ما، نتبع تقريبا نفس الإجراء، حيث يتم إعلان الوظيفة كالتالي :
call sub_4011A0 ، ( لاحظ: sub_ للوظائف. وloc_ للافتات ) لإعادة تسمية هذه الوظيفة يكفي الانتقال إلى مكان إعلان لافتتها :
004011A0 sub_4011A0 proc near ; CODE XREF: sub_401160+27p
004011A0
004011A0 arg_0 = dword ptr 8h
004011A0 arg_4 = dword ptr 0Ch
004011A0 arg_8 = dword ptr 10h
004011A0 arg_C = dword ptr 14h
004011A0
004011A0 push ecx
004011A1 push ebx
إما أن نضغط على ‘n’ تماما مثل ما نفعل مع اللافتات أو إما نقوم بذلك عن طريق قائمة متخصصة للوظائف بالضغط على ‘alt-p’ أو بالضغط اليميني ثم الولوج إلى القائمة الفرعية. في صندوق التحرير، يمكننا إعادة تسمية الوظيفة وتحرير عنوان البداية وعنوان النهاية الخاصين به. كما يمكننا تحرير صيغة الوظيفة باختيار ‘set function type’ من القائمة الفرعية، فيمكنك إذن إعادة تسمية المعاملات ويقوم إيدا برو بالتعديل على الشفرة لإعادة تسمية جميع أماكن ظهور هذه المعاملات. هاك نفس الوظيفة بعد تعديل صيغتها:
004011A0 ; int Calcul1(HWND hwnd,int var1,int var2,BOOL value)
004011A0
004011A0 Calcul1 proc near ; CODE XREF: sub_401160+27p
004011A0
004011A0 hwnd = dword ptr 8h
004011A0 var1 = dword ptr 0Ch
004011A0 var2 = dword ptr 10h
004011A0 value = dword ptr 14h
004011A0
004011A0 push ecx
004011A1 push ebx
يمكننا الاستعانة بالاسم الرمزي للثابت لإعادة تسمية القيم. مثلا في إجراء إدارة رسالة نافذة ما، سيتغير الثابت WM_INITDIALOG بعد تفكيكه إلى القيمة الرقمية 110 .
.code:0040102E cmp [ebp+arg_4], 110h
.code:00401035 jz short loc_401058
إذا قمنا بعمل نقرة يمنى على 110 واخترنا ‘use standard symbol constant’ ستنسدل قائمة محتوية على جميع ثوابت الويندوز التي تستخدم القيمة 110، ومن ثم علينا فحص الوضع الذي نحن فيه لنتمكن من اختيار الثابت المناسب. نحن هنا في وضع إدارة الرسائل. فيكون الثابت الذي نبحث عنه هو ثابت الرسالة WM_INITDIALOG ( WM_= Windows Message)، نقوم باختياره وتوثيقه فيتم تبديل 110 بـ WM_INITDIALOG . يمكننا انتهاز الفرصة لإعادة تسمية لافتة القفزة التي تليها بـ _Initdialog لأننا سنقفز إلى هذا الإجراء إذا كنا فعلا في إجراء إدارة الرسائل.
ما دمنا ها هنا، سننخرط بعض الشيء لإظهار تقنية العمل تحت إيدا برو. ولكن قبل ذلك نبدي إشارة إلى البرمجة بلغة الأسمبلي :
لإعطاء معاملات إلى وظيفةٍ ما ندفع بها على المكدس قبل الاستدعاء وبالترتيب العكسي بالنسبة للصيغة، يمكننا الولوج إلى المكدس عن طريق مسجل esp ، ومن ثم في الإجراء نستخدم ebp للحصول على عناصر المكدس بهذه الطريقة:
لحفظ قيمة ebp في المكدس
push ebp
وضع مؤشر المكدس في ebp
mov ebp,esp
الذي قمنا بحفظه آنفا
=old esp
ebp+00
يحتوي esp على عنوان رجوع الوظيفة قبل الاستدعاء
ebp+04
المعامل رقم 1
ebp+08
المعامل رقم 2
ebp+0C
المعامل رقم 3
ebp+10
المعامل رقم 4
ebp+14
إلخ
etc...
نهاية الإجراء
;end of proc
يحتوي ebp على القيمة القديمة لـ esp
mov esp,ebp
تفريغ المكدس للرجوع إلى الحالة الأولية له حيث يكون محتويا على عنوان الرجوع
pop ebp
الرجوع مباشرة إلى السطر الذي يلي الاستدعاء
ret
لنرجع إلى مثالنا:
.code:0040102E cmp [ebp+arg_4], 110h
.code:00401035 jz short loc_401058
هنا نقارن ebp+arg_4 الذي يُمَثِل ebp+0C والذي يعتبر المعامل الثاني لإجراء إدارة الرسائل، إذا طابقنا صيغة إجراء إدارة الرسائل :
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
تكون uMsg هي الحجة الثانية (المعامل الثاني)، وهي متحول يحتوي على القيم الرقمية (UINT – unsigned int) المبينة عن طريق ثوابت رمزية مثل WM_INITDIALOG ويجب الإشارة هنا إلى أننا نعلم عن طريق هذا المعامل الثاني أن القيمة الآتية هي من نوع Windows Message . فيمكننا إذن إعادة تسمية ebp+arg_4 بقيمتها الصحيحة، والتي ستكون في النهاية هكذا:
.code:0040102E cmp [uMsg], WM_INITDIALOG
.code:00401035 jz short _InitDialogRoutine
للذين لم يفهموا مني شيئا،أتمنى منهم ترك الموضوع تماما لأنه صعب جدا بدون اي مبالغة
يمكننا إعادة تسمية أي شيء نرغب في تسميته باختيار ‘Manual’ من القائمة المنسدلة أو بالضغط على ‘alt-F1’ مع التعليم على الخانة ‘allow no matched operand’ وحتى إن كان غير منطقي بتاتا أو ليس له علاقة بالكود. ولكن كن حذرا وخاصة إذا كنت تنوي توريد الشفرة إلى برنامج آخر. (سوف نتكلم عن هذا في الأجزاء القادمة).
حفظ العمل وتوريده:
وبعد عمل شاق وعند الرغبة في تكملة العمل في اليوم التالي، يكفي حفظ الشفرة المفككة بامتداد .idb الذي يمكننا فتحه مرة أخرى ووجود التعديلات كما تركناها.
ومن بين التوريدات المتوفرة (menu>produce) هناك إمكانية توريد التفكيك بامتداد .asm الذي ينتج أصلا يكون مقبولا للمجمع. حذاري ! الأصل الأسمبلي المنتج لن يكون قابلا للعمل مباشرة أو قد لا يعمل بتاتاً. فلا بد من تنقيته وتكييفه (راجع ما كتبناه عن الاستزراع الكيجيني). ربما رجعنا إلى هذا في الجزء الثالث إن شاء الله.
كما يمكن إنتاج ملف بامتداد .map الذي يقوم بمقابلة اللافتات، الوظايف المتحولة وعناوين البرنامج. مثل هذا الملف نستخدمه لتوريد التفكيك إلى سوفت أيس. وهذا يفتح الطريق إلى منقح واضح.
في الحقيقة أن موضوع الهندسة العكسية ضخم جدا ومتشعب ولايمكن للشخص العادي أن يلم به لدرجة كبيرة الا اذا تفرغ تماما لهذا الموضوع وكان عنده بعض المعلومات والخبرة عن البرمجة بشكل عام وأنا في الحقيقة لاأدعي أنني من الجهابذة في هذا الفن ولكن سوف أشارككم بما يتوفر لدي من خبرة في هذا المجال الصعب
في البداية بعض الناس يستغربون معنى كلمة الهندسة العكسية
انها عملية قراءة الشيفرة البرمجية للبرنامج والقدرة على تعديلها وبالتالي صنع الكراك أو الكيجن والتخلص من مشكلة النسخة التجريبية والبرامج غير المجانية
وأنا هنا سأذكر بعض الأدوات والطرق المساعدة
جميع من يعمل في الهندسة العكسية يعرف برنامج
ida-pro
انه البرنامج الأقوى والاشمل في هذا المجال وسوف يكون غالب الشرح عنه لأنه من اقوى واحدث برامج الهندسة العكسية على الاطلاق ولا يوجد له منافس
ماهية إيدا برو:
- متعدد المعالجات: يستحمل إيدا برو العديد من المعالجات مثل: Texas Instrument, ARM, MIPs الخ ولكننا لن نهتم هنا إلا بعائلة الحواسب الشخصية مع بنية 80x86 تحت أنظمة ويندوز.
- مفكك ذكي: يغاير إيدا برو المفككات البسيطة بأنه يقوم بتحليل الشفرة خاصة باستخدام طرق مثل FLIRT و PIT.
· FLIRT : (Fast Library Identification and Recognition Technology) تقوم هذه التكنولوجيا بتمكين التعرف على استدعاءات الوظائف من المكتبات الافتراضية من بعض المجمعات. مثال على برنامج من لغة سي، إذا قمت باستدعاء وظيفة strcpy(..) سيتعرف إيدا على مثل هذا الاستدعاء بدلا من إعطاء شيئا من قبيل هذا: call xxxxxx الذي يضطرك إلى استكشاف هذا الاستدعاء لمعرفة أن هذه الوظيفة استخدمت لنسخ سلسة حرفية. بدلا من ذلك تحصل على strcpy الذي يحافظ على وقتك ويسهل العملية.
· PIT : (Parameter Identification and Tracking) هذا يجعل إيدا يقوم بتتبع وتشخيص معاملات وظيفة ما من خلال المكدس للتعرف ووضع علامة على المعاملات المستخدمة. وهذا أيضا يسهل كثيرا عملية الهندسة العكسية. كما يستطيع إيدا برو تفكيك سليم للشفرة مع التفرقة بين الأكواد واعلان المتحولات فضلا عن الشفرات غير المستغلة من قبل البرنامج.
- تفاعلي: حتى يتسنى لك القيام بالتعديلات، إعادة تسمية المتحولات والوظائف، تحرير الملاحظات، تحديد معاملات للوظائف، إنشاء وظائف جديدة...
هذه بعض من الوظائف الأساسية الممكنة مع إيدا برو. طبعا هناك الكثير منها، ولكني أفضل استكشافك لها بنفسك.
من وينداسم (WinDASM) إلى إيدا برو:
ولأن وينداسم من أقدم المفككات وأكثرها انتشاراً بسبب بساطة استخدامه. فمن المحتمل أنك دخلت عالم الكراكينج عن طريق وينداسم. والحقيقة أن التحول من وينداسم إلى إيدا برو يشوش كثيرا من الناس. أولا أشير إلى أنني لا أقلل من قيمة وينداسم الذي يعتبر من أحسن الأدوات وخاصة للبرامج البسيطة التي لا يتطلب تفكيكها كبير تحليل، فيكون وينداسم هو المناسب في مثل هذه الأوضاع. شخصيا لا أستخدمه، أفضل عليه أولي ديبغ (OllyDbg)
الصعوبات الأولية تظهر مع SDR (البيانات المرجيعة للسلاسل الحرفية) لأنها الوسيلة السهلة والأولية التي نتعلمها في البداية لكسر الحمايات. لا للقلق ! مع إيدا برو أيضا يمكن إظهار السلاسل الحرفية المعلنة والمستخدمة من قِبَل البرنامج من خلال menu>view>name أو مباشرة في التعليقات أمام التعليمات. ستحصل على نافذة تظهر بها أسماء الوظائف والمتحولات الصريحة مرتبة حسب المحتويات. مثال سلسة حرفية تحتوي على "Merci de vous être enregistrés" يقوم إيدا برو بتسميته هكذا: "aMerciDeVous". في هذه النقطة بالذات يعتبر وينداسم أقوى (وخاصة النسخة 8.5)، لأنه في كثير من الأحيان يقوم بإظهار سلاسل زيادة أكثر من إيدا برو. ولكن !!! لا بد أن تعرف أن طريقة SDR ليست الوحيدة لكسر الحمايات. في الحقيقة هذه التقنية عفى عليها الزمن، فهي لم تعد تنفع إلا في قلة من البرنامج. ومع تقدمك في الكراكينج سيتبين لك أنها من الطرق التي يجب الابتعاد عنها لكونها بدائية وإمكانية احتواءها على أفخاخ المبرمجين.
وهناك أيضا إشكالية القفزات ومرجعية الاستدعاءات لأنها بكل بساطة مُعَرفَة بطريقة مغايرة. لنقارن جزءً مماثلاً من كود برنامج تحت وينداسم وإيدا برو لنقف على الفروق بينهما:
جزء الشفرة مفككة تحت وينداسم:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040105C(C)
|
:0040106D 817D0C11010000 cmp dword ptr [ebp+0C], 00000111
:00401074 0F850B010000 jne 00401185
:0040107A 8B4510 mov eax, dword ptr [ebp+10]
:0040107D 837D1400 cmp dword ptr [ebp+14], 00000000
:00401081 0F8407010000 je 0040118E
:00401087 8B5510 mov edx, dword ptr [ebp+10]
:0040108A C1EA10 shr edx, 10
:0040108D 660BD2 or dx, dx
:00401090 753B jne 004010CD
:00401092 6683F801 cmp ax, 0001
:00401096 7518 jne 004010B0
:00401098 6A30 push 00000030
* Possible StringData Ref from Data Obj ->"Enregistrement..."
|
:0040109A 6816304000 push 00403016
* Possible StringData Ref from Data Obj ->"Merci de vous être enregistrés "
->"!"
|
:0040109F 6828304000 push 00403028
:004010A4 6A00 push 00000000
* Reference To: USER32.MessageBoxA, Ord:01BBh
|
:004010A6 E817010000 Call 004011C2
:004010AB E9D3000000 jmp 00401183
نفس الجزء تحت إيدا برو:
0040106D loc_40106D: ; CODE XREF: sub_40102B+31j
0040106D cmp [ebp+arg_4], 111h
00401074 jnz loc_401185
0040107A mov eax, [ebp+arg_8]
0040107D cmp [ebp+arg_C], 0
00401081 jz loc_40118E
00401087 mov edx, [ebp+arg_8]
0040108A shr edx, 10h
0040108D or dx, dx
00401090 jnz short loc_4010CD
00401092 cmp ax, 1
00401096 jnz short loc_4010B0
00401098 push 30h
0040109A push offset aEnregistrement ; "Enregistrement..."
0040109F push offset aMerciDeVousTes ; "Merci de vous êtres enregistrés !"
004010A4 push 0
004010A6 call j_MessageBoxA
004010AB jmp loc_401183
للقفزات ومراجع الاستدعاءات تحت وينداسم، نحصل على:
Referenced by a (U)nconditional or (C)onditional Jump at Address :0040105C(C)
أما تحت إيدا برو:
0040106D loc_40106D: ; CODE XREF: sub_40102B+31↑j
هذا السطر يحتوي على الكثير من البيانات !
نحن عند هذا العنوان
0040106D
هذه مُعَرَفة كلافتة، والتي نستطيع الوصول إليها باستخدام القفزات أو الاستدعاءات كأننا في أصل أسمبلي
loc_40106D:
يعلمنا أن المرجعية آتية من قسم الأكواد
CODE XREF:
هذا هو عنوان المرجعية
sub_40102B+31 ( = 0040105C )
كون هذا بداية الإجراء
sub_40102B
هذا السهم يشير إلى منبع المرجعية، فوق أو تحت
↑
يعلمنا أن المرجعية من نوع القفزات
j
ويكفي عمل نقرة مزدوجة على هذا للانتقال إلى القفزة
sub_40102B+31↑j
ونلاحظ أن العنوان 0040106D أعيد مرتين، هذا يسمح لـ إيدا برو بإضافة سطور ممتعة أو سطور تعليقات متعددة إلى العنوان. مثل XREF هنا.
كما نرى أيضا أن مراجع السلاسل الحرفية المشار إليها بواسطة العناوين تحت وينداسم، تم تسمية هذه المراجع تحت إيدا برو كأسامي متحولات صريحة تبتعها تعليقات تدل على محتوياتها. نستطيع أيضا عمل نقرة مزدوجة على اسم المتحول للانتقال مباشرة إلى مكان إعلان هذا المتحول متبوعا بـ XREF الخاص به.
00403016 aEnregistrement db 'Enregistrement...',0 ; DATA XREF: sub_40102B+6Fo
هذا المتحول من نوع نصوص، تم الإعلان عنه وكأننا في أصل أسمبلي مع استخدام شبه تعليمة db .
للإشارة إلى دالة MessageBox يخبرنا وينداسم هكذا:
* Reference To: USER32.MessageBoxA, Ord:01BBh متبوعا بـ Call 004011C2 حيث يدل Call 004011C2 على عنوان استدعاء MessageBox. أما تحت إيدا برو، نرى مباشرة اسم الوظيفة المستدعاة هكذا:
call j_MessageBoxA .
كذلك نرى أيضا أنه عند التعليمة الأولى cmp [ebp+arg_4], 111h نستخدم ebp+arg_4 مع أن وينداسم يستخدم القيمة الحقيقية ebp+0C . يشير arg_4 هنا بكل بساطة إلى أحد معاملات الإجراء المعلنة سابقا:
0040102B sub_40102B proc near ; DATA XREF: start+Eo
0040102B
0040102B arg_0 = dword ptr 8
0040102B arg_4 = dword ptr 0Ch
0040102B arg_8 = dword ptr 10h
0040102B arg_C = dword ptr 14h
يدل arg_4 فعلا على القيمة OC. وإذا قمنا بعمل نقرة يمنى على arg_4 عند cmp [ebp+arg_4], 111h ، ستنسدل قائمة فرعية طالبة منا اختيار القيمة الحقيقية حسب النظم المختلفة (ستعشري، عشري، ثنائي...). وسنرى لاحقا أنه يمكننا إعادة تسمية arg_4 باسم أكثر وضوحا.
الخيارات:
يمكننا التحكم في إظهار المعلومات بالقدر الذي نريده وكذلك تنظيم تلك المعلومات حسب الرغبة. يسمح لنا menu>options الولوج إلى هذه الخيارات. من عند الخيارات العامة، نستطيع تحديد العديد من المعلومات التي يمكننا تشخيص واجهتها مثل اللون، المسافة بين الأقسام المختلفة (موقع ابتداء التعليمات، ابتداء التعليقات، أو ابتداء مواضع XREF ... )، خواص تسمية السلاسل الحرفية، إظهار القيم الستعشرية للتعليمات، إظهار مؤشر المكدس حسب التعليمة (مفيد جدا حتى لا تضيع حالة المكدس عنا).
ولأن عدد الخيارات كبير، فلن أستطيع سردها كلها هنا، وأنصحك بالتضحية بشيء من وقتك لاستكشافها وتعديلها حسب رغبتك. تمهل قليلا عند الواجهة، والعب مع القوائم وكل ما يظهر أمامك.
استخدام إيدا برو – الأوامر والوظائف الأساسية :
أولا نبدأ بفتح الملف المراد تنقيحه عن طريق File>Open file… أو عن طريق زر الاختصار الموجود على شريط الأدوات. ستنفتح نافذة أمامنا طالبة منا تحديد عدة خيارات، فلا تغير شيئا فقط قم بالنقر على OK . حينئذ نرى تطور تحليل الكود في النافذة الصغيرة التحتية، وننتظر حتى الانتهاء من التحليل. وقد يطول هذا التحليل بالنسبة للبرامج الكبيرة.
المناطق:
نحصل أخيراً على كود مفكك، حيث نستطيع تقسيمه إلى عدة مناطق كالآتي:
-الكود، حيث توجد الأوامر (التعليمات)
-البيانات، حيث نرى إعلان المتحولات بواسطة تعليمات مثل db, dd, dw وكأننا في أصل أسمبلي.
-الأكواد الغير مستغلة، نتعرف عليها بكون مقاطع الأوست غير نشطة (الجزء الواقع شمالا). وهي تشبه إعلان المتحولات : (DB 82) . المناطق الغير مستغلة هي تلك المناطق التي لا تشير إليها لا الأكواد ولا البيانات.
يمكننا تعديل كل منطقة عن طريق اختيار السطر أو السطور ثم الضغط على:
C – لمنطقة الأكواد
D – لمنطقة البيانات (إذا كنا عند سطر يقوم باعلان متحول مثلا باستخدام db، يمكننا تعديل نوعه عن طريق الضغط على حرف d مع تمرير الأنواع)
U – للمناطق الغير مستغلة
القفزات والاقتفاء:
يتوقف تنشيط الخيارات تحت إيدا برو على موقع تواجد مؤشر الفأرة. ضع المؤشر على اسم متحول أو وظيفة لتفعيل الخيارات الخاصة بتعديله. يمكننا اقتفاء الشفرة باستخدام أسهم لوحة المفاتيح أعلى/أسفل أو نقل المؤشر أفقيا عن طريق أسهم يمين/شمال (أو باستخدام الفأرة). عند وضع المؤشر فوق تعليمة تحمل في طياتها قفزة أو استدعاء، يكفينا وضع المؤشر فوق اسم اللافتة والضغط على زر الإدخال للانتقال إلى القفزة أو الاستدعاء. ويمكننا أيضا عمل نقرة مزدوجة مباشرة لأداء نفس الغرض.
نستخدم مفتاح الهروب للرجوع عدد مرات تقدمنا (مفيد للعودة من قفزة أو استدعاء). كما يمكننا استخدام السهمين الجانبيين الموجودين على شريط الأدوات.
ومن menu>jump نحصل على العديد من القفزات الممكنة، أكثرها استخداما هي ‘jump to address’ . يمكننا الولوج إليها عن طريق ضغط زر G من على لوحة المفاتيح، ‘jump to entry-point’ للذهاب إلى نقطة بداية الكود، ‘jump to function’ إلخ. وكذلك لدينا إمكانية تحديد النقاط المفتاحية التي تسمى ‘Marque position’ ونقوم بتحرير وصف لهذه النقطة، ثم نستطيع الوصول إليها عن طريق ‘jump to marked position’ .
أوفست الملف والعنوان الحالي :
أوفست الملف الذي يسمح لنا بإيجاد موضع التعديل في المحررات الستعشرية، هذا الأوفست نجده بإلقاء النظر على شريط الحالة المحتوي على العديد من الخانات في الجزء السفلي من البرنامج. إذا وضعنا مؤشر الفأرة على الخانة الرابعة برهة من الزمن سوف نرى "current position in the input file" . الخانة التالية تدلنا على العنوان الحالي متبوعا باسم الإجراء الذي يوجد به هذا العنوان علاوة على العدد الذي يجب إضافته للحصول على العنوان الحالي.
التعليقات:
هناك نوعان من التعليقات: التعليقات الخاصة والتعليقات المتكررة.
الخاصة، بالضغط على النقطتين الفوقيتين ‘:’ يمكننا وضع التعليقات الخاصة، هذه التعليقات تظهر في موضع واحد فقط.
المتكررة، بالضغط على الفاصلة المنقوطة ‘;’ يسمح هذا النوع من التعليقات بالانتشار عبر الشفرة، مثلا إذا وضعنا مثل هذه التعليقات عند وظيفة ما، سوف نراها إثر كل استدعاء يشير إلى هذه الوظيفة.
الأسماء:
هذه هي قمة القوة التفاعلية لـ إيدا برو، يمكننا إعادة تسمية أي متحول، أية وظيفة، أية قيمة أو لافتة وإعطائها اسماً له مدلول أكثر من التسمية الافتراضية التي أعطاها البرنامج.
لإعادة تسمية لافتة ما أو إضافة اسم لها، كل ما نفعله هو وضع المؤشر فوق تلك اللافتة أو العنوان ثم الضغط على ‘n’ ستظهر صندوق ليسمح لنا بإدخال الاسم الذي نريده. ستتغير اللافتة تباعا وكل تعليمة تشير إلى تلك اللافتة، فمثلا إذا كان لدينا شيء كهذا:
00401112 loc_401112: ; CODE XREF: sub_40102B+116j
00401112 mov al, [esi]
00401114 test al, al
00401116 jz short loc_401143
وقمنا بإعادة تسمية loc_401112 إلى coucou ثم ذهبنا إلى القفزة (عن طريق السطر XREF) التي تشير إلى هذه القفزة، هناك لن نرى jmp loc_401112 بل سنرى jmp coucou .
لتغيير اسم وظيفة ما، نتبع تقريبا نفس الإجراء، حيث يتم إعلان الوظيفة كالتالي :
call sub_4011A0 ، ( لاحظ: sub_ للوظائف. وloc_ للافتات ) لإعادة تسمية هذه الوظيفة يكفي الانتقال إلى مكان إعلان لافتتها :
004011A0 sub_4011A0 proc near ; CODE XREF: sub_401160+27p
004011A0
004011A0 arg_0 = dword ptr 8h
004011A0 arg_4 = dword ptr 0Ch
004011A0 arg_8 = dword ptr 10h
004011A0 arg_C = dword ptr 14h
004011A0
004011A0 push ecx
004011A1 push ebx
إما أن نضغط على ‘n’ تماما مثل ما نفعل مع اللافتات أو إما نقوم بذلك عن طريق قائمة متخصصة للوظائف بالضغط على ‘alt-p’ أو بالضغط اليميني ثم الولوج إلى القائمة الفرعية. في صندوق التحرير، يمكننا إعادة تسمية الوظيفة وتحرير عنوان البداية وعنوان النهاية الخاصين به. كما يمكننا تحرير صيغة الوظيفة باختيار ‘set function type’ من القائمة الفرعية، فيمكنك إذن إعادة تسمية المعاملات ويقوم إيدا برو بالتعديل على الشفرة لإعادة تسمية جميع أماكن ظهور هذه المعاملات. هاك نفس الوظيفة بعد تعديل صيغتها:
004011A0 ; int Calcul1(HWND hwnd,int var1,int var2,BOOL value)
004011A0
004011A0 Calcul1 proc near ; CODE XREF: sub_401160+27p
004011A0
004011A0 hwnd = dword ptr 8h
004011A0 var1 = dword ptr 0Ch
004011A0 var2 = dword ptr 10h
004011A0 value = dword ptr 14h
004011A0
004011A0 push ecx
004011A1 push ebx
يمكننا الاستعانة بالاسم الرمزي للثابت لإعادة تسمية القيم. مثلا في إجراء إدارة رسالة نافذة ما، سيتغير الثابت WM_INITDIALOG بعد تفكيكه إلى القيمة الرقمية 110 .
.code:0040102E cmp [ebp+arg_4], 110h
.code:00401035 jz short loc_401058
إذا قمنا بعمل نقرة يمنى على 110 واخترنا ‘use standard symbol constant’ ستنسدل قائمة محتوية على جميع ثوابت الويندوز التي تستخدم القيمة 110، ومن ثم علينا فحص الوضع الذي نحن فيه لنتمكن من اختيار الثابت المناسب. نحن هنا في وضع إدارة الرسائل. فيكون الثابت الذي نبحث عنه هو ثابت الرسالة WM_INITDIALOG ( WM_= Windows Message)، نقوم باختياره وتوثيقه فيتم تبديل 110 بـ WM_INITDIALOG . يمكننا انتهاز الفرصة لإعادة تسمية لافتة القفزة التي تليها بـ _Initdialog لأننا سنقفز إلى هذا الإجراء إذا كنا فعلا في إجراء إدارة الرسائل.
ما دمنا ها هنا، سننخرط بعض الشيء لإظهار تقنية العمل تحت إيدا برو. ولكن قبل ذلك نبدي إشارة إلى البرمجة بلغة الأسمبلي :
لإعطاء معاملات إلى وظيفةٍ ما ندفع بها على المكدس قبل الاستدعاء وبالترتيب العكسي بالنسبة للصيغة، يمكننا الولوج إلى المكدس عن طريق مسجل esp ، ومن ثم في الإجراء نستخدم ebp للحصول على عناصر المكدس بهذه الطريقة:
لحفظ قيمة ebp في المكدس
push ebp
وضع مؤشر المكدس في ebp
mov ebp,esp
الذي قمنا بحفظه آنفا
=old esp
ebp+00
يحتوي esp على عنوان رجوع الوظيفة قبل الاستدعاء
ebp+04
المعامل رقم 1
ebp+08
المعامل رقم 2
ebp+0C
المعامل رقم 3
ebp+10
المعامل رقم 4
ebp+14
إلخ
etc...
نهاية الإجراء
;end of proc
يحتوي ebp على القيمة القديمة لـ esp
mov esp,ebp
تفريغ المكدس للرجوع إلى الحالة الأولية له حيث يكون محتويا على عنوان الرجوع
pop ebp
الرجوع مباشرة إلى السطر الذي يلي الاستدعاء
ret
لنرجع إلى مثالنا:
.code:0040102E cmp [ebp+arg_4], 110h
.code:00401035 jz short loc_401058
هنا نقارن ebp+arg_4 الذي يُمَثِل ebp+0C والذي يعتبر المعامل الثاني لإجراء إدارة الرسائل، إذا طابقنا صيغة إجراء إدارة الرسائل :
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
تكون uMsg هي الحجة الثانية (المعامل الثاني)، وهي متحول يحتوي على القيم الرقمية (UINT – unsigned int) المبينة عن طريق ثوابت رمزية مثل WM_INITDIALOG ويجب الإشارة هنا إلى أننا نعلم عن طريق هذا المعامل الثاني أن القيمة الآتية هي من نوع Windows Message . فيمكننا إذن إعادة تسمية ebp+arg_4 بقيمتها الصحيحة، والتي ستكون في النهاية هكذا:
.code:0040102E cmp [uMsg], WM_INITDIALOG
.code:00401035 jz short _InitDialogRoutine
للذين لم يفهموا مني شيئا،أتمنى منهم ترك الموضوع تماما لأنه صعب جدا بدون اي مبالغة
يمكننا إعادة تسمية أي شيء نرغب في تسميته باختيار ‘Manual’ من القائمة المنسدلة أو بالضغط على ‘alt-F1’ مع التعليم على الخانة ‘allow no matched operand’ وحتى إن كان غير منطقي بتاتا أو ليس له علاقة بالكود. ولكن كن حذرا وخاصة إذا كنت تنوي توريد الشفرة إلى برنامج آخر. (سوف نتكلم عن هذا في الأجزاء القادمة).
حفظ العمل وتوريده:
وبعد عمل شاق وعند الرغبة في تكملة العمل في اليوم التالي، يكفي حفظ الشفرة المفككة بامتداد .idb الذي يمكننا فتحه مرة أخرى ووجود التعديلات كما تركناها.
ومن بين التوريدات المتوفرة (menu>produce) هناك إمكانية توريد التفكيك بامتداد .asm الذي ينتج أصلا يكون مقبولا للمجمع. حذاري ! الأصل الأسمبلي المنتج لن يكون قابلا للعمل مباشرة أو قد لا يعمل بتاتاً. فلا بد من تنقيته وتكييفه (راجع ما كتبناه عن الاستزراع الكيجيني). ربما رجعنا إلى هذا في الجزء الثالث إن شاء الله.
كما يمكن إنتاج ملف بامتداد .map الذي يقوم بمقابلة اللافتات، الوظايف المتحولة وعناوين البرنامج. مثل هذا الملف نستخدمه لتوريد التفكيك إلى سوفت أيس. وهذا يفتح الطريق إلى منقح واضح.
في الحقيقة أن موضوع الهندسة العكسية ضخم جدا ومتشعب ولايمكن للشخص العادي أن يلم به لدرجة كبيرة الا اذا تفرغ تماما لهذا الموضوع وكان عنده بعض المعلومات والخبرة عن البرمجة بشكل عام وأنا في الحقيقة لاأدعي أنني من الجهابذة في هذا الفن ولكن سوف أشارككم بما يتوفر لدي من خبرة في هذا المجال الصعب
في البداية بعض الناس يستغربون معنى كلمة الهندسة العكسية
انها عملية قراءة الشيفرة البرمجية للبرنامج والقدرة على تعديلها وبالتالي صنع الكراك أو الكيجن والتخلص من مشكلة النسخة التجريبية والبرامج غير المجانية
وأنا هنا سأذكر بعض الأدوات والطرق المساعدة
جميع من يعمل في الهندسة العكسية يعرف برنامج
ida-pro
انه البرنامج الأقوى والاشمل في هذا المجال وسوف يكون غالب الشرح عنه لأنه من اقوى واحدث برامج الهندسة العكسية على الاطلاق ولا يوجد له منافس
للعودة الى الصفحة الرئيسية