C/C++ 动态与静态内存补丁

现动态内存补丁(读取): 这种补丁是把程序加载到内存中以后对其进行修改,常用于加壳程序的破解.

#include <stdio.h>
#include <Windows.h>

BYTE * ReadMemory(char * FileName,DWORD dwVAddress, int Size)
{
	BYTE bCode = 0;
	BYTE *buffer = new BYTE[Size];
	STARTUPINFO si = { 0 };
	si.cb = sizeof(STARTUPINFO);
	si.wShowWindow = SW_SHOW;
	si.dwFlags = STARTF_USESHOWWINDOW;
	PROCESS_INFORMATION pi = { 0 };

	BOOL bRet = CreateProcess(FileName, 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi);
	if (bRet == FALSE)
		exit(0);

	for (int x = 0; x < 10; x++)
	{
		ReadProcessMemory(pi.hProcess, (LPVOID)dwVAddress, (LPVOID)&bCode, sizeof(BYTE), 0);
		buffer[x] = bCode;
		dwVAddress++;
	}
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
	return buffer;
}

动态写入内存补丁:


#include <stdio.h>
#include <Windows.h>

BOOL WriteMemory(char * FileName, DWORD dwVAddress, unsigned char *ShellCode, int Size)
{
	BYTE *Buff = new BYTE[Size];
	STARTUPINFO si = { 0 };
	si.cb = sizeof(STARTUPINFO);
	si.wShowWindow = SW_SHOW;
	si.dwFlags = STARTF_USESHOWWINDOW;
	PROCESS_INFORMATION pi = { 0 };
	memset(Buff, *ShellCode, Size);

	// 创建子线程并默认暂停
	BOOL bRet = CreateProcess(FileName, 0, 0, 0, 0, CREATE_SUSPENDED, 0, 0, &si, &pi);
	if (bRet == FALSE)
		exit(0);

	BOOL Ret = WriteProcessMemory(pi.hProcess, (LPVOID)dwVAddress, Buff, Size, 0);
	ResumeThread(pi.hThread);
	CloseHandle(pi.hThread);
	CloseHandle(pi.hProcess);
	return TRUE;
}

多次对内存进行修正 可以在上面代码基础上进行改进,这里我就不发出来了。

int main(int argc, char * argv[])
{
	PROCESS_INFORMATION pi = OpenExeFile("c://main.exe");
	BYTE *recv_buffer = ReadMemory(pi, 0x401000, 10);
	for (int x = 0; x < 10; x++)
		printf("%x ", recv_buffer[x]);
	printf("\n");

	BYTE cmp_code[] = { 0x33,0xc0,0xc2,0x90,0xc3 };
	int ret = CheckMemory(pi, 0x401000, cmp_code, 5);
	printf("返回值: %d \n", ret);

	unsigned char set_buffer[] = { 0x90, 0x90, 0x90 };
	WriteMemory(pi, 0x401000, set_buffer, 3);

	unsigned char set_buffer1[] = { 0x90, 0x90, 0x90 };
	WriteMemory(pi, 0x402000, set_buffer1, 3);


	system("pause");
	return 0;
}
posted @   lyshark  阅读(993)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-06-11 C/C++ 匿名管道反弹CMDShell
2018-06-11 C/C++ 实现正向CMDShell

8952065 | 6896846
博客园 - 开发者的网上家园

点击右上角即可分享
微信分享提示