加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何使用MinGW创建微小的PE(Win32)可执行文件

发布时间:2020-12-14 02:21:28 所属栏目:Windows 来源:网络整理
导读:我有以下C程序: #include windows.hvoid __cdecl mainCRTStartup() { DWORD bw; HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(hfile,"Hello,World!rn",15,bw,0); ExitProcess(0); /* Needed for successful (0) exit. */} 我使用以下命令
我有以下C程序:

#include <windows.h>
void __cdecl mainCRTStartup() {
  DWORD bw;
  HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE);
  WriteFile(hfile,"Hello,World!rn",15,&bw,0);
  ExitProcess(0);  /* Needed for successful (0) exit. */
}

我使用以下命令行使用GCC 4.8.2编译它:

i686-w64-mingw32-gcc -s -Os -fno-ident -fno-stack-protector -fomit-frame-pointer 
-fno-unwind-tables -fno-asynchronous-unwind-tables -falign-functions=1  
-mpreferred-stack-boundary=2 -falign-jumps=1 -falign-loops=1 -mconsole 
-nostdlib -nodefaultlibs -nostartfiles -o h.exe h.c -lkernel32

生成的.exe文件长度为2048字节.如何使用MinGW将其缩小,最好是1024字节,或者(甚至更好)最多512字节?

我更喜欢没有编写汇编代码的解决方案,但我也对组装解决方案感兴趣.

我已经尝试过-Wl,-N来减少部分(段)的数量,但是在Wine中运行.exe时会导致段错误.

这article表明可能有480个字节.它使用以下设置:

#pragma comment(linker,"/FILEALIGN:16")
#pragma comment(linker,"/ALIGN:16")// Merge sections
#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment(linker,"/MERGE:.text=.data")
#pragma comment(linker,"/MERGE:.reloc=.data")
#pragma optimize("gsy",on)

不幸的是,这些#pragmas不适用于MinGW GCC.有等价物吗?

在here年,我能够找到海湾合作委员会的旗帜
-Wl,– section-alignment,16,– file-alignment,它将.exe大小降低到752字节. .exe似乎适用于Wine.

到了modifying the linker script,我能够合并.data和.rdata,并下载到736字节.我除了上面的那些之外还使用这些GCC标志:-Wl,-T,tinygccpe.scr.

我仍在寻找MinGW相当于/ MERGE.

This question类似,但它不会尝试低于9000字节.

我也在寻找一个剥离工具(MinGW中的strip命令不会进一步减小.exe大小)可以删除DOS存根(在偏移量0x40和0x80之间,它包含这个程序不能在DOS下运行) mode.,我们可以节省64个字节). This code可以删除它,但它也会破坏.exe中的所有绝对偏移量.不幸的是,MinGW中的链接器ld无法删除DOS存根,它在文件bfd / peXXigen.c中硬编码,就在NT_SIGNATURE之上.

是否可以从.exe中删除更多标题,即加载程序不使用的标题?

解决方法

这个问题有大量的在线文献,从大约1995年开始.

每个版本的32位和64位Windows对PE .exe可执行文件中接受的标头值都有不同的规则.例如,Windows XP拒绝带有导入的32位.exe文件,除非它们至少有3个部分,并且它们的部分对齐是4096,并且它们的文件对齐是2的幂至少512.(i686-w64-mingw32-gcc问题中的命令生成此类可执行文件.)Windows 7接受这些.exe文件,但它也接受带有0个部分的.exe文件,部分对齐4,文件对齐4.

可以创建小于2048字节的工作.exe文件.例:

> hh2.golden.exe(402字节)适用于Windows XP,Windows 7及更高版本.
> hh4.golden.exe(268字节)在Windows XP上不起作用,适用于Windows 7及更高版本.
>汇编源代码包含在pts-tinype repo中.

小于268字节的.exe文件仅适用于Windows XP之前的Windows版本,并且它们不适用于64位Windows系统.

相关文献:

> https://www.codejuggle.dj/creating-the-smallest-possible-windows-executable-using-assembly-language/
> http://pferrie.host22.com/misc/tiny/pehdr.htm
> https://drakopensulo.wordpress.com/2017/08/06/smallest-pe-executable-x64-with-every-byte-executed/
> http://www.phreedom.org/research/tinype/
> http://www.pouet.net/topic.php?which=9565
> http://www.crinkler.net/
> https://code.google.com/archive/p/corkami/wikis/PE.wiki

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读