【发布时间】:2020-05-24 18:41:12
【问题描述】:
我正在寻找一种方法,使用 Visual Studio 编译器在 C/C++ 的 .text 部分的开头/结尾处保留一些额外空间。
我只找到了一种解决方案,说明如何在 Visual Studio 的代码部分保留一些额外空间: PE File .text Section Size
#pragma optimize( "", off )
#define NOP __asm { NOP } ;
#define NOP8 NOP NOP NOP NOP NOP NOP NOP NOP
#define NOP64 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8 NOP8
#define NOP512 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64 NOP64
#define NOP4096 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512 NOP512
#define NOP32768 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096 NOP4096
void unused_global() { NOP32768 }
#pragma optimize( "", on )
int main() {
[...]
unused_global(); // <-- Without this call, compiler doesn't include `unused_global` inside .text section
}
这个解决方案的问题是:
- 需要直接调用此函数。这当然会 打破应用逻辑。
- 不保证
unused_global函数将放置在 .text 部分。 - 太棒了,所以我很想听听更清洁的解决方案
更新
我找到了 1) 问题的解决方案。这又是一个很棒的 hack:
int main() {
volatile bool force_false = false;
if (force_false) unused_global();
}
【问题讨论】:
-
一些上下文会有所帮助。在 PE 映像中浪费空间通常不是最好的方法,无论您要完成什么。
-
我想写一个PE-mutator。我想从简单开始,因此不必在程序编译后调整 .text 部分的大小,因为它需要移动其他部分。突变需要一些额外的空间,因为通常我会将
xor eax, eax等操作替换为mov eax, 1; dec eax等等。
标签: c++ visual-studio code-injection portable-executable sections