36.远程注入到入口点注入(从远程用户界面注册信息)

36.远程注入到入口点注入免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不

免责声明:内容仅供教育参考,合法使用知识,禁止从事违法犯罪活动。

如果您不明白或不知道自己在做什么,只需复制它并看看它是如何工作的。 如果你看不懂代码,这很正常。如果你能复制一下,复制一下你就会明白。

上一内容: 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

(0)
CSDN的头像CSDN
上一篇 2024年6月23日
下一篇 2024年6月23日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注