2- مقدمة حول الـWinMesssages Hooking

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

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

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

=========> مقدمة حول Window Messages Hooking <==========

نحن لا نريد شرح ارسال واستقبال Window Messages
بل نريد بيان بعض المعلومات عنها وفهم القليل عنها لدخول في Hook الخاص بها

بالبداية دعنا نتلكم حول Window Messages قليلا ! ، اذ انها تعد مهمة جدا جدا بل والاهم في الترابط والاتصال والتفاعل بين النظام والنوافذ والاجهزة المرئية الـHardware وغيرها

وبما انك مبرمج دعني اطرح عليك سؤال : هل تسائلت يوميا عن events التي تستخدمها عند بناء مشروع ؟ مثلا
FormClosing
MouseDown
 هل تسائلت كيف تحدث ؟ وكيف تجري ؟ إن المعروف بان الـevent ببساطة اجراء معين يتم عند حدوث شيئ معين ، لكن كيف يعلم البرنامج بحدوث هذا الشيئ ؟

وهذه يعطيك تماما فكرة عن الـWindow Messages ، فمثلا عندما يقوم شخص بالضغط على Alt + F4 حتى يخرج من النافذة ، فاذا اسخدمت حدث Form_Closing في C# ,,, VB.NET فانه سوف يتم استدعاء الاكواد التي قمت بوضعها داخل الـEvent ، فعند الضغط على المفتاحين Alt + F4 فانه يتم ارسال Window Message تعرف باسم WM_QUIT الى النافذة الفعالة حاليا ، ويتم معالجتها ، ومن ثم يتم اتخاذ الاجراء الخاص بها ، ونفس الشيئ اذا تم الضغط على زر الخروج في الاعلى "X"
ونفس الشيئ KeyDown ، اذا يتم ارسال رسالة اسمها WM_KEYDOWN ، وهذه الرسالة تفيد بانه تم الضغط على مفتاح معين، وتحمل الرسالة معلومات المفتاح الذي تم ضغطه ، ومن ثم تتم معالجة الحدث وما الى ذلك

والجدير بالذكر ، عند استخدام Task Manager في النظام الاعتيادي فانه لدينا تبويبان الاول Applications والثاني Processes
فالاول يقوم بجلب النوافذ وارسال WM_QUIT فتلاحظ انه يتم استدعاء FormClosing اذا قمت باستخدامه
اما Processes فاتع لا يتم ارسال اي رسالة لكن يتم استخدام API للقضاء على البروسس مباشرة

ملاحظة : WinMessages انواع 
النوع الاول Window Messages ويختص بالنوافذ وهذا ما نتكلم عنه
والنوع الثاني Thread Messages ويختص بالThreads الخاصة بالـProcess

ملاحظة : بامكانك استخدام برنامج SPY++ لرؤية الرسائل التي تصل الى اي نافذة بشرط ان يكون التطبيق Native وليس .net 

=========> كيف تحدث Window Messages <==========

Window Messages لها اعداد كبيرة ووظائف لا تحصى حتى Ctrl + C , Ctrl + A وما الى ذلك 
عبارة عن ارسال Message ،لذلك وبشكل مفصل 
.....

عند ارسال Window Message فانه يتم تخزينها في  Message Queue بما يعني تخزينها داخل قائمة في الذاكرة ليتم معالجة الـWindow Messages واحدة تلو الاخرى 
ولكن عند ارسال رسالة فانك تحتاج الى من يستقبلها ! ، لذلك يوجد بما يمسى Message Loop ، اذ انها Loop تقوم بالمرور على Message Queue وبمجرد ارسال رسالة وتخزينها في الـQueue تقوم بتمرير الرسالة الى Message Handler 

والـMessage Handler ، عبارة عن Function صممت لتتم معالجة الرسالة المرسلة الى النافذة والتي يتم من خلالها تنفيذ الـEvent
والذي يحدث تلقائيا من قبل MS ! او ان تقوم بادراج Message Handler داخل البرنامج نفسه اي Event ليحدث هو بدلا عن الاجراء الافتراضي والتلقائي من قبل MS
ملاحظة : في C++ عليك استخدام GetMessage API التي تمثل Message Handler 
.....

الرسائل يتم ارسالها مع 2 Parameters وكل Parameters يحمل قيمة 32bit - 4Byte , 64bit - 8Byte
باسم lParam ثم wParam
طبعا يتم تخزين القيم الضرورية لها على سبيل المثال
البارميتر الاول غير مستخدم
لكن البارميتر الثاني مستخدم وهو عبارة عن Pointer الى النص الجديد 
وطبعا ولكل Message قيمة ترجع يمكن ان تكون 0,1 في حالة انجاح ويمكن ان تكون غير ذلك
ويمكن ان لا ترجع قيمة وترجع القيمة من خلال الـبارميترز نفسهم من خلال تمرير الـPointer

