Operator Overloading in VB.Net & C#

0 التعليقات

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم
كما نعلم جمعيا فإن لغتي VB.Net و C# توفران مجموعة من العوامل الاساسية لتنفيذ العمليات الأساسية كالجمع والضرب على الأنواع الرئيسية مثل الأرقام والنصوص
فعند تنفيذ الكود التالي
VB.Net
 
C Sharp
فقيمة C الآن تساوي 46 ونفس الفكرة تنطبق على النصوص فبعد تنفيذ الكود التالي
VB.Net
C Sharp
فقيمة C الآن تساوي "Codingproc" إنه نفس "العامل"(+) الذي استخدمناه في المثال السابق إذا تم تطبيقه على أنواع رقمية فإنه يقوم بجمعها وإذا تم تطبيقه على أنواع نصية فإنه يقوم بوصلها.

لكن ماذا إذا أردت أن أن أطبقه على أنواع أخرى من إنشائي لنفترض انه لدي الكلاس
مجلد الذي يحتوي على اسماء عدد معين من الملفات ،وهذا هو الكود الخاص به:
 
VB.Net
C Sharp


منطقياً أو على أرض الواقع يمكنك دمج مجلدين معاً لينتج لديك مجلد يحتوي على الملفات الموجودة في المجلدين السابقين ،لنجرب ان نفعل ذلك في برنامجنا سيكون الكود الخاص بك مشابهاً للكود التالي 
VB.Net

C Sharp

 الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه لا يمكن تطبيق العامل (+) على الكلاس Folder، ولحل هذه المشكلة توفر لك لغتي VB.Net و C# الكلمة Operator التي تمكنك من تحديد طريقة إستجابة الكلاس او الستركتشر للعامل (مثل [+] في مثالنا) والتي لا تستخدم إلا مع المحددين (محددات الوصول) Public و Shared (الذي يعرف بـStatic في لغة C#)
اما عن طريقة استخدامها فهي مشابهة للـ Functions بشكل كبير لكن تختلف معها في أنه بدل إستخدام الكلمة Function نستخدم الكلمة Operator (هذا بالنسبة لمستخدمي لغة VB.Net).

يبدو ان الفكرة لم تضح لديك إنظر إلى الكود التالي وهو كود الكلاس Folder بعد تعديله ليصبح قابلاً للجمع
 
VB.Net
C Sharp



الآن إذا أعدنا تنفيذ كود الجمع الذي بالأعلى فسيطبع البرنامج


الآن ما هي العوامل التي يمكننا تحديد طريقة إستجابة الكلاس لها
VB.Net
العامل المعاملات
+, -, *, /, \, ^, &, Like, And, Mod, Or, Xor يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
=, <> يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
IsTrue, IsFalse يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر

C Sharp
العامل المعاملات
+, -, *, /, ^, &, %, | يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له
<<, >> يأخذ عاملين الأول من نفس نوع الكلاس والآخر نوعه (Integer)
==, != يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<, > يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
<= ,>= يأخذ عاملين الأول من نفس نوع الكلاس والآخر ليس هنالك نوع محدد له ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
true, false يأخذ عامل واحد من نفس نوع الكلاس ويعيد (Boolean) وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر
++, --, ~ يأخذ عامل واحد من نفس نوع الكلاس

 حينما تقوم بكتابة طريقة إستجابة كلاس لعامل ثنائي (أي يقبل معاملين(two arguments)) فلا يجب ان يكون المعاملين من نفس النوع فــفي الكلاس Folder في الأعلى العامل (+) يأخذ معاملين من نوع Folder وهذا ليس ضروري يمكننا كتابة العامل (+) للكلاس Folder مرة أخرى ليأخذ معاملين الأول نصي والثاني من نوع Folder ويضيف المعامل الأول إلى الملفات في المجلد ليصبح الكلاس

VB.Net
C Sharp



وليصبح كود الجمع 
VB.Net
C Sharp



وستكون نتيجة التنفيذ



لنجرب عامل آخر عامل المساواة على سبيل المثال ،عندما تقوم بمقارنة مجلدين في الواقع فما ستقوم به هو إنك سترى إن كان المجلدين يحتويان على نفس الملفات ،وإذا حاولت التعديل على الكلاس Folder فسيصبح قريبا للكود التالي
VB.Net
C Sharp



لنحاول الآن ان نقارن مجلدين يحتويان نفس الملفات

VB.Net
C Sharp

  الآن إذا حاولت تنفيذ هذا الكود فسيظهر لديك خطاٌ مفاده انه يجب عليك ان تحدد طريقة إستجابة الكلاس Folder للعامل <> في VB.Net و != في C# ،وسبق أن ذكرت هذا في الجدول في الأعلى
