如何在程序执行前插入可执行代码(算是吾爱的作业吧,活学活用)

0x01准备(爱盘可以下载)

1.OD
2.stud_PE

0x02 给程序增加一个为xxx的区段

也可以在程序空着的地方添加程序不过这种情况较少,当然也会碰到程序不给添加区段。拖入PEID,原来是准备别的软件进行添加代码的但是防护太强,没成功,之后右击new session添加区段,将虚拟大小和大小写为1000(大了没事,代码够就行),选择空字段填充,确定

在这里插入图片描述

0x03 将需要执行的函数导入注册表

在程序执行前插入可执行代码,c语言使用函数的时候是通过库调用的,我们这里是汇编语言插入代码,所以也是和C语言类似,也是调用c语言的库实现的,下面开始导入库我原来在想插入什么代码好呢,那么就执行一个弹出cmd吧
在这里插入图片描述
cmd需要一个叫WinExec函数来执行,该函数在kernel32.dll的链接库种,所以我们调用这个链接库
在这里插入图片描述
之后找到这个WinExec这个函数,引入它
在这里插入图片描述在这里插入图片描述
这个就是我引入的函数,在最底下,因为之前试过一次所以有两个函数,不过没有关系,还有一点就是记住函数的RVA,马上我们需要用这个RVA来找到函数的VA
在这里插入图片描述

0x04 OD载入

在这里插入图片描述
因为我们需要在新添加的区段来写代码,所以首先找到这个区段在哪里,点击od上面一排的m按钮,双击xxx
在这里插入图片描述
选中复制区段地址
在这里插入图片描述
在反汇编窗口中ctrl+g查找区段
在这里插入图片描述
这就是我们刚刚添加区段的开头
在这里插入图片描述
我们直到刚刚引入了函数有个RVA,下面我们来找函数的VA。在左下角的窗口中ctrl+g查询RVA
在这里插入图片描述
找到了VA,记录下来
在这里插入图片描述
之后我们用汇编代码写这个执行的代码,也可以其他的比如病毒
在这里插入图片描述
这个WinExec函数传入两个参数,一个是5表示SW_SHOW,第二个是要执行的命令(这个可以看Win32API手册),汇编语言的参数可以直接push也可以push一个地址放参数,我们push第二个参数的时候,push的是一个地址(地址是004A502A,汇编语言就写为push 加地址),之后我们开始写函数,函数的写法为call [](中括号里面是VA),最后jmp跳回程序原来的入口,这个地址就在下面一点,与代码段同在xxx区段。左下角ctrl+g查询push的地址

双击要更改的地方,push 5, push 004A502A, call [004A60C1], jmp 004982B0(视具体情况而定)
在这里插入图片描述
转换成16位方便看清
在这里插入图片描述
之后更改
在这里插入图片描述
添加的参数就在代码段的下面
在这里插入图片描述
保存一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为我们添加的xxx区段不是程序的入口点,多以我们修改程序入口点
在这里插入图片描述
虚拟地址就是我们xxx区段的地址,之后将相对虚拟地址复制粘贴到入口点,那么入口点更改就完成了
在这里插入图片描述
最后运行原来的程序和修改过的程序对比一下
在这里插入图片描述
弹出了一个cmd的窗口
在这里插入图片描述

0x05 总结

向程序中添加代码的方式有很多,除了以上的方法还有dll注入和HOOK钩子,而且不一定是在程序的开头插入,结尾也可以,中间也可以,只是难度大一点。

原文地址:https://www.cnblogs.com/csnd/p/11800558.html