从PE规格来看:
\n\n\n\n\n在位置
\n\n0x3c,存根具有 PE 签名的文件偏移量。\n 此信息使 Windows 能够正确执行映像文件,\n 即使它具有 MS DOS 存根。该文件偏移量在链接期间被放置在\n位置0x3c。2.2. 签名(仅图像)
\n
在 MS DOS 存根之后,在 offset 处指定的文件偏移处0x3c,是一个 4 字节签名,该签名将文件标识为 PE 格式图像文件。此签名为 \xe2\x80\x9cPE\\0\\0\xe2\x80\x9d (\n 字母 \xe2\x80\x9cP\xe2\x80\x9d 和 \xe2\x80\x9cE\xe2\x80\ x9d 后跟两个空字节)。
我尝试读取这些字节:
\n\nusing System;\nusing System.IO;\n\nclass Program {\n const String fileName = @".\\some_application.exe";\n const Int64 peMarkerPosition = 0x3c;\n\n static void Main(string[] args) {\n using (FileStream fs = new FileStream(fileName, FileMode.Open,\n FileAccess.Read)) {\n Byte[] marker = new Byte[4];\n fs.Position = …Run Code Online (Sandbox Code Playgroud) 我使用 Visual Studio 2015 编译了一个普通的 exe。除了预期的类型 调试目录之外IMAGE_DEBUG_TYPE_CODEVIEW,我还发现了第二个类型IMAGE_DEBUG_TYPE_VC_FEATURE.
我找不到有关它包含哪些数据及其用途的信息。有人可以解释一下或向我指出解释它的来源吗?
executable debug-symbols portable-executable visual-studio visual-studio-2015
当尝试使用从 PE 文件中提取证书时cryptography,失败并显示ValueError: Unable to load certificate. 我可以使用命令行从同一个 PE 文件中正确提取subprocess证书openssl。我想了解使用的代码版本出了什么问题cryptography。
我使用的是Python 3.7.1、加密2.4.2和pefile 2018.8.8
import pefile
from cryptography import x509
from cryptography.hazmat.backends import default_backend
pe = pefile.PE(fname)
pe.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_SECURITY']])
sigoff = 0
siglen = 0
for s in pe.__structures__:
if s.name == 'IMAGE_DIRECTORY_ENTRY_SECURITY':
sigoff = s.VirtualAddress
siglen = s.Size
pe.close()
with open(fname, 'rb') as fh:
fh.seek(sigoff)
thesig = fh.read(siglen)
cert = x509.load_der_x509_certificate(thesig[8:], default_backend())
Run Code Online (Sandbox Code Playgroud)
这失败了ValueError: Unable to load certificate
python openssl pyopenssl portable-executable python-cryptography
正如标题所说,如何通过查看PE文件头来判断exe是静态加载DLL还是动态加载DLL?
换句话说,如何判断 DLL 是可执行文件的一部分,还是将被加载程序调用?
谢谢
我想在Perl中使用PE文件并且没有找到模块,所以我想我会编写自己的(已经在delphi中做过一次).
我只有一个问题,当将可执行文件映射到缓冲区时,如何搜索像0x00004550(IMAGE_NT_SIGNATURE)这样的八进制,将它们转换回可写字符串等?
我正在开发一个便携式Java应用程序,它可以在用户的PC上动态生成一些文件(windows xp).现在,我想要的是在java程序退出后删除那些临时文件.显然,java的文件删除机制是不可信任的.即使我将文件标记为在退出时删除(file.deleteOnExit()),大多数时候也不会删除它.我使用包装器(java2exe)将其作为可执行文件运行.欢迎任何建议或解决方案?
谢谢,深
我已经尝试这样做了大约两天,没有成功.我一直在阅读许多PE文件格式教程无济于事.
我通过CreateFileMapping将32位可执行文件映射到内存中,效果很好.然后我的程序遍历节标题,并根据我的默认特征检查特征(以确保该节是可执行的并且是代码).如果为真,则程序返回指向该节头的(PIMAGE_SECTION_HEADER)指针(程序到目前为止工作正常).
现在我有了指针,结构中有两个特定的条目让我困惑,那就是PointerToRawData和VirtualAddress,当我输入条目时; VirtualSize = 4096,PointerToRawData = 1536.
从我在PE文档中读到的,是PointerToRawData是磁盘上的部分中数据的第一个字节(我是否正确?)的假定偏移量(RVA ???),并且是对齐值的倍数(512 ).问题是如何设置此值,以获取可用于访问节的数据的指针.在内存映射文件上,最好使用(VirtualAddress值+ imagebase值)来查找该节的第一个字节?
另一个混淆点是VirtualSize vs SizeOfRawData.这让我很困惑,因为在这篇文章中 - http://msdn.microsoft.com/en-us/library/ms809762.aspx,它说"SizeOfRawData字段(似乎有点用词不当)后来在结构中持有向上舍入值"但我的VirtualSize大于我的SizeOfRawData值,这导致我应该使用哪一个混淆.
该程序的目的是找到可执行部分(.text部分)并对该部分中的所有位执行按位操作,并在下一部分之前结束操作.
我不希望它看起来像我期待的勺子,我只是想要一些澄清.
感谢您的时间/帮助,非常感谢.
问题是我有一个Windows可执行文件(.exe),我希望它的进程在运行时修改其映像文件中的一些值,所以下次程序从它停止的点继续执行时,是什么最好的方法吗?
我目前正在尝试理解以下PE代码指令的翻译:
004033C0 | .-E9 3BDCFFFF | JMP seh_exam.00401000
Run Code Online (Sandbox Code Playgroud)
我自己做了一些研究,因为它是一个无条件的跳转,我认为它是下表中的指令:

(图片来源:http://www.mathemainzel.info/files/x86asmref.html#jmp)
根据我的理解,字节E9 =无条件跳转,3B = o0和DC = 01,其中o0和01表示设置EIP的偏移量.
代码跳跃了9152个字节,但负偏移的转换究竟是如何工作的?任何意见,将不胜感激.
PS:不是作业问题.
手头有exe文件,是否可以找到有关编译它的人的任何信息?更具体地说,delphi编译器是否包含自己的许可证信息或OS用户,甚至可执行文件中的某些硬件ID?