本帖最后由 死磕丶 于 2022-5-25 17:06 编辑
昨天看lol比赛了,没怎么撸代码,加上吃坏肚子了,
今天继续学习,今天主要学习的创建远线程调用call,模仿外挂调用游戏的call
假设外挂中有三个call:
call0为无参数就可以调用
call1为传入一个参数就可以调用
这里我把控制台1模拟成一个游戏,打印出了call的地址
为了模仿外挂远程调用call,我写了第二个控制台(方便理解可以看作exe应用)
即在第二个exe程序中,通过第一个exe中的call地址,在第二个exe中调用第一个exe中的call
效果如图:
代码:
[Asm] 纯文本查看 复制代码 // 调用call测试 以A002为测试
#include <iostream>
#include <Windows.h>
#define lpClassName "ConsoleWindowClass"
#define lpWindowName R"(E:\A_SoftWare\Visual studio 2019\A_Code\PlantsVsZombies\Debug\A002.exe)" //转义字符常用写法,类似\\
//创建远线程调用call
void callTest(int addr,int value)
{
HWND windowHandle = FindWindowA(lpClassName, lpWindowName);// 1.通过类名+ 窗口名获取窗口句柄
std::cout << "窗口句柄:" << windowHandle << "\n";
DWORD processID = 0, threadID = 0;
threadID = GetWindowThreadProcessId(windowHandle, &processID);//2.传入窗口句柄,进程ID地址,得到进程ID,线程ID
std::cout << "窗口进程ID:" << processID << "\n" << "窗口所属线程ID:" << threadID << "\n";
HANDLE handleProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, processID);//3.通过进程ID,以获取进程全部权限的方式,取得进程句柄
//它能够创建一个在其它进程地址空间中运行的线程(也称:创建远程线程).
CreateRemoteThread(handleProcess,//线程所属进程的进程句柄.
0, //线程的属性通常设为0
0, //线程栈初始大小,通常设为0表示系统默认
(LPTHREAD_START_ROUTINE)addr, //在远程进程的地址空间中,该线程的线程函数的起始地址.
(LPVOID)value, //传递给线程函数的参数
0, //线程创建标志,通常设为0
0); //返回线程ID,通常设为NULL
CloseHandle(handleProcess);//释放进程句柄
}
int main()
{
callTest(0x00B31384,5);
callTest(0x00B31325, 1111);
callTest(0x00B31325, 2222);
callTest(0x00B31325, 3333);
std::cout << "Hello World!\n";
}
|