免责声明:内容仅供教育参考,合法使用知识,禁止从事违法犯罪活动。
如果您不明白或不知道自己在做什么,只需复制它并看看它是如何工作的。 如果你看不懂代码,这很正常。如果你能复制一下,复制一下你就会明白。
上一内容: 35.实现一个简单的远程数据框架
35.基于简单远程数据框架实现代码修改
通过远程线程获取游戏的首地址,并更改首地址处的代码,跳转到辅助函数。
首先关闭安全检测
添加RemoteThreadProce函数,修改CodeRemoteData、CreateRemoteData、OnNMDblclkList1函数,修改_REMOTE_DATA结构体。
CWndINJ.cpp:实现文件
#include \’pch.h\’
#include \’GAMEHACKER2.h\’
#include \’CWndINJ.h\’
#include \’afxdialogex.h\’
#include ImageHlp.h
#include fstream
#pragma comment(lib, \’ImageHlp.lib\’)
//void _stdcall INJECTCode() {
//AfxMessageBox(L\’aa\’);
//无符号地址=0xCCCCCCCC;
//PREMOTE_DATA p=(PREMOTE_DATA)地址;
//p-f_LoadLibrary(p-dllName);
//}
//CWndINJ 对话框
IMPLMENT_DYNAMIC(CWndINJ,CDialogEx)
CWndINJ:CWndINJ(CWnd* pParent /*=nullptr*/)
第:章
, B_INJCET(假)
,B_DEBUG(假)
, B_PAUSE(假)
{
}
CWndINJ:~CWndINJ()
{
}
BOOL CWndINJ:OnInitDialog()
{
CDialogEx:OnInitDialog();
LONG_PTR l 风格;
//获取窗口样式。 GWL_STYLE 包含在GetWindowLongPtr 的描述中
lStyle=GetWindowLongPtr(ExeLst.m_hWnd, GWL_STYLE);
lstyle |=LVS_REPORT;
SetWindowLongPtr(ExeLst.m_hWnd, GWL_STYLE, lStyle);
DWORD dStyle=ExeLst.GetExtendedStyle();
dStyle |=LVS_EX_FULLROWSELECT;
dStyle |=LVS_EX_GRIDLINES;
ExeLst.SetExtendedStyle(dStyle);
ExeLst.InsertColumn(0, L\’名称\’, 0, 200);
ExeLst.InsertColumn(1, L\’可执行文件\’, 0, 400);
ExeLst.InsertColumn(2, L\’文件夹\’, 0, 400);
ExeLst.InsertColumn(3, L\’命令行\’, 0, 400);
ExeLst.InsertColumn(4, L\’注入模块\’, 0, 400);
返回0。
}
无效CWndINJ:DoDataExchange(CDataExchange* pDX)
{
CDialogEx:DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, ExeLst);
DDX_Check(pDX, IDC_CHECK1, B_INJCET);
DDX_Check(pDX, IDC_CHECK2, B_DEBUG);
DDX_Check(pDX, IDC_CHECK3, B_PAUSE);
}
BEGIN_MESSAGE_MAP(CWndINJ,CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, CWndINJ:OnBnClickedButton1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, CWndINJ:OnNMDbcllkList1)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, CWndINJ:OnLvnItemchangedList1)
END_MESSAGE_MAP()
//CWndINJ 消息处理程序
无效CWndINJ:OnBnClickedButton1()
{
//TODO: 在此处添加控制通知处理程序代码
/*ExeLst.InsertItem(0, L\’DNF\’);
ExeLst.SetItemText(0, 1, L\’dlls.dll\’);*/
用于指定进程创建时的窗口站、桌面、标准句柄和主窗口的外观。
//STARTUPINFOsi{};
//si.cb=sizeof(si);
//PROCESS_INFORMATIONprinfo{};
//CreateProcess(L\’C:\\\\Users\\\\am\\\\Desktop\\\\易到云\\\\游戏保护\\\\训练游戏\\\\Elementary\\\\JX2\\\\Sword2.exe\’,
//空,空,空,
//错误,
////新进程的主线程在挂起状态下创建,直到调用ResumeThread 函数后才会运行。
//CREATE_SUSPENDED,
//无效的,
//L\’C:\\\\Users\\\\am\\\\Desktop\\\\一刀云\\\\游戏保护\\\\Training Games\\\\Elementary\\\\JX2\\\\\’,
//死亡,
//打印信息
//);
///**
//注入函数写在这里(CreateProcess和ResumeThread函数之间)
//*/
保持游戏运行
//恢复线程(prinfo.hThread);
wndAddGame.Init(this);
wndAddGame.DoModal();
}
无效CWndINJ:Init(CString _AppPath)
{
应用程序路径=_应用程序路径;
GameIni.Format(L\’%s\\\\config\\\\Games.ini\’, AppPath);
加载游戏();
}
void CWndINJ:AddGame(CString GameName, CString GamePath, CString GameFullPath, CString GameCmds, CString DllPath)
{
int count=GetPrivateProfileInt(L\’main\’, L\’count\’, 0, GameIni);
计数++;
CString 键。
key.Format(L\’count_%d\’, count);
WritePrivateProfileString(key, L\’GameName\’, GameName, GameIni);
WritePrivateProfileString(key, L\’GamePath\’, GamePath, GameIni);
WritePrivateProfileString(key, L\’GameFullPath\’, GameFullPath, GameIni);
WritePrivateProfileString(key, L\’GameCmds\’, GameCmds, GameIni);
WritePrivateProfileString(key, L\’DllPath\’, DllPath, GameIni);
CString wCount;
wCount.Format(L\’%d\’, 计数);
WritePrivateProfileString(L\’main\’, L\’count\’, wCount, GameIni);
int iCount=ExeLst.GetItemCount();
ExeLst.InsertItem(iCount, 游戏名称);
ExeLst.SetItemText(iCount, 1, GamePath);
ExeLst.SetItemText(iCount, 2, GameFullPath);
ExeLst.SetItemText(iCount, 3, GameCmds);
ExeLst.SetItemText(iCount, 4, DllPath);
}
无效CWndINJ:LoadGame()
{
int count=GetPrivateProfileInt(L\’main\’, L\’count\’, 0, GameIni);
for (int i=0; i 计数; i++) {
CString GameName、GameExe、GamePath、GameCmds、GameDlls、_AppName;
_AppName.Format(L\’count_%d\’, i+1);
wchar_t wRead[0xFF];
GetPrivateProfileString(_AppName, L\’游戏名称\’, L\’\’, wRead,0xFF, GameIni);
GameName.Format(L\’%s\’, wRead);
GetPrivateProfileString(_AppName, L\’GamePath\’, L\’\’, wRead,0xFF, GameIni);
GameExe.Format(L\’%s\’, wRead);
GetPrivateProfileString(_AppName, L\’GameFullPath\’, L\’\’, wRead,0xFF, GameIni);
GamePath.Format(L\’%s\’, wRead);
GetPrivateProfileString(_AppName, L\’GameCmds\’, L\’\’, wRead,0xFF, GameIni);
GameCmds.Format(L\’%s\’, wRead);
GetPrivateProfileString(_AppName, L\’DllPath\’, L\’\’, wRead,0xFF, GameIni);
GameDlls.Format(L\’%s\’, wRead);
ExeLst.InsertItem(i, 游戏名称);
ExeLst.SetItemText(i, 1, GameExe);
ExeLst.SetItemText(i, 2, 游戏路径);
ExeLst.SetItemText(i, 3, GameCmds);
ExeLst.SetItemText(i, 4, GameDlls);
}
}
void* _imageload(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();
_返回数据;
}
无效_unloadimage(无效* _data){
删除[]_数据;
}
无效CWndINJ:OnNMDblclkList1(NMHDR * pNMHDR,LRESULT * pResult)
{
LPNMITEMACTIVATE pNMItemActivate=reinterpret_castLPNMITEMACTIVATE(pNMHDR);
//TODO: 在此处添加控制通知处理程序代码
*p结果=0;
int索引=pNMItemActivate-iItem;
if (索引0)返回;
CString GamePath=ExeLst.GetItemText(index, 2);
CString GameExe=ExeLst.GetItemText(index, 1);
CString GameCmds=ExeLst.GetItemText(index, 3);
CString GameDlls=ExeLst.GetItemText(index, 4);
//用于指定窗口的工作站、桌面、标准句柄以及创建时进程主窗口的外观。
//STARTUPINFOsi{};
//si.cb=sizeof(si);
PROCESS_INFORMATION prinfo{};
m_INJCET.StartProcess(GameExe, GamePath, GameCmds.GetBuffer(), prinfo);
m_INJCET.CreateRemoteData(prinfo.hProcess, GameExe, L\’F:\\\\代码位置\\\\c\\\\GAMEHACKER2\\\\Release\\\\Dlls.dll\’);
//m_INJCET.CodeRemoteData(_data);
/**
创建进程(GameExe,
GameCmds.GetBuffer(),
空,空,
错误,
//新进程的主线程以挂起状态创建,直到调用ResumeThread 函数后才会运行。
创建_暂停,
无效的,
游戏通行证,
C,
普罗信息
);
*/
/** 方法1调用API
CStringA GameExeA;
GameExeA=GameExeA;
PLOADED_IMAGE 图像=ImageLoad(GameExeA, NULL);
DWORD dEntryPoint=图像-FileHeader-OptionalHeader.AddressOfEntryPoint;
CString wTxt;
wTxt.Format(L\’%X\’, dEntryPoint);
AfxMessageBox(wTxt);
图像卸载(图像)
*/
/** 方法2(32位环境下运行)
void* image=_imageload(GameExe.GetBuffer());
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);
*/
//LPVOID adrRemote=VirtualAllocEx(prinfo.hProcess, 0,0×3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//SIZE_T lwt;
//WriteProcessMemory(prinfo.hProcess, adrRemote, INJECTCode,0x200, lwt);
//CString wTxt;
//wTxt.Format(L\’%X\’, adrRemote);
//AfxMessageBox(wTxt);
//保持游戏运行
//m_INJCET.CreateRemoteData(prinfo.hProcess, GameDlls.GetBuffer());
//恢复线程(prinfo.hThread);
}
无效CWndINJ:OnLvnItemchangedList1(NMHDR * pNMHDR,LRESULT * pResult)
{
LPNMLISTVIEW pNMLV=reinterpret_castLPNMLISTVIEW(pNMHDR);
//TODO: 在此处添加控制通知处理程序代码
*p结果=0;
}
INJCET.cpp文件的代码:
#include \’pch.h\’
#include \’INJCET.h\’
#include fstream
void _stdcall INJECTCode() {
无符号地址=0xCCCCCCCC;
PREMOTE_DATA p=(PREMOTE_DATA)地址;
p-f_LoadLibrary(p-dll名称);
无符号dEntry=p-EntryPoint;
char* 入口代码=(char*)p-EntryPoint;
入口代码[0]=p-oldCode[0];
入口代码[1]=p-oldCode[1];
输入代码[2]=p-旧代码[2];
输入代码[3]=p-旧代码[3];
入口代码[4]=p-oldCode[4];
_asm {
移动eax,dEntry
跳转指令
}
}
DWORD _stdcall RemoteThreadProce(PREMOTE_DATA p) {
unsignedbase=p-f_GetModuleHandleA(0);
双字dRet;
p-EntryPoint +=基址;
p-f_VirtualProtect((LPVOID)p-EntryPoint,0x1000, PAGE_EXECUTE_READWRITE, dRet);
char* 入口代码=(char*)p-EntryPoint;
p-oldCode[0]=进入代码[0];
p-oldCode[1]=进入代码[1];
p-oldCode[2]=进入代码[2];
p-oldCode[3]=进入代码[3];
p-oldCode[4]=进入代码[4];
int*entryDis=(int*)(p-EntryPoint + 1);
*输入代码=0xE9;
int 距离=p-HOOKFunction – p-EntryPoint – 5;
*entryDis=距离;
返回1。
}
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, const wchar_t* GameExe, const wchar_t* dllName)
{
LPVOID adrRemote=VirtualAllocEx(hProcess, 0,0×3000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
SIZE_T 重量;
LPVOID adrRemoteData=(LPVOID)((无符号)adrRemote +0x2000);
LPVOID adrRemoteProc=(LPVOID)((无符号)adrRemote +0x500);
_REMOTE_DATA 远程数据{};
RemoteData.EntryPoint=GetEntryPoint(GameExe);
CodeRemoteData(remoteData, dllName);
WriteProcessMemory(hProcess,adrRemoteData,remoteData,sizeof(remoteData),lwt);
字符_代码[0x200];
memcpy(_code, INJECTCode, sizeof(_code));
for (int i=0; i0x100; i++) {
无符号* pcode=(无符号*)(_code[i]);
if (pcode[0]==0xCCCCCCCC) {
pcode[0]=(无符号)adrRemoteData;
休息;
}
}
WriteProcessMemory(hProcess, adrRemote, _code,0x200, lwt);
RemoteData.HOOKFunction=(无符号)adrRemote;
WriteProcessMemory(hProcess, adrRemoteProc, RemoteThreadProce,0x200, lwt);
CString wTxt;
wTxt.Format(L\’%X\’, adrRemote);
AfxMessageBox(wTxt);
双字dwThreadId=0;
HANDLEremotehdl=CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)adrRemoteProc, adrRemoteData, 0, dwThreadId);
WaitForSingleObject(remotehdl, 无限);
//DWORD dwThreadId=0;
//HANDLEremoteHdl=CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)adrRemote, NULL, 0, dwThreadId);
//WaitForSingleObject(remoteHdl, INFINITE);
返回真。
}
无效INJCET:CodeRemoteData(PREMOTE_DATA _data, const wchar_t* dllName)
{
长度短。
//求长度
for (lenth=0; dllName[lenth]; lenth++);
HMODULE hKernel=LoadLibrary(_T(\’kernel32.dll\’));
//_data-f_LoadLibrary=(_LoadLibrary)GetProcAddress(hKernel, \’LoadLibraryW\’);
_data-f_LoadLibrary=(_LoadLibrary)GetProcAddress(hKernel, \’LoadLibraryW\’);
_data-f_GetModuleHandleA=(_GetModuleHandleA)GetProcAddress(hKernel, \’GetModuleHandleA\’);
_data-f_VirtualProtect=(_VirtualProtect)GetProcAddress(hKernel, \’VirtualProtect\’);
//加载库W
//wchar 的2 字节副本为1 字节,因此长度必须为2
memcpy(_data-dllName, dllName, (长度+ 1) * 2);
/*CString wTxt;
wTxt.Format(L\’%X\’, _data-f_LoadLibrary);
AfxMessageBox(wTxt);*/
}
INJCET.h文件代码:
#PragmaOnce
#include Windows.h
typedef unsigned int (WINAPI* _LoadLibrary)(wchar_t* dllName);
typedef unsigned int (WINAPI* _GetModuleHandleA)(wchar_t* modName);
typedef int (WINAPI* _VirtualProtect)(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWORD lpflOldProtect);
typedef 结构_REMOTE_DATA {
wchar_t dllName[0xFF]; //要输入的DLL 文件的路径
未签名的入口点;
无符号HOOK函数;
char oldCode[5];
_LoadLibrary f_LoadLibrary;
_GetModuleHandleA f_GetModuleHandleA;
_VirtualProtect f_VirtualProtect;
}*PREMOTE_DATA;
注射类
{
公共:
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, const wchar_t* GameExe, const wchar_t* dllName);
void CodeRemoteData(PREMOTE_DATA _data, const wchar_t* dllName);
};
#以上相关内容来源网络大约有36个。从远程注入到入口点注入仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91835.html