如何修改PE文件

如何修改PE文件,第1张

一、        Windows加载器

加载器读取一个PE文件的过程如下:

1. 先读入PE文件的DOS头,PE头和Section头。

2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。

3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射的页的属性。

4. 如果文件被加载的地址不是ImageBase定义的地址,则重新修正ImageBase。

5. 根据PE文件的输入表加载所需要的DLL到进程空间。

6. 然后替换IAT表内的数据为实际调用函数的地址。

7. 根据悉绝搏PE头内的数据生成初始化的堆和栈。

8. 创建初始化线程,开始运行进程。

这里要提的是加载PE文件所需DLL的过程是建立在六个底层的API上。

LdrpCheckForLoadedDll:检查要加载的模块是否已经存在。

LdrpMapDll:映射模块和所需信息到内存。

LdrpWalkImportDescriptor:遍历模块的输入表来加载其所需的其他模块。

LdrpUpdateLoadCount:计数模块的使用次数。

LdrpRunInitializeRoutines:初始化模块。

LdrpClearLoadInProgress:清楚某些标志,表明加载已经完成。

二、        插入代码到PE文件

有三种方式可以插入代码到PE文件:

1. 把代码加入到一个存在宏誉的Section的未用空间里。

2. 扩大一个存在的Section,然后把代码加入。

3. 新增一个Section。

方法一、增加代码到一个存在的Section。

首先我们需要找到一个被映射到一个块有执行权限的Section。最简单的方式就是直接利用CODE Section。

然后我们需要查找这块Section内的多余空间(也就是填满了00h)。我们知道一个Section有两个数据来表示其大小。VirtualSize和SizeOfRawData。这个VirtualSize代表Section里代码实际所占用的磁盘空间。SizeOfRawData代表根据磁盘对齐后所占的空间。通常SizeofRawData都会比VirtualSize要大。如下图。

图中的SizeOfRawData是0002A000,而VirtualSize是00029E88。当PE文件被加载到内存的时候,他们之间的多余空间的数据是不会被加载到内存去。那么如果要把加入到这个间隙中间的代码也被加载到内存去,就需要修改VirtualSize的值,这里把VirtualSize的值可以改为00029FFF。这样,我们就有了一小睁祥段空间加入自己的代码。下面需要做的就是先找到PE文件的入口点OriginalEntryPoint,比如这个OriginalEntryPoint是0002ADB4,ImageBase是400000,那么入口点的实际虚拟地址是0042ADB4。然后计算出自己代码的起始RVA,更换掉PE头内的OriginalEntryPoint,在自己的代码最后加上:

MOV EAX,00042ADB4

JMP EAX

这样就可以在PE文件被加载的时候,先运行自己的代码,然后再运行PE文件本身的代码。成功的把代码加入到了PE文件内。

方法二、扩大一个存在的Section来加入代码。

如果在一个Section末尾没有足够的空间存放自己的代码,那么另外一种方法就是扩大一个存在的Section。一般我们只扩大PE文件最尾部的Section,因为这样可以避免很多问题,比如对其他Section的影响。

首先我们的找到最后一个Section使之可读可执行。这可以通过修改其对应Section头部的Characteristics来获得。然后根据PE头内文件对齐的大小,修改其SizeOfRawData。比如文件对齐的大小是200h,原先SizeOfRawData=00008000h, 那么我们增加的空间大小应该是200h的整数倍,修改完的SizeOfRawData至少是00008200h。增加完空间后,需要修改PE头内的两个字段的数值,SizeOfCode和SizeOfInitialishedData。分别为它们增加200h的大小。这样我们就成功的扩大了一个Section,然后根据方法一内的方式把代码加入到增加的空间。

方法三、新增一个Section来加入代码。

如果要加入的代码很多,那么就需要新增一个Section来存放自己的代码。

l         首先,我们需要在PE头内找到NumberOfSections,使之加1。

l         然后,在文件末尾增加一个新的空间,假设为200h,记住起始行到PE文件首部的偏移。假如这个值是00034500h。同时将PE头内的SizeOfImage的值加200h。

l         然后,找到PE头内的Section头部。通常在Section头部结束到Section数据部分开始间会有一些空间,找到Section头部的最后然后加入一个新的头部。假设最后一个Section头部的数据是:

1. Virtual offset : 34000h

2. Virtual size : 8E00h

3. Raw offset: 2F400h

4. Raw size : 8E00h

而文件对齐和Section对齐的数据分别是:

5. Section Alignment : 1000h

6. File Alignment : 200h

l         那么新增加的Section必须与最后一个Section的边界对齐。它的数据分别:

1. Virtual offset : 3D000h (因为最后一个Section的最后边界是34000h + 8E00h = 3CE00h,加上Section对齐,则Virtual offset的值为3D000h)。

2. Virtual size : 200h。

3. Raw offset: 00034500h。

4. Raw size: 200h.

5. Characteristics : E0000060 (可读、可写、可执行)。

l         最后,只需要修改一下PE头内的SizeOfCode和SizeOfInitialishedData两个字段,分别加上200h。

l         剩下的就是按照方法一的方式把代码放入即可。