"وإذا حددت طريقة إستجابة الكلاس لواحد منهما يجب ان تحددها للآخر" لكن ضربت لك هذا المثال لأوضح لك الفكرة ،الآن لنعدل كود الكلاس Folder حتى يصبح قابلا للمقارنة.

VB.Net
C Sharp



ثم إذا نفذت كود المقارنة الذي بالأعلى فستكون النتيجة


 =====================================================

إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان  اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته
DoneByA

تعابير اللامدا في VisualBasic.NET

0 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

 ====تمهيد====

ما هي تعابير لامدا ؟
هي دالة(Function) او إجراء(Sub) بدون إسم يمكن إستخدامها في أي موضع يمكنك فيه إستخدام الـ"مفوض" Delegates وتتكون من سطر أو أكثر كما سنذكر لاحقا.

لماذا سأستخدم تعابير لامدا بينما يمكنني إستخدام دالة عادية أو مفوض ؟
لإنها مناسبة أكثر للحالات التي ستستخدم فيها الدالة مرة واحدة مثلاً داخل تكرار لحساب ضريبة المبيعات وستجعل الكود يبدو بشكل منظم ☺.

*يكثر إستخدام تعابير لامدا عند إستخدام تقنية LINQ.


====كيفية كتابة تعابير لامدا====

في البداية سنتعرف كيفية كتابة تعابير لامدا التي تتكون من  سطر واحد فقط.

VB.Net



 يوضح المثال السابق كيفية كتابة تعبير لامدا من سطر واحد فقط من نوع (Function) ،في البداية بعد التعريف عن المتغير الذي سنسد إليه التعبير وهو في هذه الحالة (FirstLambda) تقوم بكتابة نوع التعبير إما دالة (Function) أو إجراء(Sub) ثم المعاملات وإذا قمت بتحديد نوع المعامل الأول يجب عليك تحديد باقي أنواع المعاملات ولتعرف مقصدي أنظر للمثال التالي

VB.Net



المثال السابق خاطئ لإنه قمت بتحديد نوع المعامل FParameter هو من نوع Integer أما المعامل الثاني فلم أحدد نوعه وهذا خاطئ ☺ والطريقة الصحيحة هي إما بتحديد نوع المتغيرين أو عدم تحديد نوع المتغيرين معاً ☻.

ثم تقوم بكتابة التعبير ،ولا يجوز إستخدام Return إن كان التعبير من سطر واحد ☻ ولا يجوز تحديد نوع القيمة التي يعيدها التعبير.

الآن لنرى كيفية كتابة تعابير لامدا تتكون من أكثر من سطر.

VB.Net

 هي نفس التعابير التي من سطر واحد لكن مع إستخدام Return ويمكنك إستخدام As لتحديد نوع القيمة التي يعيدها التعبير إن كان دالة.

في الأمثلة السابقة أسندت التعبير لمتغير مثلا لـCharRepetition في المثال السابق لاستخدامه أكثر من مرة ،ويمكنك أيضا أن تكتب التعبير وتنفذه في نفس الوقت ولتفهم الفكرة أنظر للمثال التالي 

VB.Net



ويمكنك تمرير تعابير لامدا كمعامل للدوال أو الإجراءات التي تتطلب مفوض والمثال التالي يوضح الفكرة
VB.Net

في المثال السابق قمت بتمرير تعبير لامدا للدالة Where والتي تقوم بتنفيذه على جميع العناصر،
ومررت تعبير لامدا للإجراء Array.ForEach
 شروط كتابة تعابير لامدا
1- تعبير لامدا لا إسم له.
2- لا يمكن أن يحتوي على محددات وصول أو معدلات مثل Protected ،Overloads.
3- التعابير التي من سطر واحد لا يمكن إستخدام As لتحديد نوع القيمة التي يعيدها التعبير لكن بدلا من ذلك  يتم تحديد نوع القيمة تلقائيا من هيئة التعبير ،مثلا التعبير Parameter.ToCahrArray نوع القيمة التي يعيدها هي مصفوفة حروف.
4-في التعابير التي تتكون من أكثر من سطر كلمة As لتحديد القيمة التي يعيدها التعبير إن كان من نوع دالة هي إختيارية ،إن لم تستخدم As سيتم تحديد النوع الذي يتوافق مع جميع القيم التي يعيدها التعبير ولتعرف مقصدي أنظر للمثال التالي

VB.Net

الدالة السابقة تعيد جذر العدد في حال كان الرقم موجب تعيد جذره وهو من نوع Double ،أما في حال كان الرقم سالب فليس له جذر تعيد 0 وهو من Integer ،فالنوع الذي تعيده الدالة في هذه الحالة هو Double لإنه يمكن تحويل النوع Integer لـ Double والعكس خاطئ.

وللتوضيح أكثر شاهد المثال التالي
VB.Net

