المشاركات : 23
المواضيع : 4
الإنتساب : Jun 2021
السمعة :
0
الإعجاب المعطى : 0
الإعجاب المحصل : 5
31-12-2022, 01:22 PM
(آخر تعديل لهذه المشاركة : 31-12-2022, 01:24 PM بواسطة lionking.)
أنا أحاول حقن تعليمه القفز إلى مكان أخر في الكود وذلك في Process أخرى والتي تسمى External injection, وقد قمت بعمل ذلك بالفعل ونجحت عملية الحقن ولكن العنوان address الذي تم حقنة بجانب تعليمه القفز JMP غير صحيح.
على سبيل المثال:
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؟
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 1,439
المواضيع : 279
الإنتساب : Oct 2018
السمعة :
43
الإعجاب المعطى : 1388
الإعجاب المحصل : 4550
لست بخبير في البرمجة راح أعطيك فكرة حاول تترجمها
اجعل الكود يجلب Address Base و ضف إليه عنوان RVA
جرب...
لَّا إِلَٰهَ إِلَّا أَنتَ سُبْحَانَكَ إِنِّي كُنتُ مِنَ الظَّالِمِينْ.
عن أبي هريرة -رضي الله عنه- أن رسول الله -صلى الله عليه وسلم- كانَ يقولُ في سجودِهِ: «اللَّهُمَّ اغْفِرْ لي ذَنْبِي كُلَّهُ: دِقَّهُ وَجِلَّهُ، وَأَوَّلَهُ وَآخِرَهُ، وَعَلاَنِيَتَهُ وَسِرَّهُ».
(صحيح - رواه مسلم).
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 624
المواضيع : 22
الإنتساب : Nov 2018
السمعة :
10
الإعجاب المعطى : 1298
الإعجاب المحصل : 859
عليك بحساب المسافة من مكان القفزة إلى المكان الذي تريد القفز إليه.
وتضيف الناتج بعد تعليمة القفزة.
من طلب العلا ... سهر الليالي
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 110
المواضيع : 36
الإنتساب : Jul 2020
السمعة :
0
الإعجاب المعطى : 44
الإعجاب المحصل : 164
01-01-2023, 11:07 AM
(آخر تعديل لهذه المشاركة : 01-01-2023, 11:26 AM بواسطة SeGNMeNT.)
السلام عليكم
(31-12-2022, 01:22 PM)lionking كتب : - كيف يمكنني كتابة العنوان Address الذي سيتم القفز إليه JMP بشكل صحيح؟
-
قم بتخزين العوان باحدى المسجلات ثم دعه يقفز اليه.
(31-12-2022, 01:22 PM)lionking كتب : كيف أقوم بحقن التعليمة كمثال JMP 0x0048D9B2 بسطر كود واحد بأستخدام الدالة WriteProcessMemory بدلا من تكرار كتابة الدالة مرة لكتابة أمر JMP ومرة لكتابة العنوان Address؟
void writeMemory()
{
byte bMove = 0xB8;
DWORD dwAddress = 0x48D9B2 ;
WORD wJumpeax = 0xE0FF;
byte* buf = new byte[7]; // 1 mov , 4 address , 2 jmp eax
*buf = bMove;
memcpy(&buf[1], &dwAddress,sizeof(DWORD));
memcpy(&buf[5], &wJumpeax, sizeof(WORD));
DWORD dwBytesWritten = 0;
DWORD dwTargetAddress = 0x40100A;
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwTargetAddress, buf, 7, &dwBytesWritten);
delete[] buf;
}
أعضاء أعجبوا بهذه المشاركة : TeRcO
المشاركات : 23
المواضيع : 4
الإنتساب : Jun 2021
السمعة :
0
الإعجاب المعطى : 0
الإعجاب المحصل : 5
02-01-2023, 09:59 PM
(آخر تعديل لهذه المشاركة : 02-01-2023, 09:59 PM بواسطة lionking.)
(31-12-2022, 11:22 PM)M!X0R كتب : لست بخبير في البرمجة راح أعطيك فكرة حاول تترجمها
اجعل الكود يجلب Address Base و ضف إليه عنوان RVA
جرب...
أشكرك أخي, بس للأسف جربتها بس ما نفعت أيضا.
(01-01-2023, 03:10 AM)EarthMan123 كتب : عليك بحساب المسافة من مكان القفزة إلى المكان الذي تريد القفز إليه.
وتضيف الناتج بعد تعليمة القفزة.
يا ريت أخي لو تعطيني مثال بالكود راح يكون كلامك واضح أكثر.
(01-01-2023, 11:07 AM)SeGNMeNT كتب : قم بتخزين العوان باحدى المسجلات ثم دعه يقفز اليه.
وهل هناك سبب يمنع من كتابة العنوان بشكل مباشر بدلا من إضافة بالريجستر أولا؟
لاننى أحاول أضافته بشكل مباشر بطريقتك ولكن لايزال يكتب العنوان بشكل خاطئ.
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 624
المواضيع : 22
الإنتساب : Nov 2018
السمعة :
10
الإعجاب المعطى : 1298
الإعجاب المحصل : 859
من طلب العلا ... سهر الليالي
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 110
المواضيع : 36
الإنتساب : Jul 2020
السمعة :
0
الإعجاب المعطى : 44
الإعجاب المحصل : 164
(02-01-2023, 09:59 PM)lionking كتب : وهل هناك سبب يمنع من كتابة العنوان بشكل مباشر بدلا من إضافة بالريجستر أولا؟
لاننى أحاول أضافته بشكل مباشر بطريقتك ولكن لايزال يكتب العنوان بشكل خاطئ.
نعم ممكن لكن لست متقن الاسمبلي , تعليمة القفزة لعنوان معين 0xEA jmp far غير مألوفة (على الأقل بالنسبة لي)
اي عنوان يكتبه خطأ ؟ قم باظهار كود العملية Opcode
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 1,439
المواضيع : 279
الإنتساب : Oct 2018
السمعة :
43
الإعجاب المعطى : 1388
الإعجاب المحصل : 4550
03-01-2023, 10:48 PM
(آخر تعديل لهذه المشاركة : 04-01-2023, 11:26 AM بواسطة M!X0R.)
(03-01-2023, 05:17 PM)SeGNMeNT كتب : تعليمة القفزة لعنوان معين 0xEA jmp far غير مألوفة
قفزة بعيدة 0xE9 اي 0xE9 XX XX XX XX
قفزة فصيرة 0xEB أي 0xEB XX
(02-01-2023, 09:59 PM)lionking كتب : للأسف جربتها بس ما نفعت أيضا.
جرب هذا الكود ( الكود تبعك معدل)
unsigned int addr = 0x0048DA03;
unsigned char command[] = { 0xEBAD };
VirtualProtectEx(hProcess, (void*)addr, 20, PAGE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (void*)addr, (void*)command, sizeof(command), NULL);
VirtualProtectEx(hProcess, (void*)addr, 20, oldProtect, &oldProtect);
ممكن السطر الثاني يكون بهذا الشكل لست متأكد من الطريقة البرمجية الصحيحة
unsigned char command[] = { 0xEB, 0xAD };
باختصار حاول حقن 2 بايت في العنوان 0x0048DA03 بدل حقن عنوان في عنوان
صورة توضيحية
بالتوفيق
لَّا إِلَٰهَ إِلَّا أَنتَ سُبْحَانَكَ إِنِّي كُنتُ مِنَ الظَّالِمِينْ.
عن أبي هريرة -رضي الله عنه- أن رسول الله -صلى الله عليه وسلم- كانَ يقولُ في سجودِهِ: «اللَّهُمَّ اغْفِرْ لي ذَنْبِي كُلَّهُ: دِقَّهُ وَجِلَّهُ، وَأَوَّلَهُ وَآخِرَهُ، وَعَلاَنِيَتَهُ وَسِرَّهُ».
(صحيح - رواه مسلم).
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 23
المواضيع : 4
الإنتساب : Jun 2021
السمعة :
0
الإعجاب المعطى : 0
الإعجاب المحصل : 5
(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);
وهذا هو الناتج:
كما تلاحظ أن address الذي سيتم القفز إليه (90490EF9) مختلف تماما عن العنوان الحقيقي (0048A512)
(03-01-2023, 05:17 PM)SeGNMeNT كتب : نعم ممكن لكن لست متقن الاسمبلي , تعليمة القفزة لعنوان معين 0xEA jmp far غير مألوفة (على الأقل بالنسبة لي)
اي عنوان يكتبه خطأ ؟ قم باظهار كود العملية Opcode
لنفرض أن Address الذي سيتم القفز إليه هو (0048A512), لكن للأسف تجده بعد الحقن كاتب, كمثال (JMP 90490EF9) عنوان مختلف تماما عن العنوان الحقيقي. فأريد أن أعرف لماذا لا يكتب العنوان الحقيقي الذي سيتم القفز إلية ويكتب عنوان خاطئ.
ومثال أخر, عند أستخدام 0xEA للقفز إلى العنوان (0x0048A512), ولكن بعد حقن الكود يكون الكود كالتالي:
كما ترى أن 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);
والناتج كالتالي:
كما ترى Address خاطئ.
أعضاء أعجبوا بهذه المشاركة :
المشاركات : 25
المواضيع : 1
الإنتساب : Jul 2020
السمعة :
5
الإعجاب المعطى : 0
الإعجاب المحصل : 34
05-01-2023, 07:27 AM
(آخر تعديل لهذه المشاركة : 05-01-2023, 07:28 AM بواسطة aijundi.)
int addr = 0x0048DA03;
int jumpFarToAddr = 0x0048A512;
unsigned char hex[5];
const unsigned char command = 0xE9;
*hex = command;
int offset = jumpFarToAddr - addr - sizeof(hex);
memcpy(&hex[1], &offset, sizeof(offset));
VirtualProtectEx(hProcess, (void*)addr, 20, PAGE_READWRITE, &oldProtect);
WriteProcessMemory(hProcess, (void*)addr, (void*)hex, sizeof(hex), NULL);
VirtualProtectEx(hProcess, (void*)addr, 20, oldProtect, &oldProtect);
أعضاء أعجبوا بهذه المشاركة :
|