我正在寻找一个命令行程序来向 PE 文件的导入表添加条目。我的目标是将一个新的导入函数从外部 DLL 添加到我的 EXE,然后使用 ollydbg 使用代码洞穴插入新代码。新代码将使用新导入的函数。
事实上我已经实现了我的目标,但是为了向导入表添加新条目,我使用了Stud_PE,它是一个 GUI 应用程序,我想自动化这部分过程。
我会考虑以编程方式解决方案,但我担心 PE 结构太复杂,无法在我的时间范围内学习和探索。此外,如果已经存在一个实现,那么不使用它将是一种耻辱。:-)
OSR在其博客上发布了与 Microsoft 人员的问答环节。主题是与早期 Windows 版本相比,Windows 10 驱动程序签名要求的变化。
\n\n微软项目经理 James Murray 在一份声明中表示(粗体部分):
\n\n\n\n\nPeter:新的驱动程序签名过程表明您必须构建一个 CAB 文件来上传进行签名,然后使用您的 EV 证书对该 CAB 文件进行签名。为什么是 CAB 文件(而不是 ZIP\n 存档等常见文件)?如何构建 CAB 文件?是否有特定的流程或工具可供使用?
\n\nJames: 选择CAB是因为CAB本身就是PE文件。这在一定程度上简化了签名过程,因为signtool.exe具有\xe2\x80\x9cnative\xe2\x80\x9d支持。如果\n我们选择了ZIP存档(注意,我们\xe2\x80\x99d仍然喜欢移动\n方向),我们将需要提供\n单独的签名机制。类似于 HLK studio,一个具有签名 ZIP 或 OPC 功能的小工具。
\n
这让我很惊讶。我知道很多 PE/COFF 详细信息,但从来没有印象过 CAB 文件适合其中。它似乎也与包含 CAB 的自解压可执行文件无关。
\n\n我必须在十六进制编辑器中打开一个 CAB 文件才能亲自查看它,但不知何故,我无法看出该声明在何种意义上是正确的。
\n\n谁能提供有关 CAB 文件如何/为什么是PE 文件的详细信息?
\n编译visual studio c#应用程序时会生成PE和EXE文件。那么PE和EXE文件的主要区别是什么?据我所知,PE文件包含
PE/COFF Headers,
CLR Headers,
CLR Data,
Meta Data,
IL code,
.data,.text...
Run Code Online (Sandbox Code Playgroud)
比 exe 包含什么? PE 与 EXE 有何不同?
我看到对于图像文件中的部分,该VirtualSize字段是加载到内存中时该部分的总大小,而该SizeOfRawData字段是该部分在磁盘上的初始化数据的大小。
在检查一个.idata部分时,该VirtualSize字段设置为 0x14,而该SizeOfRawData字段设置为 0x400。
为什么链接器 - 在这种情况下 MinGW ld- 使文件部分如此之大,而加载到内存中的部分只是它大小的一小部分?
另外,这个VirtualSize领域的目的是什么?为什么不总是加载整个部分,即加载SizeOfRawData字节?
我在官方 PE 文档中没有看到描述或它们的关系。
任何人都可以解释一下 PE 标头中绑定导入和延迟导入之间的差异。我参考了几本书,但我无法清楚地理解它的概念。任何人都可以帮助我。
如果我查看可移植可执行文件的内部结构,该IMAGE_OPTIONAL_HEADER部分内有一个IMAGE_DLLCHARACTERISTICS_NO_ISOLATION字段,正如微软在这里提到的那样,这意味着:“图像是隔离感知的,但不应该被隔离。”。但是,我不明白这里的含义或隐含的含义,也无法找到更多相关信息。此选项也作为 Visual Studio 选项存在,并且在创建 Win32 应用程序项目时默认启用 (VS 2015 C++)。在启用它之前,我想知道它对代码生成有何作用。
如果有人知道,请分享。提前致谢。
我只是用来objdump -x ...检查PE文件的各个部分.
大约有90,000行reloc条目:
reloc 92 offset bc0 [524bc0] HIGHLOW
reloc 93 offset bc4 [524bc4] HIGHLOW
....
Run Code Online (Sandbox Code Playgroud)
大多数PE文件的大部分空间是否都是由上面的reloc条目组成的?
那些条目是什么?
UPDATE
任何人都可以解释重定位条目如何像上面那样工作?
基本上我需要一个程序,它将从控制台对应的窗口.exe中排序.
文件扫描程序:
SortExe(file exe)
{
if (IsPeWindows(exe))
{
AddToList1(exe);
}
else if (IsPeConsole())
{
AddToList2(exe);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何实现IsPeWindows或IsPeConsole()?
我不特别介意什么语言解决方案,只要它是c,c ++,c#或visual basic之一.
如果.NET可执行文件是PE文件,为什么像UPX这样的所有打包程序"会破坏"它?
当我在hexeditor值中查看pe文件时,存储在其中的是反转,但为什么呢?
例如:
在pe文件头结构中,第2条记录被称为Number Of Section
,其值为0300,
但实际值为0003
,这意味着从pe文件中读取值,我们必须从右边逐字节读取它!
windows ×4
exe ×2
.net ×1
assembly ×1
automation ×1
c# ×1
c++ ×1
cab ×1
code-signing ×1
compilation ×1
compression ×1
console ×1
dll ×1
executable ×1
relocation ×1
winapi ×1
windows-10 ×1