الدالة السابقة تعيد جذر العدد في حال كان الرقم موجب تعيد جذره وهو من نوع Double ،أما في حال كان الرقم سالب فليس له جذر تعيد نص("Negative Number") ،في هذه الحالة نوع القيمة التي تعيدها الدالة هو Object لإنه لا يمكن تحويل أي من النوعين للآخر (String to Double , Double to String).

5- التعابير التي من نوع(Function) التي من سطر واحد يجب أن يعيد هذا السطر قيمة ،ولا يكون تعبيرا لتنفيذه فقط، لإنه في التعابير التي من سطر واحد فقط لا توجد كلمة Return وإنما يعيد التعبير القيمة الناتجة عن تنفيذ السطر، أنظر المثال التالي

VB.Net

الدالة السابقة تعيد Boolean وهو ناتج تنفيذ التعبير Str.ToUpper = Str

6- التعبيرات التي تتكون من سطر واحد فقط ،يجب ألا تحتوي على End Function أو End Sub
7- لا يمكنك استخدام Optional أو ParamArray مع المعاملات.

=====================================================
أود أن أنوه أن موضوع (تعابير اللامدا) هو موضوع كبير جداً ،إذا كنت تريد أن تعرف كيفية كتابة تعابير اللامدا فقط فحسبك هذا الموضوع سيحقق لك غايتك ،أما إن كنت تريد التعمق فعليك بالمراجع مثل MSDN وانتظرني بالموضوع القادم ،سنتعمق فيها أكثر إن شاء الله.
======================================================

إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان  اترككم في امان الله ورعايته 



والسلام عليكم ورحمة الله وبركاته
DoneByA

تعابير اللامدا ،تعابير اللامبدا ،المفوض ،Delegates ،Anonymous Methods ،extension Methods in LINQ

5- أهم دوال وخصائص GeckoNode.

2 التعليقات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

اللهم علمنا ماينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

 ====>What is Gecko Node ?<====


7- Import Address Table Hook, 32-bit, 64-bit

1 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا ، انك انت السميع العليم 

   ==========> Import Address Table Hook, 32-bit, 64-bit <==========

الاخوة الاعزاء ، تكلمنا فيما سبق عن Trampoline Hook

واليوم سوف نتطرق الى IAT Hook
 وبالطبع يحتاج فهم هذه الـHook الي فهم ما هو اساسا PE File , وما هي PE Format، وذلك قبل الولوج الى IAT/EAT Hooks 

وبالطبع لن يتم شرح الـPE Format لان شرحه سوف يطول ويطول واشك اساسا في اننا سوف نوفيه حقه !

ويمكن القراءة عنه داخل MSDN - PE

==========> آلية عمل Import Address Table Hook <==========

كما نعلم بان الملف الـDll عبارة عن ...

كما نرى ان الملف عبارة عن 

4- أهم دوال وخصائص HTMLElement.

1 التعليقات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

 ====>What is HTML Element ?<====

هو فصيلة(Class) تمثل العناصر في لغة HTML

RegisterHotKey, UnRegisterHotKey.

0 التعليقات
بسم الله الرحمن الرحيم 
السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت العليم الحكيم

====>What Is The hot key ?<====

هو مفتاح(Key) أو مجموعة من الأزرار/المفاتيح عن ضغطها معاً تقوم بتنفيذ امر معين
وتدعى غالبا بالإختصارات

3- جلب العناصر

0 التعليقات
بسم الله الرحمن الرحيم 
السلام عليكم ورحمة الله وبركانه

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم


 ====>Internet Explorer (Web-Browser Control)<====

1- لجلب جميع العناصر الموجودة في الصفحة يمكنك أن تستخدم الخاصية All


WebBrowser.Document.All

VB.Net
C Sharp

=======================================================

2- لجلب العناصر التي تشترك في الوسم يمكنك أن تستخدم الدالة GetElementsByTagName

 المعاملات (Parameters) :
TagName : وهو الوسم الخاص بالعنصر
الناتج : تعيد HtmlElementCollection وهو مجموعة عناصر من نوع HtmlElement

VB.Net

C Sharp
=======================================================

3- لجلب عنصر محدد يتم جلبه بعدة طرق

1- باستخدام دالة GetelementById ولاستخدام هذه الدالة يجب ان يكون للعنصر معرف(ID)

المعاملات (Parameters) :
id : قيمة الخاصية ID
الناتج : تعيد HtmlElement ولا تعيد شيء إن لم يوجد عنصر يحتوي على معرف بهذه القيمة

الإستخدام
VB.Net
C Sharp

***********************************************************************************

2- لجلب العنصر الفعال (الذي يركز عليه أو يستخدمه المستخدم حالياً) يمكنك ان تستخدم الخاصية ActiveElement 

WebBrowser.Document.ActiveElement

VB.Net
C Sharp
**************************************************************************************

