我正在用 C# 编写一个程序,在其中读取 PE 的字节。但为了获得 RVA,我需要使用节标题。我想知道节标题的最大数量是多少?
我尝试过谷歌,我也看过这里,但我没有找到任何可以指引我正确方向的东西
谢谢。
可执行文件需要首选加载地址并因此保留位置相关代码而不是简单地在整个文件中使用 RVA 是否有任何充分的理由?
对我来说,这看起来像是一个重大的设计缺陷,我不明白人们是如何想出这个想法的。
我知道如何指示 GCC(使用标志-mwindows)IMAGE_SUBSYSTEM_WINDOWS_GUI使用而不是IMAGE_SUBSYSTEM_WINDOWS_CUI Windows 子系统生成 PE 。
Clang 提供等效的标志吗?如果没有,我如何更改生成的可执行文件的 Windows 子系统(最好使用开源软件)?
我似乎无法找到我在这里尝试做的事情的正确答案。
在我的 C# 代码中,我想从用户提示符传递的另一个可执行文件中提取资源。另一个可执行文件是本机 PE 文件。
例如,我需要KDATA\106从这个 PE 文件中提取资源 ( sample.exe)。这就是 ResourceHacker 中的样子。
我似乎只能找到有关如何从我的程序中提取或从另一个项目中解析的信息。
我正在研究 PE(可移植可执行文件)格式,但我发现用 MinGW 和 MSVC 编译的 C++ 程序之间存在差异:
这是“此程序无法在 DOS 模式下运行”之后和“PE”魔术签名之前的一些额外字节。有人知道这是什么以及为什么有“Rich”这个词吗?
好吧,我读了几篇关于可移植可执行文件(PE)的Matt Pietrek的文章,比如:
另外,我已经阅读了关于这个主题的一些其他来源.要么是我忽略了某些部分,要么就是那里没有回答问题.
那么,这里有一些问题:
众所周知,在加载EXE时,Windows Loader从Importa地址表(IAT)读取导入的DLL列表,并将它们加载到进程地址空间.
进程地址空间是一个虚拟空间.DLL可能已经加载到某个物理空间中.对于像KERNEL32.dll或等的DLL,会发生这种情况USER32.dll.物理地址和虚拟地址之间有什么关系?加载器是仅分配页面并复制DLL,还是引用?
如果没有加载DLL,Loader是加载整个DLL,还是仅加载所需的函数?例如,如果您使用了函数foo()from bar.dll,那么加载器是否会将整个加载bar.dll到进程地址空间中?或者,它只是将foo代码加载到进程地址空间?
假设您的EXE文件使用驻留的函数MessageBox()from .您是否可以开发自定义,将其放在与EXE文件相同的目录中,并期望您的应用程序调用您的自定义而不是系统默认值?USER32.DLL%WINDIR%\system32\user32.dllUSER32.DLLMessageBoxMessageBox
一旦Windows在内存中加载了可执行文件并将执行转移到入口点,寄存器和堆栈中的值是否有意义?如果是这样,我在哪里可以找到更多有关它的信息?
即使数据被附加到便携式可执行文件,它们仍然有效.据我所知,这是由于可执行代码的偏移+大小性质.
我有一个类似于Winzip的Zip2Exe的可执行打包应用程序.到目前为止,我一直在可压缩有效负载添加到可执行存根的末尾,后跟一个8字节值,表示有效负载的字节大小.
我想要做的是让可执行存根计算自己的大小,并假设剩余的字节作为有效负载而没有任何大小信息.这纯粹是出于好奇,而我真正想知道的是PE可以计算出自己的大小并检测是否有任何添加.
当然,我知道如果通过注入或其他方式更改了它自己的内容,它就无法验证它.
为了澄清这个问题,我想在.NET中使用一个函数来检查Assembly.GetExecutingAssembly().Location和计算附加有效负载的偏移量.如果此偏移量与文件大小相同,则不会有有效负载.
PE文件中偏移量为0x3c的PE头的指针总是设置为0x80吗?
我想知道为什么这个指针会改变.我猜DOS标题和存根没有改变,因为它们是第一次写的.
PE-header直接在这些DOS工件之后启动,PE指针总是设置为0x80?如果没有,为什么?
我公司的服务器默认使用Python 2.6安装Redhat 6。客户使用Python 3.4向我发送了一些示例代码,但我无权安装Python 3.4
使用Java,我可以将jdk安装文件夹从另一台Linux服务器复制到我的Linux服务器上,而无需安装它。我需要做的唯一更改是相应地更改您的JAVA_HOME和PATH变量
如何将这种方式用于Python?