JMP إلى العنوان المطلق (رموز المرجع)
-
20-09-2019 - |
سؤال
أحاول ترميز exe packer/protector كوسيلة لمعرفة المزيد عن التجميع ، C ++ ، وكيف تعمل ملفات PE. لقد عملت حاليًا ، لذا يتم إنشاء القسم الذي يحتوي على EP باستخدام مفتاح ويتم إنشاء قسم جديد يحتوي على رمز فك التشفير الخاص بي. كل شيء يعمل بشكل رائع إلا عندما أحاول و JMP إلى EP الأصلي بعد فك التشفير.
في الأساس أفعل هذا:
DWORD originalEntryPoint = optionalHeader->AddressOfEntryPoint;
// -- snip -- //
crypted.put(0xE9);
crypted.write((char*)&orginalEntryPoint, sizeof(DWORD));
ولكن بدلاً من القفز إلى نقطة الدخول ، يوضح Ollydbg أن هذا الرمز ينفصل عن:
00404030 .-E9 00100000 JMP 00405035 ; should be 00401000 =[
وعندما أحاول تغييره يدويًا في Olly ، يظهر الرمز الجديد
00404030 -E9 CBCFFFFF JMP crypted.00401000
من أين جاء 0xCBCFFFF؟ كيف يمكنني إنشاء ذلك من جانب C ++؟
المحلول
اعتقد انه E9
هو رمز opcode للوصول إلى الوثب النسبي: يحدد المعامل مسافة نسبية ليتم قفزها ، بالإضافة إلى أو ناقص من بداية التعليمات التالية.
إذا كنت تريد أن يحدد المعامل عنوانًا مطلقًا ، فستحتاج إلى رمز opcode مختلف.
نصائح أخرى
يمكنك استخدام:
mov eax,DESTINATION_VA
jmp eax ; pick any register the destination doesn't care about
أو
push DESTINATION_VA
ret ; not recommended for performance
هذا وما يصل إلى 16 التالي ret
تعليمات تصل إلى الورود إلى شجرة المكالمات أعلى من هذا العمق ستؤثر ، ما لم يتم طردها من مكدس تنبؤات عودة الإضافات بعمق مكالمة أعمق. (عادةً ما تحتوي وحدات المعالجة المركزية الحالية على مكدس تنبؤ 16-entry).
نسبيا E9
jmp
يستخدم الترميز مثل هذا:
CURRENT_RVA: jmp (DESTINATION_RVA - CURRENT_RVA - 5 [sizeof(E9 xx xx xx xx)])
Push + Ret هو أصغر حل إذا كان لديك عنوان VA ولم يتم نقل الصورة ، لكنها لا تزال 6 بايت ، لذا فهي أكبر من المباشر jmp rel32
.
من المحتمل أن يكون التسجيل التوجيه هو الأكثر كفاءة إذا لم تتمكن من استخدام مباشرة عادي jmp
.
Opcode for soft firect onforrect Jump هو عنوان FF + 4BYTE. غالبًا ما يستخدم هذا في jumptables من العناوين المخزنة في البيانات.
تتطلب العناوين المطلقة نقلًا عند عدم تحميلها على العنوان المتوقع ، لذلك يتم تفضيل العناوين النسبية عمومًا. رمز القفزات النسبية هو أيضا 2 بايت أصغر.
ينص دليل تحسين Intel على أن وحدة المعالجة المركزية تتوقع أن يتم استخدامها في الأزواج ، وبالتالي فإن RET بدون مكالمة مقترحة في الإجابة 2 من شأنه أن يتسبب في ما يسمونه "عقوبة الأداء".
أيضًا ، إذا لم يتم تحميل الرمز على نفس العنوان الذي افترضه المترجم ، فمن المحتمل أن يعطل RET البرنامج. سيكون أكثر أمانًا لحساب عنوان نسبي.