تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيف يمكن حقن تعليمه القفز مع العنوان [jump + address] داخل Process أخر بشكل صحيح ؟
#9
(03-01-2023, 02:06 PM)EarthMan123 كتب : عليك بحساب المسافة من مكان القفزة إلى المكان الذي تريد القفز إليه.
وتضيف الناتج بعد تعليمة القفزة.

https://stackoverflow.com/questions/7609...ns-address
https://reverseengineering.stackexchange...ubtraction

هذا ما فعلتة:
unsigned int addr = 0x0048DA03;
unsigned int jumpFarToAddr = 0x0048A512;
unsigned char* hex = new unsigned char[4];
const unsigned char command = 0xE9;
unsigned int AddrTo = addr - jumpFarToAddr;
*hex = command;
memcpy(&hex[1], &AddrTo, sizeof(AddrTo));
VirtualProtectEx(hProcess, (void*)addr, 20, PAGE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (void*)addr, (void*)hex, sizeof(hex), NULL);
VirtualProtectEx(hProcess, (void*)addr, 20, oldProtect, &oldProtect); 

وهذا هو الناتج:

[صورة مرفقة: 20230104-222003.png]

كما تلاحظ أن address الذي سيتم القفز إليه (90490EF9) مختلف تماما عن العنوان الحقيقي (0048A512)

 
(03-01-2023, 05:17 PM)SeGNMeNT كتب : نعم ممكن لكن لست متقن الاسمبلي , تعليمة القفزة لعنوان معين 0xEA jmp far غير مألوفة (على الأقل بالنسبة لي)
اي عنوان يكتبه خطأ ؟ قم باظهار كود العملية Opcode

لنفرض أن Address الذي سيتم القفز إليه هو (0048A512), لكن للأسف تجده بعد الحقن كاتب, كمثال (JMP 90490EF9) عنوان مختلف تماما عن العنوان الحقيقي. فأريد أن أعرف لماذا لا يكتب العنوان الحقيقي الذي سيتم القفز إلية ويكتب عنوان خاطئ.
ومثال أخر, عند أستخدام 0xEA للقفز إلى العنوان (0x0048A512), ولكن بعد حقن الكود يكون الكود كالتالي:

[صورة مرفقة: 20230105-001819.png]

كما ترى أن Address المحدد للقفز إليه ليس كما هو الحقيقي الذي حددته (0048A512).
هناك شئ مجهول هو السبب في عدم كتابة العنوان بشكل صحيح وهذا ما أسعى لمعرفته.

 
(03-01-2023, 10:48 PM)M!X0R كتب : قفزة بعيدة 0xE9 اي 0xE9 XX XX XX XX 
قفزة فصيرة 0xEB أي 0xEB XX

+ بالنسبة للقفزة القصيرة:
اشتغلت جيدا لكنك قمت بكتابة 0xAD بجانب أمر القفز 0xEB, وهو يدل على العنوان الذي سيقفز إليه لكن كيف نحدد العنوان للقفزة القصيرة, كيف تم حساب هذا 0xAD ؟

+ بالنسبة للقفزة البعيدة:
للأسف الـ Address كان أيضا مكتوب خاطئ, وهذا هو الكود الذي استخدمته:
 
unsigned int addr = 0x0048DA03;
unsigned int jumpFarToAddr = 0x0048A512;
unsigned char* hex = new unsigned char[5];
const unsigned char command = 0xE9;
*hex = command;
memcpy(&hex[1], &jumpFarToAddr, sizeof(jumpFarToAddr));
VirtualProtectEx(hProcess, (void*)addr, 20, PAGE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (void*)addr, (void*)hex, sizeof(hex), NULL);
VirtualProtectEx(hProcess, (void*)addr, 20, oldProtect, &oldProtect);

والناتج كالتالي:

[صورة مرفقة: 20230105-003909.png]

كما ترى Address خاطئ.
أعضاء أعجبوا بهذه المشاركة :


الردود في هذا الموضوع
RE: كيف يمكن حقن تعليمه القفز مع العنوان [jump + address] داخل Process أخر بشكل صحيح ؟ - بواسطة lionking - 04-01-2023, 10:42 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 3 ) ضيف كريم