往其他进程写入代码

获取进程handle

这里我写了三个子函数,原理一摸一样,只是方便调用

DWORD GetProcessIdByName(WCHAR* FileName) {
	if (!FileName) {
		return 0;
	}
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	if (INVALID_HANDLE_VALUE == hSnapShot) {
		return 0;
	}
	PROCESSENTRY32 p32;
	p32.dwSize = sizeof(p32);
	DWORD ProcessId = 0;
	Process32First(hSnapShot, &p32);
	do {
		if (!wcscmp(p32.szExeFile, FileName)) {
			ProcessId = p32.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &p32));
	CloseHandle(hSnapShot);
	return ProcessId;
}
HANDLE GetProcessHandleById(DWORD ProcessId) {
	if (!ProcessId) {
		return 0;
	}
	return OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
}
HANDLE GetProcessHandleByName(WCHAR* FileName) {
	return GetProcessHandleById(GetProcessIdByName(FileName));
}

主程序

怎么写

因为我们要往其他进程写入代码,一些全局变量,字符串,函数调用都不能直接使用,因为里面都是属于我这个进程的地址位置,所以我们需要创建结构体
当然我这里结构体的变量是函数所有的参数,但对于数字这种就可以不用添加

首先定义一个函数指针

把我们需要使用的系统api包装起来
因为对于dll的导出函数,dll在系统里面只存在一份,而且装载默认装载到他要求的函数,只是他会在不同进程里都映射一份。最后的函数地址都是一样的,所以这些函数我们是可以使用的

typedef HANDLE (WINAPI*lpCreateFileA)(
	_In_ LPCSTR lpFileName,
	_In_ DWORD dwDesiredAccess,
	_In_ DWORD dwShareMode,
	_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	_In_ DWORD dwCreationDisposition,
	_In_ DWORD dwFlagsAndAttributes,
	_In_opt_ HANDLE hTemplateFile
);

构造结构体

只是比函数多了个地址

struct Payload {
	lpCreateFileA lpCreateFile;
	LPCSTR lpFileName;
	DWORD dwDesiredAccess;
	DWORD dwShareMode;
	LPSECURITY_ATTRIBUTES lpSecurityAttributes;
	DWORD dwCreationDispostion;
	DWORD dwFlagsAndAttributes;
	HANDLE hTemplateFile;
};

编写回调函数

可以看到,我们用的都是传过来的参数,所以不涉及地址问题

DWORD WINAPI ThreadProc(LPVOID lpParameter) {
	Payload* p = (Payload*)lpParameter;
	p->lpCreateFile(p->lpFileName, p->dwDesiredAccess, p->dwShareMode, p->lpSecurityAttributes, p->dwCreationDispostion, p->dwFlagsAndAttributes, p->hTemplateFile);
	return 0;
}
void i() {}
//这里这个函数是用来确定函数大小的

主函数

int main() {
	WCHAR EXE_NAME[] =L"1.exe";
	CHAR Create_file_name[] = "2.txt";
	HANDLE hProcess = GetProcessHandleByName(EXE_NAME);
	if (!hProcess) {
		return 0;
	}
	HMODULE hModule= GetModuleHandle(L"kernel32.dll");
	//分配给结构体
	LPVOID payloadStartAddress=VirtualAllocEx(hProcess, NULL, sizeof(Payload), MEM_COMMIT, PAGE_READWRITE);
	//分配给文件名
	LPVOID file_name_start_address= VirtualAllocEx(hProcess, NULL, sizeof(Create_file_name), MEM_COMMIT, PAGE_READWRITE);
	LPVOID Thread_proc_start_addres= VirtualAllocEx(hProcess, NULL, (char*)i - (char*)ThreadProc, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	Payload RemotePayload;
	RemotePayload.lpCreateFile = (lpCreateFileA)GetProcAddress(hModule, "CreateFileA");
	RemotePayload.lpFileName = (LPCSTR)file_name_start_address;
	RemotePayload.dwDesiredAccess = 0;
	RemotePayload.dwShareMode = 1;
	RemotePayload.lpSecurityAttributes = 0;
	RemotePayload.dwCreationDispostion = 2;
	RemotePayload.dwFlagsAndAttributes = 0x80;
	RemotePayload.hTemplateFile = NULL;
	WriteProcessMemory(hProcess, payloadStartAddress, &RemotePayload, sizeof(RemotePayload), NULL);
	WriteProcessMemory(hProcess, file_name_start_address, Create_file_name, sizeof(Create_file_name), NULL);
	WriteProcessMemory(hProcess, Thread_proc_start_addres, ThreadProc, (char *)i- (char *)ThreadProc, NULL);
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Thread_proc_start_addres,payloadStartAddress, 0, NULL);
	CloseHandle(hThread);
	CloseHandle(hProcess);
	CloseHandle(hModule);
	return 0;
}