3- باستخدام الدالة GetElementsByTagName ثم نقوم بفلترة نتيجة حتى نحصل على العنصر المراد

لإستخدام هذه الطريقة يجب ان تكون هناك خاصية مميزة للعنصر مثل الإسم او النص (حتى نميزه عن بقية العناصر التي تشترك معه بالوسم)

للفلترة نقوم بعمل تكرار للتحقق إذا كان أي من العناصريحتوي على الخاصية التي نريدها وبنفس القيمة

الإستخدام 
VB.Net
C Sharp

 ====>GeckoFX<====

في البداية يجب عليك إستدعاء الفضاء Gecko

1- لجلب جميع العناصر يمكنك أن تستخدم الدالة التالية

VB.Net
C Sharp
الإستخدام 
VB.NET
 Dim AllOfTheElements As GeckoElement() = GetAllElements(YourGeckoWebBrowserName)
C#
GeckoElement[] AllOfTheElements = GetAllElements(YourGeckoWebBrowserName);

<======================================================>

2- لجلب العناصر التي تشترك في الوسم يمكنك إستخدام الدالة  GetElementsByTagName

الإسم : Gecko.GeckoDocument.GetElementsByTagName
الناتج : تعيد GeckoElementCollection

الإستخدام

VB.Net
C Sharp
<======================================================>

3- لجلب جميع العناصر التي تشترك بالإسم يمكنك ان تستخدم الدالة GetElementsByName

الإسم :  Gecko.GeckoDocument.GetElementsByName
الناتج : تعيد GeckoElementCollection

الإستخدام
VB.Net
      
C Sharp
<=======================================================>

4- لجلب العناصر التي تشترك بإسم الفصيلة (Class Name) يمكنك أن تستخدم الدالة GetElementsByClassName 

الإسم :  Gecko.GeckoDocument.GetElementsByClassName
الناتج : تعيد GeckoNodeCollection

الإستخدام
VB.Net
  
C Sharp
<=====================================================>


5- لجلب العناصر التي تشترك بالوسم والفضاء يمكنك استخدام الدالة GetElementsByTagNameNS

الإسم : Gecko.GeckoDocument.GetElementsByTagNameNS
الناتج : تعيد GeckoElementCollection

الإستخدام
VB.Net
C Sharp
<======================================================>

6- لجلب عنصر محدد يوجد عدة طرق

1- باستخدام دالة GetElementById

الإسم : Gecko.GeckoDocument.GetElementById
الناتج : تعيد Gecko.GeckoElement

الإستخدام
VB.Net
C Sharp

يمكنك أيضا أن تستخدم الدالة 
GetHtmlElementById 
بنفس الطريقة فقط تتختلف الدالتان بنوع الناتج

*****************************************************************************************
2- لجلب العنصر الفعال (الذي يركز عليه أو يستخدمه المستخدم حالياً) يمكنك إستخدام الخاصية  ActiveElement
الإسم : Gecko.Document.ActiveElement
القيمة : تعيد GeckoHtmlElement

الإستخدام
VB.Net
C Sharp
**********************************************************************************

3- باستخدام دالة إحدى الدوال (GetElementsByTagName, GetElementsByName GetElementsByClassName, GetElementsByTagNameNS) ثم تقوم بفلترة النتيجة حتى تحصل على العنصر المراد

لإستخدام هذه الطريقة يجب ان تكون هناك خاصية مميزة للعنصر مثل النص

الإستخدام
VB.Net
C Sharp
=========================================================

لجلب المعرف (ID) أو (Tag Name) الخاص بــــأي عنصر
انقر على الزر الأيمن للفأرة ثم اختر Inspect Element
ثم قم بتفعيل Mouse inspector
Internet Explorer : Ctrl + B

Mozilla Firefox, Nightly :

6- Trampoline Hook, 32-bit, 64-bit

0 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا، وانفعنا بما علمتنا، وزدنا علماً

==========> Trampoline Hook, 32-bit, 64-bit <==========

لقد قمنا سابقا بشرح الـDetours Hook ، وقد قلنا بانه وفي حالة استدعاء الـAPI نفسها من الـFilterFun فإنه سوف يحدث Infinite LOOP ، طبعا لانه عند استدعاء الـAPI يقوم بالقفز الى FilterFun واذا تم استدعاء الـAPI من FilterFun مرة اخرى سوف يؤدي الى Infinite LOOP 

ولكن نحن بحاجة احيانا الى فلترة الـParameters مع اعادة استدعاء الـAPI نفسها وبذلك نلجأ الى الـTrampoline Hook
اي ان الفرق بين الـTrampoline و detours هو امكانية إعادة الاستدعاء من FilterFun

والتعليمات المستخدمة هي JMP  كما تلكمنا سابقا وبدون اي تغيير ، اي ان الفرق بسيط 