三、        增加执行文件的输入表项目。

在一些特殊用途上,我们需要为执行文件或DLL增加其不包含的API。那么可以通过增加这些API在输入表中的注册来达到。

1. 每一个输入的DLL都有一个IMAGE_IMPORT_DESCRIPTOR (IID)与之对应。PE头中的最后一个IID是以全0来表示整个IID数组的结束。

2. 每一个IID至少需要两个字段Name1和FirstThunk。其他字段都可以设置为0。

3. 每一个FirstThunk的数据必须是一个指向IMAGE_THUNK_DATA数组的RVA。每一个IMAGE_THUNK_DATA又包含了指向一个API名称的RVA。

4. 如果IID数组发生改变,那么只需要修改数据目录数组中对应输入表的数据结构IMAGE_DATA_DIRECTORY的iSize。

增加一个新的IID到输入表的末尾,就是把输入表末尾的全是0的IID修改成增加的新的IID,然后在增加一个全0的IID作为输入表新的末尾。但是如果在输入表末尾没有空间的话,那就需要拷贝整个输入表到一个新的足够的空间,同时修改数据目录数组对应输入表的数据结构IMAGE_DATA_DIRECTORY的RVA和iSize。

步骤一、增加一个新的IID。

把整个IID数组移到一个有足够空间来增加一个新的IID的地方。这个地方可以是.idata段的末尾或是新增一个Section来存放。

修改数据目录数组对应输入表的数据结构IMAGE_DATA_DIRECTORY的RVA和iSize。

如果必要,将存放新IID数组的Section大小按照Section Alignment向上取整(比如,原来大小是1500h, 而section Alignment为1000h,则调整为2000h)以便于整个段可以被映射到内存。

运行移动过IID数组的执行文件,如果正常的话,则进行第二步骤。如果不工作的话,需要检查新增的IID是否已经被映射到内存及IID数组新的偏移位置是否正确。

步骤二、增加一个新的DLL及其需要的函数。

在.idata节内增加两个以null结尾的字符串,一个用来存放新增的DLL的名字。 一个用来存放需要导入的API的名称。这个字符串前需要增加一个为null的WORD字段来构成一个 Image_Import_By_Name数据结构。

计算这个新增的DLL名称字符串的RVA.

把这个RVA赋予新增的IID的Name1字段。

再找到一个DWORD的空间,来存放Image_Import_by_name的RVA。这个RVA就是新增DLL的IAT表。

计算上面DWORD空间的RVA,将其赋予新增IID的FirstThunk字段。

运行修改完的程序。

既然他们的方法效果都不太好

那这样

机器狗及其变种造成userinit.exe异常的解决方案

http://www.antidu.cn/html/3/2008/1/antidu_200814163642.html

解决方法:

Userinit.exe修复工具

http://bbs.antidu.cn/thread-3602-1-1.html

机器狗病毒Userinit.exe免疫程序

http://www.antidu.cn/html/8/2007/11/antidu_20071130203704.html

系统有了免疫程序 就永远不会中Userinit.exe了

不掘雀虚一定是误报 有些病毒可以自行修改

同一个简单的添加一样,Win32/Funlove.4099这种病毒将它的代码复制到宿主文件的最后一个扇区的结尾,然后,它修改PE文件头信息以显示新的扇区大小,使扇区的特征适应病判燃毒的需要,同时病毒修改原文件入口点的程序代码以便执行病毒代码。

当一个染毒程序被运行,病毒代码程序获得系统控制权,Win32/Funlove.4099 病毒在系统目录下创建FLCSS.EXE文件,并从染毒宿主文件的岁凯最后提取出病毒代码,将其写入该文件中,然后FLCSS.EXE被执行

你最好还是检查清楚以免遗漏