وطبعا لكل Message بارميترز خاصة فيه بامكانك ايجاد المعلومات عنه في MSDN

=========> ارسال Window Messages <==========

ولو انه خارج الموضوع قليلا ! ، الا اني سوف اتحدث عنه
ارسال الـWindow Message برمجيا يمكن اختصاره بثلاث طرق رئيسية

1-SendMessage API
2- PostMessage API
3- Another API's Are Using Send/PostMessage

اما بالنسبة لـSend/PostMessage
كلاهما لديه 4 Parameters
الاول - Hanlde
الثاني - اسم الـMessage او بمعنى اخر Message Value
الثالث - البراميتر الاول للـMessage
الرابع - البارميتر الثاني للـMessage

والفرق بينهما باختصار شديد يكمن في امكانية ارسال Messages الى Threads
او الانتظار حتى معالجة الرسالة ! اي مرورها في Queue كاملة ام لا

بالنسبة للطريقة الثالثة
يوجد بعض API's المختصة بارسال رسائل تلقائيا ! اذ انها تؤدي تلك الوظيفة بدون التعامل مع Messages
وتجد مرجعها هنا
MSDN

ملاحظة : سوف يتم انشاء بعض المواضيع عن ارسال Window Messages 
وسوف اقوم بوضع الروابط هنا ان شاء الله

=========> كيف سوف نباشر بالـWindow Messages Hooking <==========

بالواقع يمكن عمل Hook بشكل رسمي على Window Messages
والمقصود من الـHook هنا فلترة الرسائل التي تصل الى النوافذ ، فمثلا يمكن عمل Keylogger لتسجيل اي مفتاح يتم الضغط عليه ويمكن عمل ClickLogger لتسجيل اي نقطة على الشاشة قمت بالضغط عليها

وهنالك API's مصرح بها من قبل MS 
لعمل HOOK على الـMessages 
وسوف يتم التطرق اليها ان شاء الله






ملاحظة : موضوع WinMessages موضوع كبير جدا ومهم
انصح برؤية هذا الرابط

https://msdn.microsoft.com/en-us/library/windows/desktop/ms644927(v=vs.85).aspx



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

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

DoneByM

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

1- مقدمة حول الـWinAPI Hooking

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

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

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

=========> مقدمة حول الـWinAPI Hooking <==========

الهوك ومن اسمه هو خطاف ، يستخدم لمراقبة او فلترة او تعديل الاستدعاءات الخاصة بالـFunctions او WinAPI 

وحتى اوضح الفكرة اكثر ، فعلى سبيل المثال الـAnti-Virus ،هل تسائلت يوميا كيف وانه عندما تفتح برنامجا واذا كان ذلك البرنامج مصاب بفايروس فانه يتم التقاطه ومسحه ، لكن كيف ؟ وكيف عرف الـAnti-Virus بانك قمت بتشغيل ذلك الملف اصلا ؟ او حتى انك تريد تشغيله !!!
بالطبع إن الـAnti-Virus لم ينتظر حتى تشغيل البرنامج المصاب ومن ثم قام بايقافه ، فماذا لو تم تشغيل اكثر من Process في آن واحد ؟ فكيف سوف يتعامل المستخدم مع ذلك الامر اساسا ؟ 

بالواقع ذلك عمل الـHook تحديداً فانه عندما يقوم المستخدم او اي عملية اخرى بتشغيل ملف معين ، فانه يستخدم API اسمها CreateProcess ( اضغط لتدخل مرجعها من قبل MS )  ، وهذه الـAPI هي المسؤولة عن تشغيل البرامج ، فوظيفة الـHook هي مراقبة هذه الـAPI عند استدعائها وعمل فلترة لها واتخاذ الاجراءات المناسبة لما يترتب على ذلك الامر   

اذا اي استدعاء للـProcess عن طريق CreateProcess فانه بالواقع يمر ببرنامج الـAnti-Virus ليقوم بفلترته ومن ثم تنفيذه ، وبذلك يتم حماية المستخدم

وايضا هنالك الكثير من API المسؤولة عن نقل الملفات ونسخها وحذفها او قتل الـProcess او إنشائها او اخذ Handle لها ، ولذلك فهل يستطيع احد قتل الـAnti-Virus باستخدام Task Manager ، بالطبع لا ، وبنفس الوقت انا لا اقول انه لا يمكن قتله 

=========> انواع الـWinAPI Hooking <==========

ينقسم الهوك الى عدة انواع
Ring -1
Ring 0
Ring 1
Ring 2
Ring 3

ما يهمنا حاليا Ring 3