يمكن ان يتدابر للبعض ان يعمل Hook - UnHook باستخدام الـDetours
اي انه اذا اراد استدعاء الـAPI نفسها من داخل FilterFun قام بارجاع الـبايتات الاصلية ثم قام باستدعاء الـAPI ثم قام بكتابة قفزة الـJMP مرة اخرى  
صحيح بانها تنجح ، لكن هذا خطا ، يوجد احتمالية الفشل
في حال استدعاء الـAPI اكثر من مرة ، خاصة اذا كانت الـAPI تاخذ وقت لتنفيذها ، فيمكن بعد ارجاع البايتات الاصلية ، استدعائها اكثر من مرة من قبل البرنامج المنصب عليه الـHook ، وذلك يمكن ان يتم قبل كتابة الـJMP  وهذا ما لا نريده !

==========> الآلية والفرق Trampoline Hook <==========

لقد قمنا في الـDetours بالكتابة على العنوان مباشرة 
اي OverWritten ، ولكن الذي يحدث بالـTrampoline وكمثال على MessageBoxA كالتالي ...



2- تعريف بـGeckoFX وكيفية إستخدامه.

0 التعليقات
بسم الله الرحمن الرحيم 
السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم وبعد

===>تعريف بـGeckoFX<===

هو متصفح مكتوب بلغة #C ومبني على نواة متصفح فايرفوكس، يتميز عن Internet-Explorer من حيث السرعة ودعمه لـCSS3 إختصاراً لـ(Cascading Style Sheets) ومن حيث الإستقرار أيضاً (إحتمال وقوع الأخطاء أقل بكثير)

===>كيفية إستخدام GeckoFX<===

1- عليك تحميله من https://bitbucket.org/geckofx  قم باختيار اخر نسخة ثم قم بتحميلها من التبويب Downloads


1- العناصر في لغة HTML

0 التعليقات
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

====>الصيغة العامة للعناصر في لغة HTML<====

 

تتكون العناصر بشكل عام في لغة HTML من
Tag : الوسم
Identifier : المعرف، وهو اختياري(أي لا يجب أن يوجد في جميع العناصر) وهو فريد (اي لا تتكرر قيمته بالصفحة)
Name : إسم العنصر، وهو اختياري أيضاً
Attributes : الخصائص مثل العرض والطول

إفتتاح قسم التعامل مع صفحات الويب

0 التعليقات
بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الحكيم

تم بحمد الله وفضله إفتتاح قسم التعامل مع صفحات الويب

5- Detours Hook, 32-bit, 64-bit

1 التعليقات


بسم الله الرحمن الرحيم 



السلام عليكم ورحمة الله وبركاته 



اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 



==========> Detours Hook <==========
الاخوة الاعزاء ، تكلمنا في الدرس السابق عن كيفية تعطيل عمل API
وفي الدرس الذي قبله عن DLL File Injector 

والان سوف نقوم باذن الله ببرمجة DLL File اي سوف نقوم ببرمجة مكتبة الهوك ، حتى نقوم بحقنها ، ومن بعد تشغيلها ، لتقوم بعمل Hook ، ومن ثم يتم تمرير الـParameters على Filter Function الخاصة بنا داخل المكتبة 


4- Disable API

1 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

==========>   Disable API <==========
بحمد الله وبفضله قد شرحنا سابقا الهوك ومفهومه واّليته
وتم شرح الـDll File Injector
وآليته 

الان نتطرق الى كيفية تعطيل الـAPI ليكون مقدمة 
للتطرق الى كيفية عمل Hook على API بالنوعين Detours + Trampoline

==========> How It's Work ! <==========

نعلم ، بان البرنامج عبارة عن مجموعة من التعليمات البرمجية ASM لذلك عند استدعاء API 
يكون الامر كالتالي


3- DLL File Injector

3 التعليقات
بسم الله الرحمن الرحيم 

السلام عليكم ورحمة الله وبركاته 

اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد 

==========>  Dll File Injector <==========




بحمد الله وبفضله قد شرحنا سابقا الهوك ومفهومه واّليته
وقد قلنا سابقا بان الـHook 
عملية فلترة وتنقية للـAPI والـFunctions 

نحن نريد تنقية API ، اي بمعنى اخر نريد بدل استدعاء WinAPI الاصلية يتم استدعاء الـFunction الخاص بنا ليتم الفلترة والتنقية كما نريد ، ولكن كيف سوف يتم المرور على الـFunction الخاص بنا ، وهو اصلا ليس جزئا من البرنامج نفسه ؟ وكيف سوف يتم تمرير الـParameters الخاصة بالاستدعاء الى الـFunction الخاص بنا والـFunction الخاص بنا للفلترة غير محمل بالذاكرة اصلا ؟

