上一内容: 33. 获取入口点
33、根据入口点获取代码修改代码。
实现的功能是向目标进程注入LoadLibrary函数来加载模块。 LoadLibrary仅在程序使用其代码时才加载到内存中(因为动态链接库是从内存加载的)。即程序a必须使用LoadLibrary,但此时程序b已经不存在了。对于程序b,您还可以通过简单地映射LoadLibrary而不是再次将其放入内存来修复另一个程序中的LoadLibrary函数的地址。获取LoadLibrary函数的地址,将该地址移动到目标进程,并在那里写入动态链接库的磁盘位置字符串。
创建一个新的模块项目。
新建项目步骤:
首先,右键单击解决方案,然后选择下图中红色框中的选项。
然后选择MFC动态链接库。
只需输入您的项目名称并单击“创建”。
然后根据下图进行选择并单击“确定”按钮。
创建项目后,在其初始化代码中添加以下代码:
CWinApp:InitInstance();
AfxMessageBox(L\’注入成功!\’);
然后返回到您之前插入的项目。 ·新班级
这个新添加的类封装了相关的功能,例如插入游戏、开始游戏等。
INJCET.h 文件代码
#PragmaOnce
注射类
{
公共:
BOOL 启动进程(
常量wchar_t *GameExe,
const wchar_t * 游戏通行证,
wchar_t *游戏命令,
PROCESS_INFORMATION* 有限合伙人信息
);
void* ImageLoad(const wchar_t* 文件名);
无效卸载图像(无效* _data);
DWORD GetEntryPoint(const wchar_t* 文件名);
公共:
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)
{
//用于指定窗口的工作站、桌面、标准句柄以及创建时进程主窗口的外观。
STARTUPINFOsi{};
si.cb=sizeof(si);
创建进程(GameExe,
游戏命令,
空,空,
错误,
//新进程的主线程创建时处于挂起状态,直到调用ResumeThread 函数后才会运行。
创建_暂停,
无效的,
游戏通行证,
C,
LP信息
);
返回真。
}
void* INJCET:ImageLoad(const wchar_t* 文件名) {
std:ifstream streamReader(文件名, std:ios: 二进制);
StreamReader.seekg(0, std:ios:end);
无符号文件大小=streamReader.tellg();
char* _data=new char[文件大小];
StreamReader.seekg(0, std:ios:beg);
StreamReader.read(_data, 文件大小);
StreamReader.close();
_返回数据;
}
无效INJCET:UnloadImage(void* _data) {
删除[]_数据;
}
DWORD INJCET:GetEntryPoint(const wchar_t* 文件名)
{
//方法二(32位环境下运行,根据游戏版本选择运行32位程序或64位程序)
void* Image=ImageLoad(文件名);
IMAGE_DOS_HEADER* dosHeader=(IMAGE_DOS_HEADER*)image;
无符号PEAddress=dosHeader-e_lfanew + (无符号)image;
IMAGE_NT_HEADERS* ntHeader=(IMAGE_NT_HEADERS*)PEAddress;
DWORD dEntryPoint=ntHeader-OptionalHeader.AddressOfEntryPoint;
CString wTxt;
wTxt.Format(L\’%X\’, dEntryPoint);
AfxMessageBox(wTxt);
卸载图像(image);
返回dEntryPoint。
}
BOOL INJCET:CreateRemoteData(HANDLE hProcess)
{
LPVOID adrRemote=VirtualAllocEx(hProcess, 0,0×3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
SIZE_T 重量;
WriteProcessMemory(hProcess, adrRemote, INJECTCode,0x200, lwt);
返回真。
}
去哪里打电话
变量声明的地方
此时,当前程序无法成功插入。成功的代码稍后再写。
以上关于#34 的信息仅用于构建核心注入代码。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91384.html