一次PE编辑的实操 - 弹出对话框
这篇博客相当于是个导论课了,就是啥也不会但是跟着做熟悉一下就行了
前置准备
这次实操的目的是给LordPE.exe在启动前弹出一个对话框
操作环节
添加区段
先把我们的LordPE.exe复制一份副本出来,等会就是对副本进行修改了
打开LordPE,点击PE编辑器
这里关注一下第二列第二个表格(所有表格内的数字都是16进制的) :区段(section)数目为0004
然后点击区段
可以看到有4行:.text .rdata .data .rsrc,对应了刚刚的区段数目为4
我们选中.rsrc,然后右键,点击添加区段
这样就新建了一个区段:.NewSec 00035000 00000000 00032400 00000000 E00000E0
其中:
- 00035000:映射入内存后的虚拟地址
- 00000000:映射入内存后的虚拟地址长度
- 00032400:在文件中的位置
- 00000000:在文件中的长度
- E00000E0:区段属性
我们选中.NewSec,右键点击编辑区段
把虚拟大小改成1000,物理大小改成200
再点击这里
然后把这三项取消勾选,再点击确定
我们发现E00000E0变成了60000020
叉掉上面几个窗口,在这里点保存
同时我们注意到现在区段数目变成了5
现在看看我们的副本文件
在我们进行修改后,这两个文件依然都是201kb,没有大小的变化
现在我们关掉LordPE,双击副本文件
在我们添加了.NewSec节后,文件无法正常运行了
这是因为刚刚我们新增的节在文件中对应的位置是00032400,并且长度为200,但是我们并没有把这200给他。
即:当一个可执行文件有相应的节而没有对应的文件时,windows一般不能加载运行该可执行文件
插入数据
打开C32ASM,把副本文件拖进去,选择16进制模式
拉到最底端
可以看到最后一行的最左边是000323F0,这一行有16位,那么最后一个数(00)就是000323FF
000323FF + 1 = 00032400,而这个数是我们刚刚新增的.NewSec在文件中的位置
- 00032400:在文件中的位置
但是这个.NewSec是没有对应文件的,所以文件到000323FF就停止了,现在我们想要给他插入一些数据来充当这个节。
我们刚刚新增了200h的长度,换成10进制就是512
点击文件的末尾,然后点编辑 -> 插入数据,数据大小设为512,然后确定
下面出现了一堆00
然后保存文件(不用备份),再看看副本文件
大了整整1kb
然后双击这个副本文件,发现他可以正常运行了
我是win10环境下的,新版的windows可能改过PE文件加载过程,如果win版本较低的话这里可能双击仍然无法正常运行,这时可以用lordPE继续修改,把你的虚拟地址(我这里是00035000)加1000(修改后就是00036000,win10下他自动给我改好了)
修改汇编
把副本拖进Ollydbg,可以看到他的入口地址为00404340
也可以按alt + e,第一行的entry就是入口地址
这个地址就是虚拟地址,即入口地址,该程序执行的第一行指令就是push ecx
通过该图可以发现,镜像基址(Image Base) + 入口点(Entry Point) = 00400000 + 00004340 = 00404340 = 入口地址
我们这次的目的是在程序启动前弹出一个对话框,那么入口地址就得变成我们刚刚新增的.NewSec,然后再在.NewSec操作
关掉Ollydbg,打开LordPE,把入口点改成00035000(.NewSec的虚拟地址),保存
再扔进Ollydbg
发现程序入口已经被我们成功更改了
我们尝试打开副本文件,发现不会报错,但是程序会闪退
现在我们在Ollydbg内进行修改
在Hex窗口按ctrl + G跳转到00435020,选中16个00,按空格,在ASCII里面键入一个Hello World!!
再在00435030写个Hello
发现很多东西都改变了
实际上这些汇编代码完全没用,它只是机械地把左侧的数字当做机器码翻译为汇编了,实际上通过Hex窗口我们可以发现这些16进制的数字其实代表的是字符串而非代码
然后我们开始从00435000写如下汇编代码
push 0
push 435020
push 435030
push 0
call MessageBoxA
现在按F8单步执行,直到执行了call指令
好好好!
现在继续执行他会报错,毕竟下面还有一串0000
选中我们刚刚修改的数据,右键 -> copy to excutable -> selection(复制到可执行文件 -> 选择)
注意是左边那个绿字的窗口,右键save file,直接将原来的副本覆盖
现在关闭OD,点副本文件
好好好!(但是LordPE文件本体却没有执行)
这时我们可以用c32asm打开副本和副本.bak,跳转到34000对比一下(OD刚刚修改前自己会备份一个)
现在我们进行最后一步:让副本文件执行LordPE的本体
继续扔进OD,直接在call MessageBoxA后的nop处进行修改:jmp 00404340
00404340这个地址就是最初的入口地址(不记得的话往上翻翻吧)
单步执行,可以发现执行完jmp后他跳转到了LordPE本体的入口
按减号回到上一步代码的位置,然后选中jmp这一行,右键复制到可执行文件,然后再保存
现在关掉OD,运行副本,可以发现他弹出对话框后成功地运行了LordPE本体!
总结
这次操作就是通过修改PE文件结构的各个属性给软件启动前加了个弹框
这种应用有很多实际意义,比如
- 病毒技术,反病毒技术,反反病毒(免杀)技术
- 软件保护技术,如加壳、脱壳技术
如果我们刚刚在本体前加的不是弹对话框,而是其他的一些文件操作函数,比如遍历磁盘并删除文件,这就是一款病毒了
对于反病毒技术,如何分离病毒代码与宿主程序,或者修复被破坏的程序,这也需要用到PE文件结构的知识
感觉这部分知识还是挺多的,希望2天内能搞定PE文件吧呜呜呜