ومن هنا جائت الحاجة الى Dll File Injector 
اذ اننا سوف نقوم بتشغيل ملف Dll داخل Process اخر ، اي نحن بحاجة لحقن ملف Dll داخل Process
(وذلك الـDLL يحتوي على Function الفلترة وايضا يحتوي على اكواد عمل الـHook على الـAPI التي نريد ) ليتم عمل هوك على الـAPI المطلوبة ، وليتم تمرير الاجرائات المستخدمة على الـFunction الخاصة بنا داخل نفس البرنامج اي بدون الحاجة لبرامج خارجية او او ...


حسنا ! ، بالبداية حتى ننشئ هذا Dll File Injector 
نحتاج لنعرف قرابة 5 API's ، وربما لن نتطرق لشرح كافة الـParameters الخاصة بها شرحا وافيا الا ما نحتاجه

الان ، بالبرنامج العادي الذي تبرمجه كمبرمج ! كيف يتم تحميل DLL File داخله ؟
يتم ذلك عن طريق  LoadLibrary API (ادخل لتقرا عنها اذا كنت لا تعرفها)


==========>  LoadLibrary API <==========

HMODULE WINAPI LoadLibrary(
  _In_  LPCTSTR lpFileName );

هذه الـAPI تقوم بتحميل الـDLL File داخل البرنامج


 وتاخذ 1Parm  وهو مسار المكتبة او اسمها
 _In_  LPCTSTR lpFileName


وتقوم بارجاع Handle المكتبة 






طبعا هذا لو نحن برمجناه 
لكن المشكلة باننا لسنا من برمجه ونحتاج الى حقن هذه الـDLL من برنامج خارجي وبطريقة غير رسمية تقريبا ...


==========> CreateRemoteThread API <==========

HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId );


هذه الـAPI تقوم بانشاء Thread ، وهذه الـThread سوف يتم تحديد موضوعه ومحتواه ، اي ماذا يفعل وماذا سوف يستدعي من API ، فنحن نريد انشاء Thread داخل الـProcess المستهدف يستدعي LoadLibrary ببارميتر مسار مكتبة الـHOOK التي سوف نبرمجها لاحقا ليقوم الثرد بتحميل المكتبة الى الـProcess ومن ثم تشغيلها 

وتاخذ 7 Parameters 
ما يهمنا الاول ، والرابع والخامس


الاول - وهو Process Handle مقبض العملية التي تريد الحقن فيها
_In_   HANDLE hProcess
..........
الرابع - هو عنوان الـFunction التي نريد تشغيلها وهي LoadLibrary API لكن نحتاج لجلب عنوانها 
  _In_   LPTHREAD_START_ROUTINE lpStartAddress
..........
الخامس - وهو الـParamter الذي نريد ارفاقه للـFunction التي نريد استدعائها في الParameter الرابع 
_In_   LPVOID lpParameter


تقوم بارجاع Handle الـThread الذي تم انشائه اذا نجحت العملية ، واذا فشلت ترجع NULL






نلاحظ في  CreateRemoteThread API
 الـParameters المستخدمة ! نحتاج الى تجهيزها 
الان نلاحظ ! الـParameter الاول نوع Handle اي اننا نحتاج مقبض
وسوف نحصل عليه من OpenProcess API


==========> OpenProcess API <==========

HANDLE WINAPI OpenProcess(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  DWORD dwProcessId );

ببساطة تاخذ 3 Parameters 


 نلاحظ الـParameter الاول  ، وهو الصلاحيات التي نريدها وللاطلاع على الصلاحيات

طبعا اذا قمنا بالدخول على  CreateRemoteThread API
نلاحظ باننا نحتاج صلاحيات هذه كافة

PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION,
 PROCESS_VM_OPERATION, PROCESS_VM_WRITE, and PROCESS_VM_READ

او سوف نستخدم PROCESS_ALL_ACCESS ، لكن احذر عند استخدامها ، يمكن ان يفشل ولا سمح لك الـProcess بالحصول على كافة الصلاحيات 
_In_  DWORD dwDesiredAccess
..........
اما الـParameter الثاني  ، لن نتطرق لشرحه كثيرا ولا يعنينا ، لكن ! اذا كان هذا الـParameter قيمته TRUE
 فان العمليات التي انشئت تحت هذا Process سوف يتم وراثتها من قبل الهاندل والعكس صحيح
 _In_  BOOL bInheritHandle
..........
اما الـParameter الثالث ، فهو PID اي Process ID 
_In_  DWORD dwProcessId


بعد ذلك اما ان تقوم الـAPI بارجاع الـHandle ويعني نجاحها او ان تقوم بارجاع NULL ويعني فشلها




نلاحظ في  CreateRemoteThread API الـParameter الرابع
وهو البارميتر الذي نريد تمرير له عنوان الـAPI التي نريد استدعائها 
ولنحصل على ذلك العنوان نستخدم ...


