0%

手动向可执行程序添加代码

手动向可执行程序添加代码

前言

由于在xp之后采用了ASLR(随机地址加载)的方案,导致每次启动后,程序加载的地址都不一样,这里我从xp系统中把calc拷到了win10,还有一个是用了名为PETool的PE结构查看工具,为什么要选取它们两个来举例,因为calc的文件对齐和内存对其是不一样的,而PETool的文件对其和内存对齐是一样的。

准备工作

我们在实验的时候,往程序中添加一个弹框来作为效果演示,这里我们就需要得到MessageBox函数的地址,然后在程序中进行添加跳转。

这里我直接写了一个只含有MessageBox的程序来进行定位,直接下断点得到函数位置为77020C30 user32.MessageBoxA,这里需要明确一下,每一次重启后函数的位置是会发生变化的

得到函数地址后还需要明确,在函数调用之前,需要将其所需要的参数push进堆栈中,这里仅需要弹框,所以就push进四个0x00即可,push指令的硬编码是6A,所以需要添加的代码就变成了6A 00 6A 00 6A 00 6A 00

后面在调用MessageBox函数的时候,需要使用call指令,它的硬编码为E8;调用完以后需要跳回到原本的程序入口点,使用jmp指令,它的硬编码为E9.

calc

首先对后面需要的一些信息进行记录

1
2
3
4
5
6
7
AddressOfEntryPoint     12475h
ImageBase 1000000h
SectionAlignment 1000h
FileAlignment 200h

VirtualAddress 1000h
PointerToRawData 400h

我们将代码添加到.text节的后面,它本身就具有执行权限,不需要对权限进行更改

记录一下需要添加代码的位置12AB0h

接下来直接上计算公式

1
2
E8后边的值 = 真正要跳转的地址 - (E8当前指令的地址 + E8当前指令所占大小)
= 真正要跳转的地址 - E8当前指令的下一行地址

但是需要注意,下一行的地址是需要计算它在内存中的地址,所以可以计算得77020C30-(12ABD-400+1000+1000000)=7600D573‬‬

E9后面的值也是同样的计算方法1012475-(12AC2-400+1000+1000000)=FFFFEDB3‬‬

写入后为

接着该修改程序的入口地址了,将入口地址修改为我们添加代码的位置,这里还是需要计算内存中的地址的,但不需要加ImageBase,因为它本来就是偏移地址,12AB0-400+1000=136B0‬

到这里就完成了,保存后执行

弹窗后,成功弹出计算机

PETool

这个就更简单的,方法还是一样的方法,由于它的内存对齐和文件对齐是一致的,所以不需要进行转换了

记录信息

1
2
3
4
5
6
7
AddressOfEntryPoint     193BEh
ImageBase 400000h
SectionAlignment 1000h
FileAlignment 1000h

VirtualAddress 1000h
PointerToRawData 1000h

需要把代码插在1CAA0h

E8:77020C30-41CAAD=76C04183‬‬

E9:4193BE-41CAB2=FFFFC90C‬

修改后为

然后修改OEP,1CAA0

保存后执行

弹窗后,成功弹出程序