Ring-1: بالواقع نوع من انواع الهوك يتم على مستوى CPU ولم يتم التصريح عنده بعد او اتخاذه بشكل رسمي او استخدامه 
Ring0: او ما يطلق عليه Kernel-Mode Hook، اذ انه يتم على مستوى النواة وعلى كافة البرامج وهو ما تستخدمه برامج الحماية 
Ring1 & Ring2: هوكات تحدث داخل النظام ولا يتم التعامل معها


Ring3: ويطلق عليه User-Mode Hook ، وبالواقع هو الذي يهمنا حاليا ويتم على Process معين ! ويمكن جعله Global Hook ولكل ذلك عيوب ومميزات ، ويقسم الى 4 انواع معروفة :-

Detours 
Trampoline
IAT - Import Address Table 
EAT - Export Address Table 

=========> اّلية WinAPI Hook Type Ring3 <==========

إذا قمنا بالدخول الى CreateProcess مرة اخرى ، فنجد بان هذه الـAPI موجودة داخل DLL باسم Kernel32.dll
وهذه الملف يوجد داخل مجلد system32  --- C:\Windows\system32
وبما ان هذه الـAPI توجد داخل الـDLL File اذا بالتاكيد فان لها عنوانا داخل هذه الملف 

ومن المعروف بانه عند تشغيل برنامج معين فانه يتم تحميله على الذاكرة لمعالجته ، وبالتالي وبما ان البرنامج يتم تحميله على الذاكرة سوف يقوم بتحميل المكتبات التي يستخدمها ايضا معه في الذاكرة ليقوم باستدعاء منها ما يشاء

ومن المعروف ايضا بانه يمكننا الكتابة على الذاكرة والتلاعب بها كيف ما نشاء 
..... 

ومن هنا جائت الفكرة ! اذ ان عنوان الـAPI معروف ويمكننا التلاعب بالذاكرة، فالبطبع يمكننا كتابة تعليمات ASM على ذلك العنوان كيف ما نشاء ، ويمكننا تغيير ذلك العنوان اساسا الى عنوان الFunction الخاص بنا ، وبالتالي تم تحقيق الهوك على الـAPI المراد الحماية منها ، مع العلم بان لكل هوك نوع وطريقة خاصة به لتادية ذلك الامر وسوف يتم شرح ذلك في مواضيع قادمة ان شاء الله لانظمة 64bit ,,, 86bit 


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

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

DoneByM

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

RtlSetProcessIsCritical API - Undocumented

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

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

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

=========> Information <==========

API NameRtlSetProcessIsCritical
LibNTDLL.dll
Return Value: Nothing

لا يوجد مرجع لها من قبل Microsoft 

الوظيفة : حماية العملية ، حيث انه اذا تم استدعائها وتم قتل العملية سوف تظهر شاشة الـBSOD اختصارا لـ
Blue Screen Of Death
وبما يعرف بشاشة الموت الزرقاء ، وعند قتلها سوف يؤدي ذلك الى ظهور الخطأ 

CRITICAL_PROCESS_DIED .

سؤال : هل يمكن بالفعل الاعتماد عليها في حماية البرنامج من الاغلاق ،،، بالطبع لا ! فيمكن عن طريق  NtSetInformationProcess API الغاء عملها ، اضافة الى ذلك يمكن حقن ملف DLL داخل الـProcess وإعادة استدعاء RtlSetProcessIsCritical لايقاف عملها ، فايقافها سهل جدا


ملاحظة : استخدامها يتطلب صلاحيات Administrator وبالتالي اذا كان يوجد برنامج اخر يريد ايقاف العملية الخاصة بك والمحمية ويريد الغاء عمل RtlSetProcessIsCritical باستخدام NtSetInformationProcess  او حقن ملف فيه فان ذلك ايضا يتطلب صلاحيات Administrator 


=========> API Declaration <========== 
VB.NET



    <System.Runtime.InteropServices.DllImport("NTDLL")> _
    Public Shared Sub RtlSetProcessIsCritical(NewSettings As Boolean, ByRef OldSettings As Boolean, IsWinLogOn As Boolean)
    End Sub





Cs

        [System.Runtime.InteropServices.DllImport("NTDLL.dll")]
        public static extern void RtlSetProcessIsCritical(Boolean NewSettings, Boolean OldSettings, Boolean IsWinLogOn);


C++
يختلف استدعائها في C++ كونها Undocumented  
سوف يكون الكود كالتالي 

#include <Windows.h>

typedef long(WINAPI* RtlSetProcessIsCritical)(
IN BOOLEAN NewSettings,
OUT BOOLEAN OldSettings,

IN BOOLEAN IsWinLogOn

);



void main() {

RtlSetProcessIsCritical CallAPI;
CallAPI = (RtlSetProcessIsCritical)GetProcAddress(LoadLibraryA("NTDLL.dll"), "RtlSetProcessIsCritical");
}