==========> GetProcAddress API <==========

FARPROC WINAPI GetProcAddress(
  _In_  HMODULE hModule,
  _In_  LPCSTR lpProcName
);

تاخذ 2 Parameters


الاول - هو Handle المكتبة التي نريد استدعاء منها الـAPI
وقد سبق الكلام عن استدعاء Handle للمكتبة عن طريق  LoadLibrary API
ومن خلال هذه الـParameter سوف نقوم بجلب هاندل عن طريق   LoadLibrary API للمكتبة التي تحتوي
لاننا نريد ان نستخدم   LoadLibrary API داخل الـProcess المستهدف
_In_  HMODULE hModule
..........
الثاني - وهو اسم المكتبة والذي سوف يكون "LoadLibraryA"
لماذا LoadLibraryA
تدل على ANSI ، ونحن نريد تمرير عنوان المكتبة ، ANSI وليس UNICODE
_In_  LPCSTR lpProcName


اذا نجحت سوف تقوم بارجاع العنوان داخل المكتبة للـFunction المطلوبة وان لم تنجح سوف تقوم بارجاع NULL



نلاحظ في  CreateRemoteThread API الـParameter الخامس
نلاحظ انه LPVOID اي انه Pointer وليس LPCSTR
لذلك يستحيل ان نمرر البارميتر الذي نريده مباشرة ، كـLPCSTR او String عادي ، لذلك نحتاج الى كتابته على الذاكرة الخاصة بالـProcess لتمريره ، والذاكرة الخاصة بالبروسس لا نريد الكتابة عليها عشوائيا ، حتى لا يحدث خلل ، وحتى لو اردنا الكتابة عليها عشوائيا نحتاج الى صلاحيات معينة ايضا 
ولنقوم بذلك نحتاج الى 2 API's 

بالبداية دعنا نتعرف على

==========> WriteProcessMemory API <==========

BOOL WINAPI WriteProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPVOID lpBaseAddress,
  _In_   LPCVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesWritten );


وهي API تستخدم للكتابة على الذاكرة نلاحظ انها تاخذ 5 Parameters


الاول - Process Handle وقد سبق شرح جلبه عن طريق  OpenProcess API
مع العلم باننا نحتاج الى الصلاحيات
 PROCESS_VM_WRITE and PROCESS_VM_OPERATION

ولا داعي لإعادة جلب Handle بهذه الصلاحيات لاننا استخدمنا الصلاحيات نفسها ضمن جلب صلاحيات لانشاء الـThread في  CreateRemoteThread API 
_In_   HANDLE hProcess
..........
الثاني - ويتم تمرير له العنوان الذي نريد الكتابة عليه 
 _In_   LPVOID lpBaseAddress
وسوف يتم الشرح عنه بالاسفل وكيف سوف نجلبه عن طريق API اخرى
..........
الثالث - وهو الـString الذي نريد كتابته 
نلاحظ
LPCVOID
Long Pointer Char 

وهو المتغير الذي سوف نحفظ فيه مسار مكتبة الـHook
 _In_   LPCVOID lpBuffer
..........
الرابع - وهو طول عنوان المكتبة التي تم تمريرها في الـParamter الثالث
_In_   SIZE_T nSize
..........
الخامس - لا يهمنا ، ويتم تمرير له Pointer من نوع SIZE_T
ليتم تخزين فيه عدد البايتات الفعلية التي تمت كتابتها كما ترون _Out_
  _Out_  SIZE_T *lpNumberOfBytesWritten

اذا تمت العملية بنجاح ترجع TRUE ، اذا فشلت NULL





الان  WriteProcessMemory API سبق وقلنا بان الـParameter الثاني نريد تمرير له العنوان الذي نريد الكتابة عليه ، اي اننا نريد حجز جزء من الذاكرة بمقدار ما نريد كتابتة ( الـParameter الرابع ) ولفعل ذلك نحتاج الى


==========> VirtualAllocEx API  <==========

LPVOID WINAPI VirtualAllocEx(
  _In_      HANDLE hProcess,
  _In_opt_  LPVOID lpAddress,
  _In_      SIZE_T dwSize,
  _In_      DWORD flAllocationType,
  _In_      DWORD flProtect );


طبعا هي تقوم بحجز جزء من الذاكرة بالصلاحيات التي تريدها ونلاحظ ان لها 5 Parameters


الاول - Process Handle وقد تم شرح جلب Handle عن طريق OpenProcess API
وهذه الـAPI تحتاج الى صلاحية
PROCESS_VM_OPERATION 

ولا داعي لإعادة جلب Handle لان الصلاحيات المطلوبة تم استخدامها نفسها في CreateRemoteThread API  
_In_      HANDLE hProcess
..........
الثاني - طبعا كما تلاحظون هو optional اختياري _In_opt_  ، وسوف نستخدم قيمة NULL له 
لكن ببساطة هذه الـParameter يتم وضع فيه العنوان الذي نريد البدء منه في حجز الذاكرة 
_In_opt_  LPVOID lpAddress 

