问题标签 [portable-executable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
5655 浏览

c++ - Windows 下的确定性构建

最终目标是比较在完全相同的环境中从完全相同的源构建的 2 个二进制文件,并能够判断它们在功能上确实是等效的。

一个应用程序是将 QA 时间集中在版本之间实际更改的内容上,以及一般的更改监控。

MSVC 与 PE 格式相结合自然很难做到这一点。

到目前为止,我发现并消除了这些东西:

  • PE 时间戳和校验和
  • 数字签名目录条目
  • 调试器部分时间戳
  • PDB 签名、年龄和文件路径
  • 资源时间戳
  • VS_VERSION_INFO 资源中的所有文件/产品版本
  • 数字签名部分

我解析 PE,找到所有这些东西的偏移量和大小,并在比较二进制文件时忽略字节范围。像魅力一样工作(好吧,对于我运行过的几个测试)。我可以说,在 Win Server 2008 上构建的 1.0.2.0 版本的签名可执行文件等于在我的 Win XP 开发盒上构建的 10.6.6.6 版本的未签名可执行文件,只要编译器版本和所有源代码和标头都相同。这似乎适用于 VC 7.1 -- 9.0。(对于发布版本)

有一个警告。

两个构建的绝对路径 必须 相同,长度必须相同。

cl.exe 将相对路径转换为绝对路径,并将它们与编译器标志等一起放入对象中。这对整个二进制文件有不成比例的影响。路径中的一个字符更改将导致一个字节在整个 .text 部分中在这里和那里多次更改(但是我怀疑有很多对象被链接)。改变路径的长度会导致明显更多的差异。在 obj 文件和链接的二进制文件中。

感觉像带有编译标志的文件路径被用作某种哈希,这使它成为链接的二进制文件,甚至影响不相关的已编译代码的放置顺序。

所以这是一个由 3 部分组成的问题(总结为“现在怎么办?”):

  • 我是否应该放弃整个项目并回家,因为我正在尝试做的事情违反了物理定律和 MS 的公司政策?

  • 假设我处理绝对路径问题(在策略级别或通过找到一个神奇的编译器标志),还有其他我应该注意的事情吗?(像 __TIME__这样的东西确实意味着改变了代码,所以我不介意那些没有被忽略的东西)

  • 有没有办法强制编译器使用相对路径,或者让它认为路径不是它的样子?

最后一个原因是令人讨厌的 Windows 文件系统。你永远不知道什么时候删除几个 gigs 的源和对象以及 svn 元数据会因为恶意文件锁定而失败。至少在有空间的情况下创建新的根总是成功的。一次运行多个构建也是一个问题。运行一堆虚拟机虽然是一种解决方案,但却是一个相当繁重的解决方案。

我想知道是否有一种方法可以为一个进程及其子进程设置一个虚拟文件系统,以便多个进程树将同时看到不同的“C:\build”目录,它们只对它们私有...... -各种重量虚拟化......

更新:我们最近在GitHub 上开源了该工具。请参阅文档中的比较部分。

0 投票
2 回答
4371 浏览

windows - /TSAWARE 链接器标志对 PE 可执行文件有什么作用?

将 /TSAWARE 链接器标志添加到我的一个项目 (Visual Studio 6) 后,我惊讶地发现 PE 文件 (.idata) 中有一个新部分。如果我不设置标志,导入将合并到 .rdata 中。

为了说明“问题”,我们从一个简单的控制台程序开始:

并编译:cl /Og /O1 /GF /WX /c main.c

然后链接到

  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
  • link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj

让我们比较一下 dumpbin 的输出:

所以由于某种原因,链接器决定不能合并导入。

但是如果我们editbin /TSAWARE a.exe只运行PE可选头中的DLL特性字段就会改变。

谁能给我解释一下?这是链接器中的错误还是editbin更改的可执行文件最终无法在某些系统上运行?

0 投票
1 回答
1428 浏览

linux - 像 ResHacker 一样编辑 Win32 PE 的本机 Linux 应用

我想运行一个自动修改.dll服务,用户提交一个特定的.dll,我在服务器上修改它,然后用户可以下载修改后的.dll版本。是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能,如图标、字符串、加速器、对话等,至少提供命令行或脚本 API?

0 投票
2 回答
2161 浏览

c++ - Visual C++ 中的二进制再现性

有没有办法强制相同的代码在 Visual C++ 中生成相同的二进制文件?关闭PE中的时间戳或强制PE中的时间戳为某个固定值,换句话说?

0 投票
2 回答
868 浏览

perl - 如何使用 Perl 从 WinNT 可移植可执行文件中读取标头?

我想在 Perl 中使用 PE 文件但没有找到模块,所以我想我会自己编写(已经在 delphi 中做过一次)。

我只有一个问题,当将可执行文件映射到缓冲区时,我如何搜索像 0x00004550 (IMAGE_NT_SIGNATURE) 这样的八进制数,将它们转换回可写字符串等?

0 投票
3 回答
789 浏览

linux - 如何在确定地址(gcc,linux)的可执行文件中创建“空”空间?

我本质上想要做的是让另一个程序将数据写入这个“空白空间”,以便可执行文件“工作”

我想在应用程序上附加一个签名,然后写入数据,稍后再搜索它,但这听起来不太正确......

现在,其他重要的事情......我知道应该可以通过使用以下代码来创建代码洞穴:

然后,即使这实际上是相同的(除了它将在 .data 部分中,因此不可执行):

那么问题是另一个应用程序将没有明确的地址来写入。

0 投票
1 回答
3827 浏览

c# - 如何读取内存中加载的模块的 PE 标头?

我正在.NET 中尝试内存访问。目前,我有一个托管程序,它启动一个非托管进程并检索BaseAddress其加载的模块之一(DLL)。我想做的是以某种方式读取已加载模块的 PE 标头,以便我以后可以检索其导出的地址。

不幸的是,我找不到任何关于此的好信息。有任何想法吗?

0 投票
3 回答
2247 浏览

windows - 查找未使用 SafeSEH 编译的 Windows DLL

我想知道我安装的各种软件中的哪些 DLL 已经用 SafeSEH 编译,哪些没有。是否有一种工具可以为我提供该信息,否则编写进行该验证的代码的最佳解决方案是什么?

提前致谢。

0 投票
2 回答
456 浏览

resources - 如何保护 PE 文件资源(字符串、图像....)?

我需要任何方法来保护 pe 文件资源表单编辑,非常感谢..

编辑如:

1)将pe文件作为二进制文件打开并搜索一个字符串然后编辑它。

或者

2)编辑汇编代码,如“jne”(如果不相等,则为jumb)为“je”(如果相等,则为jumb)

0 投票
2 回答
1255 浏览

file - 使用 crc 保护 c++ 输出文件(pe 文件)不被编辑

如何使用 crc(循环冗余检查)保护 c++ 输出文件(pe 文件)不被编辑?