1.pe文件基本概念
2.怎样为PE添加自己的加载e加脚本
3.修改PE系统设定的2种方法
4.win8è¿è¡å¨Uçä¸ï¼è¿è½è£
win peå
5.简述PE文件结构中的基地址、虚拟地址和相对虚拟地址,器源以及虚拟地址和相对虚拟地址之间的载器转换公式。
6.dlopenåSystem.loadLibraryçåºå«
pe文件基本概念
模块标识模块 (MODULE) 在 PE 文件设计中涉及基本概念的源码回顾。术语 "MODULE" 表示一个可执行文件或 DLL 中在内存中加载的加载e加代码 (CODE)、数据 (DATA)、器源项目管理erp源码资源 (RESOURCES)。载器除代码和数据直接由程序使用外,源码模块还包括由 Windows 用于确定代码和数据加载位置的加载e加支撑数据结构。在 位 Windows 中,器源这些支撑数据结构位于模块数据库 (由 HMODULE 指示的载器段) 中。在 Win 中,源码这些数据结构位于 PE 文件头中,加载e加这里将简要解释。器源 关于 PE 文件最重要的载器两个因素是,磁盘上的可执行文件与它被 Windows 加载到内存后非常相似。Windows 加载器无需为从磁盘加载文件而创建进程。它使用内存映射文件机制将文件中的相似块映射到虚拟空间中。构建分析模型,PE 文件类似于预制的房屋。它本质上开始于一个空间,这个空间连接到其他空间的组件(例如,将其连接到 DLL 等)。对于 Win 的 DLL 来说,这个概念同样容易应用。nuke源码一旦模块加载,Windows 可以有效地将其与其他内存映射文件同等对待。 与 位 Windows 不同的是, 位 NE 文件加载器读取文件的一部分并创建内存中的不同数据结构表示模块。当数据段或代码段需要加载时,加载器必须从全局堆中申请一个段,从可执行文件中读取新鲜数据,转到该位置,读取这些数据,并进行适当的修正。此外,每个 位模块都有责任记住当前使用的所有段选择器,无论该段是否已被丢弃。 对于 Win 来说,模块使用的代码、数据、资源、导入表和其他需要的模块数据结构都在一个连续的内存块中。在这种情况下,只需知道加载器将可执行文件映射到何处即可。通过作为映像的一部分的指针,可以很容易地找到该模块的所有不同块。相对于虚拟地址另一个需要知道的概念是相对于虚拟地址 (RVA)。PE 文件中的源码套利许多域使用术语 RVA 来指定。RVA 是项目相对于文件映射到内存的偏移。例如,加载器将文件映射到内存块的虚拟地址 0x 开始。如果映像中的实际表首址是 0x,则它的 RVA 是 0x。 为了将 RVA 转换为有用的指针,只需将 RVA 值加到模块的基地址上即可。基地址是内存映射 EXE 和 DLL 文件的首址,在 Win 中这是一个重要的概念。方便起见,Windows NT 和 Windows9x 使用模块的基地址作为该模块的实例句柄 (HINSTANCE)。在 Win 中,术语 "实例句柄" 可能会导致混淆,因为该术语源自 位 Windows。在 位 Windows 中,程序的每个副本得到自己分开的数据段(以及关联的全局句柄)以将其与其他副本区分开来,形成了术语 "实例句柄"。在 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)怎样为PE添加自己的putchar()源码脚本
一、使用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
修改PE系统设定的2种方法
一、修改内部注册表的方法。1、首先将内部注册表的文件提取出来:
WXPESYSTEMCONFIG*.*WXPESYSTEMSETUPREG.HI_(这是CAB压缩包,将它解开成SETUPREG.HIV)
REGEDIT/sREG文件名
2、运行注册表编辑器REGEDIT.EXE,鼠标点击HKEY_LOCAL_MACHINE,然后点“文件”-“加载配置单元”,打到提取出来的注册表文件(需要改哪个就加载哪个),打开,提示挂载名时随便输入取一个名字如“WinPE”,展开HKEY_LOCAL_MACHINE后里面就有一项WinPE,然后就跟普通的注册表操作一样了,改好后用鼠标点一下“WinPE”项目,然后“文件”-“卸载配置单元”,这个文件就改好了。
3、用改过的注册表文件替换原来的。
二、修改PE配置文件的方法。
如果要修的项依赖于外置程序的目录结构(比如要在右键菜单中添加用UltraEdit打开),就不能用上面的方法了,因为外置程序的绝对路径是不确定的(不同的机器中盘符不能确定)。
这种情况就需要用原始的REG命令来做了(就跟毛桃在REGDOC.CMD中的做法一样),这个命令的语法比较艰涩,且注册表键值的表示方法跟REG文件不同。在命令提示符下通过/?参数可以获得它的用法(中文的哦),提醒一下/?参数是个以多层使用的,如REG/?得到的是基本参数的说明,如用REGADD/?则可得到ADD这个参数的用法……
有了这个命令的基础后,我们来看看是怎么解决不定路径问题的。
在REGDOC.CMD中有一个环境变量%TP%,代表的是REGDOC.CMD这个文件所在的路径。我们可以通过%TP%..表示它的上层目录,%TP%....表示它的上两层目录。用此方法可以索引到外置程序目录内的所有路径,而不用考虑外置程序目录本身的绝对路径。
(还有个方法就是在WinPE.INI中用PECMD的REGI命令一行行添加,这个比系统的REG命令好理解些,同样可以用%CurDir%环境变量来索引外置程序目录内的所有路径)
直接修改的好处是启动PE就是所需要设置,不依赖外部配置文件,PE的加载速度也比较快,但麻烦。修改配置文件则比较简单,但要依赖配置文件加载过程(直到加载到那些语句时才会生效),启动时需要额外的时间加载,相当于给系统打补丁去修改默认设置。
一般情况下不推荐直接修改PE注册表,麻烦,重新打包也比较花时间。但有些跟系统紧密的键必须直接修改才有效,比如屏幕分辨率,虽然在外面也可以修改有,但在登录时加载到它之前是无效的,那么在登录的过程中屏幕就会因切换分辨率而闪烁。自己修改注册表的前提是自己要知道所希望的改变要修注册表中的哪些键值。可以上网搜索,现在网上的这些资源多得是,实在找不到的话可以还可以用RegMon之类的注册表监视软件来定位。比如修改记事本的自动换行,又不知道相应的键值在哪。可以先开启RegMon,然后在记事本中改变换行的选项,看RegMon的监视结果,来定位是哪个键值。因为系统本身也在不断的更改注册表,RegMon中的显示会很多,但是通过不断的改变记事本中的设置,最终是可以找到的,这个过程需要的是耐心和和细心的。
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软件æ¥è®¾ç½®ä¼é常æ¹ä¾¿ã
è¯è¯å§ã
简述PE文件结构中的基地址、虚拟地址和相对虚拟地址,以及虚拟地址和相对虚拟地址之间的转换公式。
答案:当PE文件通过Windows加载器载入内存后,内存中的版本称为模块映射文件的起始内存地址称为基地址。每个程序都有自己的虚拟地址空间,这个虚拟空间的内存地址称为虚拟地址。
虚拟地址和相对虚拟地址之间的转换公式:虚拟地址=基地址+相对虚拟地址
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 å°å½åç®å½ä¸å°±å¯ä»¥ç¨çæ¹å¼ï¼æ çæé«äºç³»ç»çå®å ¨æ§ã
操作系统的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以及其他类似的代码格式在底层结构上可能相似,但由于操作系统的差异,这些格式在具体实现和结构上可能会有所不同。这些差异导致了不同操作系统间的文件格式不兼容,需要在加载和执行时进行适当的转换或适配。