wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用MinGW创建微小的PE(Win32)可执行文件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有以下C程序: #include <windows.h> void __cdecl mainCRTStartup() { DWORD bw; HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE); WriteFile(hfile, "hello, World!\r\n", 15, &bw, 0); ExitProcess(0); /* N
我有以下C程序:

#include <windows.h>
void __cdecl mainCRTStartup() {
  DWORD bw;
  HANDLE hfile = GetStdHandle(STD_OUTPUT_HANDLE);
  WriteFile(hfile,"Hello,World!\r\n",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.

@L_944_11@类似,但它不会尝试低于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

大佬总结

以上是大佬教程为你收集整理的如何使用MinGW创建微小的PE(Win32)可执行文件全部内容,希望文章能够帮你解决如何使用MinGW创建微小的PE(Win32)可执行文件所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。