死磕丶 发表于 2022-5-25 16:48

游戏安全-外挂编写第4-5天

本帖最后由 死磕丶 于 2022-5-25 17:06 编辑

昨天看lol比赛了,没怎么撸代码,加上吃坏肚子了,
今天继续学习,今天主要学习的创建远线程调用call,模仿外挂调用游戏的call

假设外挂中有三个call:

call0为无参数就可以调用
call1为传入一个参数就可以调用
这里我把控制台1模拟成一个游戏,打印出了call的地址


为了模仿外挂远程调用call,我写了第二个控制台(方便理解可以看作exe应用)
即在第二个exe程序中,通过第一个exe中的call地址,在第二个exe中调用第一个exe中的call
效果如图:

代码:
// 调用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";
}



xiadongming 发表于 2022-5-26 22:41

页: [1]
查看完整版本: 游戏安全-外挂编写第4-5天