上一个内容:33.获取入口点
以 33.获取入口点 它的代码为基础进行修改
实现的功能是把LoadLibrary函数注入到目标进程实现加载我们的模块。LoadLibrary只有有程序使用过了它的代码就会加载到内存中(因为动态链接库是内存加载)就是a程序要用LoadLibrary然后b程序不用这时LoadLibrary在操作系统中是已经存在了,如果b程序也要用LoadLibrary只是对LoadLibrary做了一个映射不是再往内存里放一遍(为了节约内存)所以LoadLibrary函数的地址是固定的在不同程序里都是固定的,然后就可以获取LoadLibrary函数地址把地址放到目标进程中然后把我们的动态链接库磁盘位置的字符串也写进去就可以了
新建模块项目:
新建的项目步骤:
首先右击解决方案选择下图红框选项
然后选择MFC动态链接库
随便写个项目名称:然后点创建
然后根据下图进行选择然后点确定按钮
创建完项目在它的初始化代码中添加下图代码:
CWinApp::InitInstance();
AfxMessageBox(L"注入成功!");
然后回到之前注入的项目:·新加类
新加的类,这个类封装注入游戏、打开游戏等相关函数
INJCET.h文件代码
#pragma once
class INJCET
{
public:
BOOL StartProcess(
const wchar_t * GameExe,
const wchar_t * GamePath,
wchar_t * GameCmds,
PROCESS_INFORMATION* LPinfo
);
void* ImageLoad(const wchar_t* filename);
void UnloadImage(void* _data);
DWORD GetEntryPoint(const wchar_t* filename);
public:
BOOL CreateRemoteData(HANDLE hProcess);
};
INJCET.cpp文件代码:
#include "pch.h"
#include "INJCET.h"
#include <fstream>
void _stdcall INJECTCode() {
LoadLibrary(L"F:\\代码存放地\\c\\GAMEHACKER2\\x64\\Debug\\Dlls.dll");
}
BOOL INJCET::StartProcess(const wchar_t* GameExe, const wchar_t* GamePath, wchar_t* GameCmds, PROCESS_INFORMATION* LPinfo)
{
// 用来指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。
STARTUPINFO si{};
si.cb = sizeof(si);
CreateProcess(GameExe,
GameCmds,
NULL, NULL,
FALSE,
// 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。
CREATE_SUSPENDED,
NULL,
GamePath,
&si,
LPinfo
);
return TRUE;
}
void* INJCET::ImageLoad(const wchar_t* filename) {
std::ifstream streamReader(filename, std::ios::binary);
streamReader.seekg(0, std::ios::end);
unsigned filesize = streamReader.tellg();
char* _data = new char[filesize];
streamReader.seekg(0, std::ios::beg);
streamReader.read(_data, filesize);
streamReader.close();
return _data;
}
void INJCET::UnloadImage(void* _data) {
delete[] _data;
}
DWORD INJCET::GetEntryPoint(const wchar_t* filename)
{
// 方式二(要在32位环境下运行根据游戏版本选择运行32还是64位的程序)
void* image = ImageLoad(filename);
IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)image;
unsigned PEAddress = dosHeader->e_lfanew + (unsigned)image;
IMAGE_NT_HEADERS* ntHeader = (IMAGE_NT_HEADERS*)PEAddress;
DWORD dEntryPoint = ntHeader->OptionalHeader.AddressOfEntryPoint;
CString wTxt;
wTxt.Format(L"%X", dEntryPoint);
AfxMessageBox(wTxt);
UnloadImage(image);
return dEntryPoint;
}
BOOL INJCET::CreateRemoteData(HANDLE hProcess)
{
LPVOID adrRemote = VirtualAllocEx(hProcess, 0, 0x3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
SIZE_T lwt;
WriteProcessMemory(hProcess, adrRemote, INJECTCode, 0x200, &lwt);
return TRUE;
}
调用的地方
变量声明的地方
到这,当前程序是无法成功注入的,成功的代码写在后面