سؤال

أحاول ترميز 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 البرنامج. سيكون أكثر أمانًا لحساب عنوان نسبي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top