向节表空白区添加代码。

菜鸟一只,最近一直在学PE,刚学的往节表空白区添加代码,就想水个贴,然后算是总结一下,大牛就别看了,太菜……

    用的软件是WinHex,OD,Petools,跟vs2013,感染的软件是本地的记事本notepad.exe

    这是很简单的一个感染,在打开程序之前加上弹窗。先执行我们的弹窗,之后再执行软件自身的代码。

     步骤如下:   

1、获取MessageBox地址,构造ShellCode代码.
2、E8 E9计算公式
3、在代码区手动添加代码
4、修改OEP,指向ShellCode.

    1,用OD随便打开一个软件,BP MessageBoxA,去断点窗口,查看MessageBox的地址,我的地址是77d507ea ,而MessageBox需要四个参数,在反汇编窗口可以看到它的硬编码为6A 00 6A 00 6A 00 6A 00 E8 Address;

    2,E8 ,E9 是硬编码的 Call 和JMP,程序在硬盘中存储的方式。这是我写的一个获取这两个硬编码的测试代码:

 
  
1
2
3
4
5
6
7
8
9
10
11
< input type = " checkbox " > #include
void Function ( ) {
printf ( " 123 " ) ;
} ; //E9D505
     0000
int main ( ) {
Function ( ) ; //E8A8FDFFFF
return 0 ;
}

但是这个地方E8 之后的地址并不是准确的跳转地址,含有一定的计算关系,计算公式为:

X = 想要跳转的地址 - E8运行时的地址+5;

    3,这个时候就可以用WinHex在代码区的空白处添加代码。  首先用PEtools打开notepad,查看第一个节表的信息,跟SectionAlignment和FileAlignment的大小(因为最后改的代码的地址必须是ImageBuffer的时候的地址,所以一定要看文件对齐跟内存对齐),找到第一个节表也就是代码区节表的信息找到VirtualSize跟PointerTORawData来确定代码区的尾部,看下代码区剩余的空间大小是不是可以添加我们的代码。

    准备工作做完可以开始添加代码,根据第一步构造的ShellCode 我们添加的代码的格式为:

6A 00 6A 00 6A 00 6A 00 E8 __ __ __ __  E9 __ __  __ __空白处是需要我们计算的地址 E9的原因是返回原始的OEP 不能影响程序本来的执行顺序。

    现在开始计算地址,因为需要在的是运行状态的达到我们感染的目的,所以地址必须是按照运行状态的计算,首先计算E8 之后的Address  而这个时候E8的地址是需要计算出程序在ImageBuffer中的地址:  

计算方式为:   E8运行状态的地址 =  E8此时地址+ImageBase + SectionAlignment-FileAlignment

之后根据公式 X = 想要跳转的地址 - E8的地址+5;

计算出来 在我的电脑上是76 D4 80 8D

既E8 8D 80 D4 76。现在再计算E9 以后的地址,同样是根据公式   X = 想要跳转的地址 - E8的地址+5;

为  E9运行状态的地址 =  E9此时地址+ImageBase + SectionAlignment-FileAlignment

此时的X就是 X= 原始的OEP - E9运行时的地址+5这个地方的目的是执行完之后调到原始OEP



这是我的计算完成添加之后的样子。

4,修改OEP让程序从我们改过的地方开始运行  通过PEtools查找可以看到是739D

 向节表空白区添加代码。_第1张图片


然后用WinHex修改程序的入口点 既为第一个6A的地址


  7B50+(SectionAIignment-FileAlignment)= 8750

在可选PE头部找到73 9D 改成 

向节表空白区添加代码。_第2张图片

保存文件,大功告成。打开文件实验一下

向节表空白区添加代码。_第3张图片向节表空白区添加代码。_第4张图片

 

 

 

正常运行,并且会先运行我们添加的代码,点击确定之后可以功能使用正常。

嘿嘿,比较简单,算是水一贴,刚开始学,算是找个存储空间……如果有哪个地方不对,欢迎挑错~~~

你可能感兴趣的:(PE)