واذا قمنا باختيار عنوان محدد ، يمكن ان يفشل في الحجز فيه لذلك
 سوف نستخدم NULL 
ليختار المكان المناسب لحجز الذاكرة داخل الذاكرة
..........
الثالث - وهو مقدار المساحة التي نريد حجزها وسوف يكون طول مسار مكتبة الـHook
_In_      SIZE_T dwSize
..........
الرابع - وهو نوع المساحة التي نريد حجزها
وله اربع انواع بشكل رئيسي ! ولا نريد التكلم عنها جميعا لانها ليست موضوعنا 
ويمكنك رؤيتها في المرجع الخاصة بالـAPI اعلاه 

الا اننا سوف نقوم باستخدام نوع MEM_COMMIT
اذ ان هذه النوع يستخدم لتخزين المعلومات وهذا ما نريده 
..........
الخامس - وهو صلاحيات الحماية التي نريد استخدامها 
ويمكن رؤية جميع الصلاحيات من هنا

الان بما اننا نريد ان نكتب على الذاكرة ومن ثم سوف يتم قرائتها من قبل 
يعني ذلك باننا نحتاج الى صلاحيات للكتابة والقرائة لذلك سوف نستخدم
PAGE_READWRITE
  _In_      DWORD flProtect


سوف يتم ارجاع العنوان الذي تم فيه حجز الذاكرة ويعني ذلك نجاحها  ، في حالة ارجاع NULL يعني ذلك 
فشلها في حجز الذاكرة




 ==========> الان الخطوات البرمجية <==========
1- تعريف متغير ووضع فيه مسار المكتبة المطلوبة حقنها
2- جلب مقبض HANDLE للـProcess المراد حقنها
3- حجز ذاكرة بمقدار طول مسار المكتبة
4- كتابة المسار على الذاكرة المحجوزة
5- انشاء Thread ليقوم بتشغيل LoadLibraryA على المكتبة
6- اغلاق الـHANDLE



C++ CODE 

#include <Windows.h>
#include <iostream>
void main() {
 int ProcessID = 1760; // Process identifier
 char* LibPath = "C:\\ProgrammingTest\\DllFile.dll"; // Dll File Path
 HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);  // Get Process Handle
 LPVOID BufferAddress;
 BufferAddress = VirtualAllocEx(hProc, NULL, strlen(LibPath) + 1, MEM_COMMIT, PAGE_READWRITE); // Allocate A Buffer And Get The Address
 WriteProcessMemory(hProc, BufferAddress, LibPath, strlen(LibPath), NULL); // Write the LoadLibraryA API Parameter(DLL Path) On Memory Buffer(BufferAddress) .
 // Create A Thread That Runs In The Virtual Address Space In The Process With LoadLibraryA With Our Parameter
 HANDLE x = CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)GetProcAddress(LoadLibraryA("Kernel32"), "LoadLibraryA"), BufferAddress, NULL, NULL);
 CloseHandle(hProc);
 if (x == 0) std::cout << "Injection Failed.\n";
 else std::cout << "Injected Successfully.\n";
 system("pause");
}



ملاحظات : 
1- يمكنك تجربة الـInjector اعلاه ، قم ببرمجة ملف dll ليكون كتجربة كالتالي

#include <Windows.h>
void WINAPI DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved) {
        switch (Reason) {
        case DLL_PROCESS_ATTACH: // Beginning
                MessageBoxA(0, "Injected Successfully." , "M" , 0); break;
        case DLL_PROCESS_DETACH: // At End
                MessageBoxA(0, "End ...", "M", 0);
        }

2- اغلق الـAnti-Virus 
3- اذا كان البرنامج الذي تريد حقنه لديه صلاحيات Admin يجب ان يكون لديك ايضا نفس الصلاحيات
4- اذا كان البرنامج المراد حقنه x64 يجب ان تعمل Compile على x64 للـDll File وايضا Dll File Injector



إن أصبت فمن الله ، وإن اخطئت فمني ومن الشيطان
اترككم في امان الله ورعايته 

والسلام عليكم ورحمة الله وبركاته


DoneByM

عمل هوك ، صنع هوك ، فلترة دالة ، فلترة API ، القضاء على Function ، انشاء حماية ، منع استخدام Function ، كيفية عمل هوك ، كيفية عمل Hook ، هوك Detours ، هوك trampoline ، هوكات IAT , EAT ، Kernel32.dll , System32 , User32.dll , هوك Ring3 ، User Mode Hook, Kernel Mode Hook , الكتابة على الذاكرة 


يمكنك النقل من المدونة كيف ما تشاء وبدون ذكر المصدر