//这里写完后可以调试一下,去系统函数的地址看看,因为有些函数因为编译器问题可能会有一个跳转过程,如果跳转到用户地址,那么就需要把整体的地址修改一下,我这里就直接是kernel内的函数,就不需要修改了

运行后可以看到桌面上有个txt文件

完整代码

#include<Windows.h>
#include<iostream>
#include<TlHelp32.h>
using  namespace std;
DWORD GetProcessIdByName(WCHAR* FileName) {
	if (!FileName) {
		return 0;
	}
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	if (INVALID_HANDLE_VALUE == hSnapShot) {
		return 0;
	}
	PROCESSENTRY32 p32;
	p32.dwSize = sizeof(p32);
	DWORD ProcessId = 0;
	Process32First(hSnapShot, &p32);
	do {
		if (!wcscmp(p32.szExeFile, FileName)) {
			ProcessId = p32.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &p32));
	CloseHandle(hSnapShot);
	return ProcessId;
}
HANDLE GetProcessHandleById(DWORD ProcessId) {
	if (!ProcessId) {
		return 0;
	}
	return OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
}
HANDLE GetProcessHandleByName(WCHAR* FileName) {
	return GetProcessHandleById(GetProcessIdByName(FileName));
}

typedef HANDLE (WINAPI*lpCreateFileA)(
	_In_ LPCSTR lpFileName,
	_In_ DWORD dwDesiredAccess,
	_In_ DWORD dwShareMode,
	_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	_In_ DWORD dwCreationDisposition,
	_In_ DWORD dwFlagsAndAttributes,
	_In_opt_ HANDLE hTemplateFile
);

struct Payload {
	lpCreateFileA lpCreateFile;
	LPCSTR lpFileName;
	DWORD dwDesiredAccess;
	DWORD dwShareMode;
	LPSECURITY_ATTRIBUTES lpSecurityAttributes;
	DWORD dwCreationDispostion;
	DWORD dwFlagsAndAttributes;
	HANDLE hTemplateFile;
};
DWORD WINAPI ThreadProc(LPVOID lpParameter) {
	Payload* p = (Payload*)lpParameter;
	p->lpCreateFile(p->lpFileName, p->dwDesiredAccess, p->dwShareMode, p->lpSecurityAttributes, p->dwCreationDispostion, p->dwFlagsAndAttributes, p->hTemplateFile);
	return 0;

}
void i() {}
int main() {
	WCHAR EXE_NAME[] =L"1.exe";
	CHAR Create_file_name[] = "2.txt";
	HANDLE hProcess = GetProcessHandleByName(EXE_NAME);
	if (!hProcess) {
		return 0;
	}
	HMODULE hModule= GetModuleHandle(L"kernel32.dll");
	//分配给结构体
	LPVOID payloadStartAddress=VirtualAllocEx(hProcess, NULL, sizeof(Payload), MEM_COMMIT, PAGE_READWRITE);
	//分配给文件名
	LPVOID file_name_start_address= VirtualAllocEx(hProcess, NULL, sizeof(Create_file_name), MEM_COMMIT, PAGE_READWRITE);
	LPVOID Thread_proc_start_addres= VirtualAllocEx(hProcess, NULL, (char*)i - (char*)ThreadProc, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	Payload RemotePayload;
	RemotePayload.lpCreateFile = (lpCreateFileA)GetProcAddress(hModule, "GetModuleHandle");
	RemotePayload.lpFileName = (LPCSTR)file_name_start_address;
	RemotePayload.dwDesiredAccess = 0;
	RemotePayload.dwShareMode = 1;
	RemotePayload.lpSecurityAttributes = 0;
	RemotePayload.dwCreationDispostion = 2;
	RemotePayload.dwFlagsAndAttributes = 0x80;
	RemotePayload.hTemplateFile = NULL;
	WriteProcessMemory(hProcess, payloadStartAddress, &RemotePayload, sizeof(RemotePayload), NULL);
	WriteProcessMemory(hProcess, file_name_start_address, Create_file_name, sizeof(Create_file_name), NULL);
	WriteProcessMemory(hProcess, Thread_proc_start_addres, ThreadProc, (char *)i- (char *)ThreadProc, NULL);
	HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)Thread_proc_start_addres,payloadStartAddress, 0, NULL);
	CloseHandle(hThread);
	CloseHandle(hProcess);
	CloseHandle(hModule);
	return 0;
}




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值