1.pe������Դ��
2.pe文件基本概念
3.dlopenåSystem.loadLibraryçåºå«
4.win8è¿è¡å¨Uçä¸ï¼è¿è½è£
win peå
5.操作系统的加载ELF,COFF,PE文件格式有什么区别
6.怎样为PE添加自己的脚本
pe������Դ��
答案:当PE文件通过Windows加载器载入内存后,内存中的器源版本称为模块映射文件的起始内存地址称为基地址。每个程序都有自己的码加虚拟地址空间,这个虚拟空间的意思内存地址称为虚拟地址。
虚拟地址和相对虚拟地址之间的加载转换公式:虚拟地址=基地址+相对虚拟地址
pe文件基本概念
模块标识模块 (MODULE) 在 PE 文件设计中涉及基本概念的回顾。术语 "MODULE" 表示一个可执行文件或 DLL 中在内存中加载的器源QQ在线互赞源码代码 (CODE)、数据 (DATA)、码加资源 (RESOURCES)。意思除代码和数据直接由程序使用外,加载模块还包括由 Windows 用于确定代码和数据加载位置的器源支撑数据结构。在 位 Windows 中,码加这些支撑数据结构位于模块数据库 (由 HMODULE 指示的意思段) 中。在 Win 中,加载这些数据结构位于 PE 文件头中,器源这里将简要解释。码加 关于 PE 文件最重要的两个因素是,磁盘上的cf网源码可执行文件与它被 Windows 加载到内存后非常相似。Windows 加载器无需为从磁盘加载文件而创建进程。它使用内存映射文件机制将文件中的相似块映射到虚拟空间中。构建分析模型,PE 文件类似于预制的房屋。它本质上开始于一个空间,这个空间连接到其他空间的组件(例如,将其连接到 DLL 等)。对于 Win 的 DLL 来说,这个概念同样容易应用。一旦模块加载,Windows 可以有效地将其与其他内存映射文件同等对待。 与 位 Windows 不同的是, 位 NE 文件加载器读取文件的一部分并创建内存中的不同数据结构表示模块。当数据段或代码段需要加载时,加载器必须从全局堆中申请一个段,从可执行文件中读取新鲜数据,流量充值源码转到该位置,读取这些数据,并进行适当的修正。此外,每个 位模块都有责任记住当前使用的所有段选择器,无论该段是否已被丢弃。 对于 Win 来说,模块使用的代码、数据、资源、导入表和其他需要的模块数据结构都在一个连续的内存块中。在这种情况下,只需知道加载器将可执行文件映射到何处即可。通过作为映像的一部分的指针,可以很容易地找到该模块的所有不同块。相对于虚拟地址另一个需要知道的百纳源码概念是相对于虚拟地址 (RVA)。PE 文件中的许多域使用术语 RVA 来指定。RVA 是项目相对于文件映射到内存的偏移。例如,加载器将文件映射到内存块的虚拟地址 0x 开始。如果映像中的实际表首址是 0x,则它的 RVA 是 0x。 为了将 RVA 转换为有用的指针,只需将 RVA 值加到模块的基地址上即可。基地址是内存映射 EXE 和 DLL 文件的首址,在 Win 中这是一个重要的概念。方便起见,Windows NT 和 Windows9x 使用模块的基地址作为该模块的实例句柄 (HINSTANCE)。在 Win 中,术语 "实例句柄" 可能会导致混淆,因为该术语源自 位 Windows。在 位 Windows 中,tensorflow源码分析程序的每个副本得到自己分开的数据段(以及关联的全局句柄)以将其与其他副本区分开来,形成了术语 "实例句柄"。在 Win 中,每个程序不必与其他程序区别开来,因为它们共享相同的地址空间。术语 INSTANCE 维持了 位 Windows 和 位 Windows 之间的连续性。在 Win 中重要的是,你可以调用 GetModuleHandle() 对任何 DLL 访问其组件!如果 dllname 为 NULL,则得到执行体自己的模块句柄。这是非常有用的,如通常编译器生成的启动代码将取得这个句柄并将它作为参数 hInstance 传给 WinMain! 最后,你需要理解的 PE 文件概念是 "块 (Section)"。PE 文件中的块等同于 NE 文件中的段或资源。块可以包含代码或数据。与段不同的是,块是内存中的连续空间,没有尺寸限制。当连接器和库为你建立并包含操作系统至关重要的信息的其他数据块时,这些块包含你的程序直接声明和使用的代码或数据。在一些 PE 格式描述中,块也称为对象。由于 "对象" 一词的含义如此广泛,只能将代码和数据称为 "块"。扩展资料
PE文件被称为可移植的执行体是Portable Execute的全称,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)dlopenåSystem.loadLibraryçåºå«
å¨æé¾æ¥åºå¨ unix ä¸ï¼ä¹ æ¯ä»¥ .so 为æ件åç»å°¾ï¼é常è¿ä»¥ lib å¼å¤´ï¼ãè Windows ä¸æ¯ä»¥ .DLL 为æ件åç¼ãWindows å¨å¤ç dll ä¸è¿æä¸äºç»è容æ被人忽ç¥
å¦æéè¦è¿è¡æ¶ä¸»å¨å è½½ä¸ä¸ªå¨æé¾æ¥åºï¼windows ä¸å¯ä»¥ä½¿ç¨ LoadLibrary è¿ä¸ª kernel API (å¨ kernel.dll ä¸)ï¼unix ä¸æ¯ç¨ dlopen ãWindows ä¸æ¾å° dll ä¸å¯¼åºç¬¦å·çå°åï¼å¯ä»¥ç¨ GetProcAddress ï¼è unix ä¹æ对åºç api ...
è¿äºç¸äºå¯¹åºç api ï¼ä¼¼ä¹é¢ç¤ºç对ççåè½ï¼ä½äºå®ä¸æ¯æåºå«çã
DLL äºå®ä¸å EXE æ件ä¸æ ·ï¼åå± PE æ ¼å¼çæ§è¡æ件ã对äºéå¼çå¼ç¨å¤é¨ç¬¦å·ï¼éè¦æå¤é¨ç¬¦å·æå¨çä½ç½®åå¨ PE 头ä¸ãPE å è½½å¨å°ä» PE 头ä¸æ¾å°ä¾èµç符å·è¡¨ï¼å¹¶å è½½ä¾èµçå ¶å® DLL æ件ã
ä½æ¯ï¼unix ä¸å¹¶éå¦æ¤ï¼so æ件大å¤ä¸º elf æ§è¡æä»¶æ ¼å¼ãå½å®ä»¬éè¦çå¤é¨ç¬¦å·ï¼å¯ä»¥ä¸åæè¿äºç¬¦å·æå¨çä½ç½®ãä¹å°±æ¯è¯´ï¼é常 so æ件æ¬èº«å¹¶ä¸ç¥éå®ä¾èµçé£äºç¬¦å·å¨åªäº so éé¢ãè¿äºç¬¦å·æ¯ç±è°ç¨ dlopen çè¿ç¨è¿è¡æ¶æä¾çãè unix ä¸çæ§è¡æ件æ¬èº«ä¼æ´é²èªå·±éæé¾æ¥ç符å·ï¼ï¼å¯ä»¥æ¯èªå·±æ¬èº«å®ç°çï¼æè æ¯ä»éæåº .a æ件éé¾å ¥çï¼ãdlopen å°æè¿äºç¬¦å·éæ¥ç» dlopen å è½½ç .so æ件ï¼æç»å®æå¨æé¾æ¥ãï¼äºå®ä¸ dlopen è¿å¯ä»¥æå® mode ï¼å®ææ´å¤æçæä½ï¼
å 为è¿ä¸ªåºå«ï¼unix ä¸ç lua 解éå¨å¯ä»¥å®å ¨éæé¾æ¥ææç lua api ï¼æ们为 lua æ©å±çåºï¼ä»¥ so çå½¢å¼åå¨è¢«è¿è¡æ¶å è½½ä¸ä¼æä»»ä½éæ£ãè Windows ä¸ï¼å¿ é¡»çæä¸ä¸ª luacore ç DLL æ件ï¼ç± lua 解éå¨äºæ©å±åºå ±äº« lua api (è¿å æ¬ crt çå®ç°) æä¸ä¼åºé®é¢ã
ä¹å 为è¿ä¸ªåºå«ï¼VC ä¸æä¼æ让 windows å¼åæ°æå°æä¸è§£çå¨æé¾æ¥ CRT ï¼éæé¾æ¥ CRT ï¼å¤çº¿ç¨åºï¼å线ç¨åºï¼çççé项ã没ç¹ç¹ windows å¼åååç人ï¼å¤å°é½è¦å¨ä¸é¢æ ½å 个è·å¤´ã
ä»å¨æé¾æ¥åºçè¿ä¸ªè®¾è®¡ä¸æ¥çï¼ä¸ªäººæè§Windows å¼çç³ç³é顶ãå°¤å ¶æ¯å¯¹å¼åè æ¥è¯´æ¯è¿æ ·ãè³å°æä»¬å¨ windows ä¸åä¸ä¸ª dll æ件ç»å¤§å®¶ä½¿ç¨è¿éè¦æºå¸¦ä¸ä¸ª .lib æ件ï¼è unix ä¸ä¸è¬åªéè¦æç¸åºç头æ件就å¤äºã对äºç¼åæ°ç .so ï¼æ¾ä¸å°ç符å·å¯ä»¥å°±è®©å®å¨é£éï¼ç´å°æç»æ§è¡æ件æ¥æææéè¦ç符å·èåå°ä¸èµ·ãwindows å¯ä»¥åå¨ä¸ä¸ª dll 对å¦ä¸ä¸ª dll çéå¼ä¾èµï¼è unix ä¸ä¸è¬ä¸éè¦è®© so å so æéå¼ä¾èµå ³ç³»ãè¿è®©æä»¬å ¨å±æ¿æ¢ç±»ä¼¼ CRT çä¸è¥¿åçå°é¾è®¸å¤ï¼è以æèªå·±çç¼ç¨ç»éªæ¥çï¼å¥½å¤å´æ²¡æå¤å°ã
unix ä¸éè¦ç¨ ldconfig æ¥ç®¡çå¨æåºï¼è¿æ¯ windows ä¸ copy DLL å°å½åç®å½ä¸å°±å¯ä»¥ç¨çæ¹å¼ï¼æ çæé«äºç³»ç»çå®å ¨æ§ã
win8è¿è¡å¨Uçä¸ï¼è¿è½è£ win peå
å¯ä»¥ã
å¨å¯å¨é¡¹ä¸å¢å WinPeçWIMæ件就è¡äºã
å¨Win8ä¸å¯å¨åï¼ç¨BCDEDITçï¼å¦ä¸æ示ï¼
Windows å¯å¨å è½½å¨
-------------------
æ è¯ç¬¦ { bf6f5-f7-4c-a6d9-3cce}
device ramdisk=[D:]\Disk.wim,{ 4ead--4b6b-9fe6-f8ba4b
f}
path \Windows\system\boot\winload.exe
description Boot from Wim Image
locale zh-CN
osdevice ramdisk=[D:]\Disk.wim,{ 4ead--4b6b-9fe6-f8ba4b
f}
systemroot \Windows
detecthal Yes
winpe Yes
以ä¸æ è¯ç¬¦{ bf6f5-f7-4c-a6d9-3cce}å{ 4ead--4b6b-9fe6-f8ba4bf}æ ¹æ®ä¸åçæºå¨ï¼å 容ä¸åã
å¦ç¨BOOTICE软件æ¥è®¾ç½®ä¼é常æ¹ä¾¿ã
è¯è¯å§ã
操作系统的ELF,COFF,PE文件格式有什么区别
1. ELF(Executable and Linkable Format)和COFF(Common Object File Format)是两种不同的机器语言文件格式,分别针对不同的芯片平台。例如,ARM和x架构就有各自的汇编语言格式和寄存器设置。
2. PE(Portable Executable)文件格式是在COFF指令结构基础上发展起来的,它为Windows操作系统中的可执行文件提供了一种封装形式。PE文件包含了DOS文件头、导入表、导出表、资源表等额外信息,这些信息帮助PE载入器按照特定流程加载和执行文件。
3. 由于PE文件格式中包含了特定于操作系统的信息,如导入表和导出表,因此在不同的操作系统中,这些文件格式可能会有所不同。例如,即使是基于x架构的Linux和Windows系统,它们的可执行文件格式也是不兼容的。Linux的加载器无法识别Windows PE文件中的特定结构,因此Windows PE文件不能在Linux上执行。
4. 尽管x平台上的COFF以及其他类似的代码格式在底层结构上可能相似,但由于操作系统的差异,这些格式在具体实现和结构上可能会有所不同。这些差异导致了不同操作系统间的文件格式不兼容,需要在加载和执行时进行适当的转换或适配。
怎样为PE添加自己的脚本
一、使用Winpeshl.ini添加自定义脚本:
可以使用Winpeshl.ini的文件来启动自定义的外壳应用程序。Winpeshl.exe将在启动期间处理Winpeshl.ini中的设置。使用文本编辑器(如记事本)创建具有以下文件目录结构的Winpeshl.ini文本文件。例如:
[LaunchApp]
AppPath = %SYSTEMDRIVE%/myshell.exe
[LaunchApps]
%SYSTEMDRIVE%/mydir/application1.exe, -option1 -option2
application2.exe, -option1 -option2
注:将AppPath项设置为外壳应用程序的路径。此路径可以是绝对路径,也可以使用环境变量(相对路径),例如%SYSTEMROOT%/System/Myshell.exe。AppPath 项不支持命令行选项。将此文件保存到WinPE系统映像的%SYSTEMROOT%/System下。
二、使用Startnet.cmd添加自定义脚本:
使用Startnet.cmd可以在WinPE系统中添加自定义的命令行脚本。默认情况下,WinPE系统包括Startnet.cmd脚本,此脚本位于WinPE系统映像的 %SYSTEMROOT%/System 中。当前,主要用Startnet.cmd来启动Wpeinit.exe。用于安装即插即用 (PnP) 设备、处理 Unattend.xml 设置以及加载网络资源。编辑Startnet.cmd 以包括自定义命令。
注意:对于PnP和网络支持,请确保在自定义Startnet.cmd脚本中包含了对wpeinit的调用。
三、使用Unattend.xml添加自定义脚本:
运行imagex /info d:/boot.wim,查看WinPE系统映像的信息。我们要注意这一行:
Image Count: 2
说明此WinPE系统映像文件中其实包含了两个映像。每个映像的详细信息在后面有详细的说明。这里要特别说明的是我们需要编辑的是第二个名称为WDS的映像,因为WDS使用此映像来引导计算机。
使用imagex命令加参数mountrw将 *.wim 加载到pemount目录中:
imagex /mountrw c:/winpe2/pe2.wim 2 c:/pemount
使用peimg命令将第三方驱动添加到WinPE 2.0系统中,如需添加多个设备驱动请重复该步骤。
peimg /inf=c:/winpe2/netdrv/xxx.inf c:/pemount/windows
使用imagex命令加参数unmount及commit将修改写入到 *.wim 中。
imagex /unmount c:/pemount /commit