=========> How To Use <========== 

نلاحظ بان الـAPI لها ثلاثة Parameters ما يهمنا هو الاول فاذا كان True تعني تشغيله وFlase تعني ايقافه 
البارميترز الثاني لجلب الصلاحيات القديمة والوضع القديم للعملية
  
عند استخدام هذه الـAPI نحتاج الى الحصول على صلاحية SE_DEBUG_NAME  
اما في c# ,, vb.net فيتم الحصول على الصلاحية عن طريق EnterDebugMode Method وكما قلت اعلاه نحتاج صلاحيات Admin ومن ثم نقوم باستدعاء الـAPI

VB.NET
Process.EnterDebugMode()
RtlSetProcessIsCritical(True, False, False)

Cs
System.Diagnostics.Process.EnterDebugMode();
RtlSetProcessIsCritical(true , false , false );

C++
#include <Windows.h>
#include <iostream>
typedef long(WINAPI* RtlSetProcessIsCritical)(
IN BOOLEAN NewSettings,
OUT BOOLEAN OldSettings,
IN BOOLEAN CriticalStop
);

BOOL SetPrivilege(BOOL bEnablePrivilege);

void main() {
RtlSetProcessIsCritical CallAPI;
CallAPI = (RtlSetProcessIsCritical)GetProcAddress(LoadLibraryA("NTDLL.dll"), "RtlSetProcessIsCritical");
if (SetPrivilege(TRUE) && CallAPI != NULL) {
CallAPI(TRUE, FALSE, FALSE);
std::cout << "Done Successfully :)";
}
system("pause");
}

BOOL SetPrivilege(  BOOL bEnablePrivilege ) {
HANDLE Proc,hTocken;
Proc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId());
if (!OpenProcessToken(Proc, TOKEN_ALL_ACCESS, &hTocken)) return false;
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))  return  FALSE;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;

if (!AdjustTokenPrivileges(hTocken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL))
return FALSE;

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) return FALSE;
return TRUE;

}


=========> C++ NOTES <=========

في كود C++ وكون الـAPI غير مصرح بها من قبل مايكروسفت ، فاننا قمنا بتعريف هيكل لها عن طريق typedef ثم قمنا بتعريف متغير جديد لها وقمنا باستخدام GetProcAddress المسؤولة عن جلب عنوان الـAPI داخل مكتبة NTDLL وقمنا ايضا باستخدام LoadLibraryA للحصول على مقبض للمكتبة وتمرير المقبض الى GetProcAddress وبالتالي جلب الادرس واستخدام الـAPI ،،، اما عن AdjustTokenPrivileges API فهي API قمنا باستخدامها للحصول على صلاحيات SE_DEBUG_NAME

GetProcAddress 
 تاخذ 2 Parameters 
1- مقبض المكتبة المراد جلب عنوان API منه 
2- اسم الـAPI المراد جلب الادرس الخاص بها

LoadLibraryA
تاخذ بارميتر واحد وهو اسم المكتبة 
 ويمكن مراجعة المزيد على MSDN


Others ...






بالنهاية أُعيد واقول بان ايقافها سهل جدا ، وحتى الحمايات التي تستخدم Hook Ring0 احيانا يتم نسيان البعض من API والتي يمكن استغلالها في ايقاف البرنامج او مشكلة في البرنامج تؤدي الى ايقافه ، ولكن حتى يتم تامين البرنامج من الايقاف 100% فيجب استخدام Hook Ring0 





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

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

DoneByM

إقتتاح قسم المشاريع البرمجية

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

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

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

وبعد 


تم بحمد الله وبفضله افتتاح قسم المشاريع البرمجية

وهو قسم يتم وضع فيه مشاريع برمجية او امثلة برمجية جاهزة بما يتضمن C++ , C# , VB.NET 

حيث انه سوف يتم شرح بعض النقاط في المشروع ورفع الـSouceCode الخاص به 


اترككم في امان الله ورعايته 

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

إفتتاح قسم WinAPI وبيان الكيفية المراد التكلم بها

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

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

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

تم بحمد الله وبفضله افتتاح قسم WinAPI اختصارا لـWindows Application Programming Interface 

وهو قسم يتم شرح به الــــWinAPI ، وكيفية لتعامل معها ، وسوف يتم اعتماد المرجع الاساسي لها MSDN وسوف يتم شرحها باكبر عدد من اللغات بما يتضمن C++ , C# , VB.NET 

حيث انه سوف يتم ذكر اسمها ومرجعها ويكيفية التعريف عنها ووظيفتها وتطبيقاتها وكيفية استخدامها برمجيا باذن الله تعالى 

اترككم في امان الله ورعايته 

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

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