بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا انك انت السميع العليم وبعد
=========> Information <==========
API Name: RtlSetProcessIsCritical
Lib: NTDLL.dll
Return Value: Nothing
لا يوجد مرجع لها من قبل Microsoft
الوظيفة : حماية العملية ، حيث انه اذا تم استدعائها وتم قتل العملية سوف تظهر شاشة الـBSOD اختصارا لـ
Blue Screen Of Death
وبما يعرف بشاشة الموت الزرقاء ، وعند قتلها سوف يؤدي ذلك الى ظهور الخطأ
Blue Screen Of Death
وبما يعرف بشاشة الموت الزرقاء ، وعند قتلها سوف يؤدي ذلك الى ظهور الخطأ
CRITICAL_PROCESS_DIED .
سؤال : هل يمكن بالفعل الاعتماد عليها في حماية البرنامج من الاغلاق ،،، بالطبع لا ! فيمكن عن طريق NtSetInformationProcess API الغاء عملها ، اضافة الى ذلك يمكن حقن ملف DLL داخل الـProcess وإعادة استدعاء RtlSetProcessIsCritical لايقاف عملها ، فايقافها سهل جدا
ملاحظة : استخدامها يتطلب صلاحيات Administrator وبالتالي اذا كان يوجد برنامج اخر يريد ايقاف العملية الخاصة بك والمحمية ويريد الغاء عمل RtlSetProcessIsCritical باستخدام NtSetInformationProcess او حقن ملف فيه فان ذلك ايضا يتطلب صلاحيات Administrator
ملاحظة : استخدامها يتطلب صلاحيات 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
ليست هناك تعليقات:
إرسال تعليق