أنا أحاول حقن تعليمه القفز إلى مكان أخر في الكود وذلك في Process أخرى والتي تسمى External injection, وقد قمت بعمل ذلك بالفعل ونجحت عملية الحقن ولكن العنوان address الذي تم حقنة بجانب تعليمه القفز JMP غير صحيح.
على سبيل المثال:
والنتيجة كانت بهذا الشكل:
كما رأينا في الصورة, وعند تنفيذ الكود نجد أن العنوان الذي سيتم القفز إليه غير صحيح.
أيضا تحدث هذه المشكلة أيضا عندما نقوم بحجز مساحة أفتراضية VirtualAlloc ليتم القفز إليها:
وسؤالى الان هو:
على سبيل المثال:
unsigned int addr = 0x0048DA03;
unsigned int jumpToAddr = 0x0048D9B2;
unsigned char command[] = { 0xEA };
VirtualProtectEx(hProcess, (void*)addr, 20, PAGE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (void*)addr, (void*)command, sizeof(command), NULL); // this line for jmp
WriteProcessMemory(hProcess, (void*)addr, (void*)jumpToAddr, sizeof(jumpToAddr), NULL); // this line for the address
VirtualProtectEx(hProcess, (void*)addr, 20, oldProtect, &oldProtect);
والنتيجة كانت بهذا الشكل:
كما رأينا في الصورة, وعند تنفيذ الكود نجد أن العنوان الذي سيتم القفز إليه غير صحيح.
أيضا تحدث هذه المشكلة أيضا عندما نقوم بحجز مساحة أفتراضية VirtualAlloc ليتم القفز إليها:
void* reservedMemAddress = VirtualAllocEx(hProcess, NULL, 100, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (reservedMemAddress) {
WriteProcessMemory(hProcess, (void*)addr, (void*)command, sizeof(command), NULL);
WriteProcessMemory(hProcess, (void*)addr, (void*)reservedMemAddress, sizeof(reservedMemAddress), NULL);
}
وسؤالى الان هو:
- كيف يمكنني كتابة العنوان Address الذي سيتم القفز إليه JMP بشكل صحيح؟
- كيف أقوم بحقن التعليمة كمثال JMP 0x0048D9B2 بسطر كود واحد بأستخدام الدالة WriteProcessMemory بدلا من تكرار كتابة الدالة مرة لكتابة أمر JMP ومرة لكتابة العنوان Address؟