滴水逆向作业——PE向代码区添加messagebox的shellcode

本文介绍如何向PE文件的代码区添加messagebox的shellcode,详细阐述了从读取文件到内存,计算跳转地址,修改E8/E9指令,以及最后保存新文件的具体步骤。同时,提到了在不同阶段处理内存和地址转换的注意事项。
摘要由CSDN通过智能技术生成

摘要:向PE结构的代码区添加messagebox的shellcode,使打开exe文件时,先执行shellcode的内容,再执行本身的功能。

1.具体流程

在这里插入图片描述
流程如下:
先将.exe文件以文件模式(filebuffer)读取到内存中,再将其拉伸读取到另一段内存中内存模式(imagebuffer)但注意这可不是运行状态。判断代码区是否有存放shellcode代码的空间,如果有的话,将准备好的shellcode存入(关于shellcode中的操作下面会讲)。将内存模式(imagebuffer)再转化为另一个文件模式(newbuffer),最终存盘。

2.硬编码

调用一个程序时,对应的硬编码:

int main()
{
   
	function(); //调用function函数时对应的硬编码
	system("pause");
	return 0;
}

查看反汇编,可以看到:function(); 对应的硬编码E8 53 FE FF FF。功能:可能时跳到程序处。
在这里插入图片描述
F11单步进入,看到还有个JMP,对应的硬编码:E9 2B 2B 00 00。功能:可能时跳到function()下一句。
在这里插入图片描述

3.跳转地址

1.如下图,E8后的四个字节并不是要跳转的地址。
在这里插入图片描述
而是要满足公式:真正要跳转的地址 = E8这条指令的下一行地址 + X
也就是:要跳转的地方 = E8当前的地址 + 5 + X
计算结果如下,注意在memory中时小端模式存储,刚好对应E8后的3C31FFFF
在这里插入图片描述
2.同理,E9后的四个字节也是这么计算的。
在这里插入图片描述
要跳转的地方 = E9当前的地址 + 5 + X
在这里插入图片描述
结果为00 00 00 12。小端存储,E9后为12 00 00 00

代码如下:

#include "stdafx.h"
#include "string.h"
#include <malloc.h>
#include <windows.h>


#define lpszFile "D:\\Lib\\IPMSG2007.exe"
#define size_shellcode 0x12
#define messagebox_add 0x77630c30  
//#define file_path "D:\\Lib\\IPMSG2007.exe"
//#define write_file_path "D:\\Lib\\cp_IPMSG2007.exe"


BYTE shellcode[] = {
   
	0x6A,00,0x6A,00,0x6A,00,0x6A,00,
	0XE8,00,00,00,00,
	0XE9,00,00,00,00
};

char file_path[] = "D:\\Lib\\IPMSG2007.exe";
char write_file_path[] = "D:\\Lib\\cp_IPMSG2007.exe";

// exe->filebuffer  返回值为计算所得文件大小
int ReadPEFile(char* file_path,PVOID* pFileBuffer)
{
   
	FILE* pfile = NULL;  // 文件指针
	DWORD file_size = 0;
	LPVOID pTempFilebuffer = NULL;
	
	// 打开文件
	pfile = fopen(file_path,"rb");  // 如果有新的指针,就要进行判断
	if(!pfile)
	{
   
		printf("打开exe文件失败!\n");//如果分配失败就要关闭文件、释放动态内存、指针指向NULL
		return 0;
	}	
	// 读取文件大小
	fseek(pfile,0,SEEK_END);
	file_size = ftell(pfile);
	fseek(pfile,0,SEEK_SET);
	// 分配空间
	pTempFilebuffer = malloc(file_size);  // 如果有新的指针,就要进行判断
	if(!pTempFilebuffer)
	{
   
		printf("分配空间失败!\n");//如果分配失败就要关闭文件、释放动态内存、指针指向NULL
		fclose(pfile);
		return 0 ;
	}
	// 将数据读取到内存中
	size_t n = fread(pTempFilebuffer,file_size,1,pfile);
	if(!n)
	{
   
		printf("数据读取到内存中失败!\n"); //如果分配失败就要关闭文件、释放动态内存、指针指向NULL
		fclose(pfile);
		free(pTempFilebuffer);
		return 0 ;
	}
	// 关闭文件(已经读取到内存了)
	*pFileBuffer = pTempFilebuffer;
	pTempFilebuffer = NULL;
	fclose(pfile); 
	return file_size;
}

// filebuffer -> imagebuffer
DWORD CopyFileBufferToImageBuffer(PVOID pFileBuffer,PVOID* pImageBuffer)
{
   
	// 初始化PE头部结构体
	PIMAGE_DOS_HEADER pDosHeader = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值