标签: portable-executable


CMake的可移植可执行文件

我正在开发一台我没有管理权限的Windows机器上.我想使用CMake进行编译,由于管理限制,我不能简单地下载和安装它.

我还想避免从源代码编译CMake(如果可能的话).是否有可用于Windows的便携式二进制文件,只允许使用CMake?

binary cmake portable-executable

7
推荐指数
1
解决办法
5865
查看次数

PE导出目录表的OrdinalBase字段被忽略了吗?

根据我和其他人的经验(http://webster.cs.ucr.edu/Page_TechDocs/pe.txt),PE/COFF规范文档错误地声称序数表中包含的出口地址表索引是相对的到Ordinal Base,甚至给出了一个不正确的例子(第5.3节).实际上,Ordinal Table中的索引是基于0的索引到正常情况下的Ordinal Base = 1的地址表中.我在VS Studio生成的PE库和系统库(如Kernel32.dll)中看到了这一点.

我的问题是,你有没有观察过一个带有Ordinal Base的二进制数不等于1?我想知道这是一个off-by-one错误,还是Ordinal Base从未应用于Ordinal Table条目.

dll reverse-engineering portable-executable dllexport

7
推荐指数
1
解决办法
1706
查看次数

"相对虚拟地址",相对于什么?

我刚刚阅读了关于它们在磁盘上的文件中的偏移,RVA和VA一旦被加载到内存中.我还读到,如果一个PE文件完全像在磁盘中一样加载到内存中,那么RVA将与文件偏移相同(并且发生这种情况将是非常不寻常的).

我怀疑的是 - 在正常情况下,这些RVA相对于什么?特定PE数据结构的开始?

编辑:通过PE数据结构我的意思是 - PE头,DOS头,DOS存根,PE文件头,图像可选头,节表和数据目录.

windows file-format reverse-engineering portable-executable

7
推荐指数
1
解决办法
3392
查看次数

如何使用其标题确定精确的PE图像文件大小?

我需要字节大小,IMAGE_OPTIONAL_HEADER.SizeOfImage似乎向上舍入到(不确定)边界并且大于实际文件大小.

language-agnostic windows delphi portable-executable

7
推荐指数
1
解决办法
6604
查看次数

从RVA获取文件偏移量

我正在尝试读取PE文件.
问题是数据使用RVA指针,而我需要在文件中偏移
以获得我需要的东西.如何将RVA转换为文件中的偏移量?

64-bit portable-executable

7
推荐指数
1
解决办法
4747
查看次数

标准可执行文件可以有导出表吗?

我有一个用C编写的可执行文件,其中包含一些我想在ac#application中使用的函数.我以前写了很多dll,并且能够通过__declspec(dllexport)在函数声明之前使用函数.我可以用可执行文件执行此操作吗?可执行文件实际上会导出函数吗?

portable-executable dllexport

7
推荐指数
1
解决办法
1951
查看次数

如何将二进制数据添加(和使用)到已编译的可执行文件?

有几个问题涉及这个问题的某些方面,但似乎都没有完全回答它.整个问题可归纳如下:

  • 你有一个已编译的可执行文件(显然希望使用这种技术).
  • 你想为它添加一个任意大小的二进制数据(不一定是它自己,这将是另一个令人讨厌的问题).
  • 您希望已编译的可执行文件能够访问此添加的二进制数据.

我的特定用例是一个解释器,我想让用户能够用解释器二进制文件和他提供的代码生成一个单独的文件可执行文件(解释器二进制文件是必须用它修补的可执行文件).用户提供的代码作为二进制数据).

类似的情况是自解压存档,其中程序(存档实用程序,如zip)能够构造这样的可执行文件,其中包含预构建的解压缩程序(已编译的可执行文件)和用户提供的数据(内容)存档).显然,此过程中不涉及编译器或链接器(感谢,Mathias为注释并指出7-zip).

使用现有问题,解决方案的特定路径如下所示:

将数据附加到exe - 这涉及向任意exes添加任意数据的方面,而不涉及如何实际访问它(基本上简单的追加通常有效,对于Unix的ELF格式也是如此).

在没有/ proc/self/exe的情况下查找当前可执行文件的路径 - 与上述相同,这将允许获取用于打开exe的文件名,以访问添加的数据.还有更多这类问题,但是它们都没有特别关注获得适合于实际将二进制文件作为文件打开的目的的路径问题(单独的目标可能(?)更容易实现 - 真的你不要甚至不需要路径,只是打开阅读的二进制文件.

除了填充二进制文件并打开文件以进行读取之外,还可能存在其他可能更优雅的方法.例如,可执行文件可以使得以后使用任意大小的数据对其进行修补变得相当简单,因此它它出现在某个正确的数据段"内"?(我真的找不到任何东西,对于固定大小的数据,它应该是微不足道的,尽管除非可执行文件有一些哈希值)

这可以做得相当好,与标准C的偏差尽可能小吗?甚至或多或少的跨平台?(至少从维护的角度来看)请注意,如果执行二进制数据添加的程序不依赖于编译器工具(用户可能没有),那么首选,但是需要这些工具的解决方案也可能有用. .

请注意已经编译的可执行标准(上面列表中的第一点),这需要一种完全不同于C/C++与GCC之类的问题中描述的解决方案:静态地将资源文件添加到可执行文件库SDL嵌入图像内部的程序可执行文件中,要求嵌入数据编译时.

补充说明:

上面列出并在一些注释中提出的明显方法的问题,即只是附加到二进制文件并使用它,如下所示:

  • 打开当前正在运行的程序的二进制文件似乎并不简单(打开可执行文件进行读取,但没有找到提供给文件打开调用的路径,至少不是以合理的跨平台方式).
  • 获取路径的方法可以提供可能不存在的攻击面.这意味着潜在的攻击者可以欺骗程序以查看可执行文件实际具有的不同二进制数据(由他提供),从而暴露可能存在于数据解析器中的任何漏洞.

c exe elf portable-executable

7
推荐指数
1
解决办法
1435
查看次数

如何使用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);  /* Needed for successful (0) exit. */
}
Run Code Online (Sandbox Code Playgroud)

我使用以下命令行使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

文章认为,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", …
Run Code Online (Sandbox Code Playgroud)

c winapi mingw portable-executable

7
推荐指数
1
解决办法
1233
查看次数

.text和.itext内存段之间有什么区别?

当我编译Delphi项目并指示编译器创建内存映射文件(* .map)时,它在文件顶部包含对已用内存段的描述。

例:

Start         Length     Name                   Class
0001:00401000 00475600H .text                   CODE
0002:00877000 00004998H .itext                  ICODE
0003:0087C000 00030410H .data                   DATA
0004:008AD000 00009170H .bss                    BSS
0005:00000000 00000278H .tls                    TLS
Run Code Online (Sandbox Code Playgroud)

查看PE节表时,列出 “ .text”和“ .itext”以外的其他节。

该“ .itext”段的目的是什么,它与“ .text”有什么区别?它是Delphi / Borland / Embarcadero的特定扩展吗?

windows delphi portable-executable

7
推荐指数
1
解决办法
112
查看次数