Articles of 可移植可执行

为什么装载机不能在所需位置装载

据说有时候,加载程序将这个exe加载到与链接程序所假定的不同的地址。 什么都可能是装载机这样的情况?

一个PE文件如何映射到内存?

所以我在过去的几天里一直在研究PE格式,我还有一些问题 数据部分是否被映射到进程的内存中,或程序是否从磁盘读取? 如果它确实被映射到它的内存中,那么该过程如何能够得到该部分的偏移? (和其他部分) 有没有办法获得已经映射到内存中的进程的入口点,而不用接触磁盘上的文件?

什么部分没有被PE加载器加载?

PE加载器中是否有任何部分未加载? 或者在部分头文件中指定了每个部分? 在ELF程序中,应该加载的节标题(被调用的程序标题或段)是用PT_LOAD标记的。 在体育课程中有没有类似的东西? PS。 我find了IMAGE_SCN_MEM_DISCARDABLE 。 那些没有加载的部分是标记的?

EXE或DLL图像基地址

有没有办法在C + + / Windows获取exe / DLL图像的基地址? 谢谢 :)

exe文件的大小vs可用内存

我已经经历了一个PE文件如何映射到内存? ,这不是我所要求的。 我想知道PE文件的哪些部分(数据,文本,代码,…)总是通过加载器完全加载到内存中,而不pipe条件是什么? 根据我的理解,没有任何部分(代码,数据,资源,文本,…)总是加载完毕,它们在需要时逐页加载。 如果几页代码(中间或结尾)不需要处理用户的请求,那么这些页面不会总是被加载。 我已经尝试了使用/不使用资源的许多代码的exe文件,但是,每次exe加载到内存中时,都会占用比文件大小更多的内存。 (我可能一直在看任务pipe理器中的内存错误列) 马特Pietrek写在这里 注意PE文件不仅仅作为一个内存映射文件映射到内存中是很重要的。 相反,Windows加载程序查看PE文件并决定映射文件的哪些部分。 和 内存中的模块表示进程所需的可执行文件中的所有代码,数据和资源。 PE文件的其他部分可以被读取,但是不能被映射(例如,重定位)。 例如,当debugging信息放在文件的末尾时,某些部分根本就不能被映射。 简而言之, 1-有一个大小为1 MB的可用内存(物理+虚拟)小于1 MB的exe,是否始终拒绝加载,因为可用内存小于文件大小一致? 2-如果一个大小为1MB的文件在加载时(开始运行第一行用户代码)需要2MB内存,而可用内存(物理+虚拟)是1.5MB,那么加载器总是会拒绝加载,因为没有足够的内存? 3-有一个大小为50 MB(大量的代码,数据和资源)的exe文件,但它需要500 KB来运行用户代码的第一行,这是一致的,如果可用内存此exe文件将始终运行第一行代码物理+虚拟)至less500 KB?

从可移植可执行文件中的.idata节打印隐式链接的dll的名称

我试图写一个代码,应该打印出所有导入的DLL在exe文件的名称,通过使用exe文件的.idata节中的IMAGE_IMPORT_DESCRIPTOR结构的“名称”字段,但程序似乎越来越陷入无限循环。 有人可以告诉我如何正确打印名称… #include<iostream> #include<Windows.h> #include<stdio.h> #include<WinNT.h> int main() { FILE *fp; int i; if((fp = fopen("c:\\Linked List.exe","rb"))==NULL) std::cout<<"unable to open"; IMAGE_DOS_HEADER imdh; fread(&imdh,sizeof(imdh),1,fp); fseek(fp,imdh.e_lfanew,0); IMAGE_NT_HEADERS imnth; fread(&imnth,sizeof(imnth),1,fp); IMAGE_SECTION_HEADER *pimsh; pimsh = (IMAGE_SECTION_HEADER *)malloc(sizeof(IMAGE_SECTION_HEADER) * imnth.FileHeader.NumberOfSections); long t; fread(pimsh,sizeof(IMAGE_SECTION_HEADER),imnth.FileHeader.NumberOfSections,fp); for(i=0;i<imnth.FileHeader.NumberOfSections;i++) { if(!strcmp((char *)pimsh->Name,".idata")) t = pimsh->PointerToRawData; pimsh++; } fseek(fp,t,0); IMAGE_IMPORT_DESCRIPTOR iid; char c; while(1) { fread(&iid,sizeof(iid),1,fp); […]