一次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文件结构的各个属性给软件启动前加了个弹框

这种应用有很多实际意义,比如

  1. 病毒技术,反病毒技术,反反病毒(免杀)技术
  2. 软件保护技术,如加壳、脱壳技术

如果我们刚刚在本体前加的不是弹对话框,而是其他的一些文件操作函数,比如遍历磁盘并删除文件,这就是一款病毒了

对于反病毒技术,如何分离病毒代码与宿主程序,或者修复被破坏的程序,这也需要用到PE文件结构的知识

感觉这部分知识还是挺多的,希望2天内能搞定PE文件吧呜呜呜

posted @ 2022-01-10 15:39  iPlayForSG  阅读(446)  评论(0编辑  收藏  举报