滴水逆向通过程序向PE空白部分添加代码

#include<Windows.h>
#include<iostream>
using namespace std;
//可以通过printf("%p",Messagebox);获得Messagebox地址
int MessageboxAddress = 0x767BACF0;
char insertcode[] = {
0x6A,0x00,
0x6A,0x00,
0x6A,0x00,
0x6A,0x00,
0xE8,0x00,0x00,0x00,0x00,
0xE9,0x00,0x00,0x00,0x00
};
int len(FILE* pfile)
{
	fseek(pfile, 0, SEEK_END);
	int result = ftell(pfile);
	rewind(pfile);
	return result;
}
int main()
{
	FILE* pfile = fopen("C://Users//52511//Desktop//fg.exe", "rb");
	FILE* filebuffer1 = fopen("C://Users//52511//Desktop//fg1.exe", "wb");
	int length = len(pfile);
	char* buffer = NULL;
	buffer = (char*)malloc(sizeof(char) * length);
	memset(buffer, 0, length);
	fread(buffer, 1, length, pfile);
	PIMAGE_DOS_HEADER pdos= (PIMAGE_DOS_HEADER)buffer;
	PIMAGE_NT_HEADERS pnt = (PIMAGE_NT_HEADERS)(buffer + pdos->e_lfanew);
	PIMAGE_FILE_HEADER pf = (PIMAGE_FILE_HEADER)(buffer + pdos->e_lfanew + 4);
	PIMAGE_OPTIONAL_HEADER pot = (PIMAGE_OPTIONAL_HEADER)(buffer + pdos->e_lfanew + 4+20);
	PIMAGE_SECTION_HEADER psec = (PIMAGE_SECTION_HEADER)(buffer + pdos->e_lfanew + 4 + 20 + pf->SizeOfOptionalHeader);
	int useful = psec[0].SizeOfRawData - psec[0].Misc.VirtualSize;
	if (useful < 18)
	{
		cout << "error" << endl;
		free(buffer);
		free(pfile);
		exit(0);
	}
	char* code_begin = buffer + psec[0].PointerToRawData + psec[0].Misc.VirtualSize;
	memcpy(code_begin, insertcode, 18);
	//计算call的地址并写入
	DWORD calladder = MessageboxAddress - (pot->ImageBase + (DWORD)(code_begin + 8 + 5) - (DWORD)buffer);
	*(PDWORD)(code_begin + 0x09) = calladder;
	//计算jmp的地址并写入
	DWORD jmpadder = pot->ImageBase + pot->AddressOfEntryPoint - (pot->ImageBase + (DWORD)code_begin + 18 - (DWORD)buffer);
	*(PDWORD)(code_begin + 0x0E) = jmpadder;
	//改oep
	pot->AddressOfEntryPoint = (DWORD)code_begin  - (DWORD)buffer;
	fwrite(buffer, 1, length, filebuffer1);
	free(filebuffer1);
	free(buffer);
	free(pfile);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力不当无业游民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值