如何取得Win7文件的管理员权限? 从Vista系统开始,微软为了提供系统安全性,开始强调对于Windows文件的所有权,以及程序运行时的用户权限,限制程序对系统重要文件的 篡改。不过这样也给我们平时使用带来了一些问题,同样WIndows7也有权限问题。当我们发现某些文件无法修改时,我们就需要取得这个文件的管理员 所有权,取得之后,我们就可以随心所欲的去修改它了。 我们要介绍的技巧就是如何取得某一个文件或文件夹的所有权: 方法一:为Windows7的右键菜单添加取得所有权的菜单:具体实现的方法不难,将以下内容另存为文本文件,然后修改该文件的扩展名为.reg ,双击导入注册表斗毕即可。Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*shellrunas] @="管理员取得所有权" "NoWorkingDirectory"="" [HKEY_CLASSES_ROOT*shellrunascommand] @="cmd.exe /c takeown /f "%1" &&icacls "%1" /grant administrators:F" "IsolatedCommand"="cmd.exe /c takeown /f "%1" &&icacls "%1" /grant administrators:F" [HKEY_CLASSES_ROOTexefileshellrunas2] @="管理员取得所有权" "NoWorkingDirectory"="" [HKEY_CLASSES_ROOTexefileshellrunas2command] @="cmd.exe /c takeown /f "%1" &&icacls "%1" /grant administrators:F" "IsolatedCommand"="cmd.exe /c takeown /f "%1" &&icacls "%1" /grant administrators:F" [HKEY_CLASSES_ROOTDirectoryshellrunas] @="管理员取得所有权" "NoWorkingDirectory"="" [HKEY_CLASSES_ROOTDirectoryshellrunascommand] @="cmd.exe /c takeown /f "空袭芹%1" /r /d y &&icacls "%1" /grant administrators:F /t" "IsolatedCommand"="cmd.exe /c takeown /f "%1" /r /d y &&icacls "%1" /grant administrators:F /t" 方法二:利用专业的优化工具,设置右键菜单。 这里说的优化工具有很多种,一般支持WindowsVista的优化工具,都能用来优化WIndows7,比如Vista优化大师(进入下载),Vista总管(进入 下载)等,当然那些专门设计给Windows7的优化软件也禅桥可以达到一样的效果,比如Windows7优化大师(进入下载)、Windows7总管等等。这些工具中的系统设置中,右键设置都有 添加获得管理员权限的功能,这里就不详细说明了,大家自己找一下即可。管理员权限带来的强大功能 1、注册表访问: 说明:在非SYSTEM权限下,用户是不能访问某些注册表项的,比如“HKEY_LOCAL_MACHINESAM”、“HKEY_LOCAL_MACHINESECURITY”等。这些项记录的是系统的核心数据,但某些病毒或者木马经常光顾这里。比如在SAM项目下建立具有管理员权限的隐藏账户,在默认情况下管理员通过在命令行下敲入“net user”或者在“本地用户和组”(lusrmgr.msc)中是无法看到的,给系统造成了很大的隐患。在“SYSTEM”权限下,注册表的访问就没有任何障碍,一切黑手都暴露无遗! *** 作:打开注册表管理器,尝试访问HKEY_LOCAL_MACHINESAM和HKEY_LOCAL_MACHINESECURITY,现在应该可以无限制访问了。 2、访问系统还原文件: 说明:系统还原是windows系统的一种自我保护措施,它在每个根目录下建立“System Colume Information”文件夹,保存一些系统信息以备系统恢复是使用。如果你不想使用“系统还原”,或者想删除其下的某些文件,这个文件夹具有隐藏、系统属性,非SYSTEM权限是无法删除的。如果以SYSTEM权限登录你就可以任意删除了,甚至你可以在它下面建立文件,达到保护隐私的作用。 *** 作:在资源管理器中点击“工具→文件夹选项”,在d出的“文件夹选项”窗口中切换到“查看”标签,在“高级设置”列表中撤消“隐藏受保护的 *** 作系统(推荐)”复选框,然后将“隐藏文件和文件夹”选择“显示所有文件和文件夹”项。然后就可以无限制访问系统还原的工作目录C:System Volume Information了。 3、更换系统文件: 说明:Windows系统为系统文件做了保护机制,一般情况下你是不可能更换系统文件的,因为系统中都有系统文件的备份,它存在于c:WINDOWSsystem32dllcache(假设你的系统装在C盘)。当你更换了系统文件后,系统自动就会从这个目录中恢复相应的系统文件。当目录中没有相应的系统文件的时候会d出提示(图8),让你插入安装盘。在实际应用中如果有时你需要Diy自己的系统修改一些系统文件,或者用高版本的系统文件更换低版本的系统文件,让系统功能提升。比如Window XP系统只支持一个用户远程登录,如果你要让它支持多用户的远程登录。要用Windows 2003的远程登录文件替换Window XP的相应文件。这在非SYSTEM权限下很难实现,但是在SYSTEM权限下就可以很容易实现。 *** 作:从Windows 2003的系统中提取termsrv.dll文件,然后用该文件替换Windows XP的C:WINDOWSsystem32下的同名文件。(对于Windows XP SP2还必须替换C:WINDOWS$NtServicePackUninstall$和C:WINDOWSServicePackFilesi386目录下的同名文件)。再进行相应的系统设置即可让Windows XP支持多用户远程登录。 4、手工杀毒: 说明:用户在使用电脑的过程中一般都是用Administrator或者其它的管理员用户登录的,中毒或者中马后,病毒、木马大都是以管理员权限运行的。我们在系统中毒后一般都是用杀毒软件来杀毒,如果你的杀软瘫痪了,或者杀毒软件只能查出来,但无法清除,这时候就只能赤膊上阵,手工杀毒了。在Adinistrator权限下,如果手工查杀对于有些病毒无能为力,一般要启动到安全模式下,有时就算到了安全模式下也无法清除干净。如果以SYSTEM权限登录,查杀病毒就容易得多。 *** 作:(以一次手工杀毒为例,我为了截图在虚拟机上模拟了前段时间的一次手工杀毒。)打“Windows 任务管理器”,发现有个可疑进程“86a01.exe”,在Administrator管理员下无法结束进程(图9),当然更无法删除在系统目录下的病毒原文件“86a01.exe”。以System权限登录系统,进程被顺利结束,然后删除病毒原文件,清除注册表中的相关选项,病毒被彻底清理出系统。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12204861.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存