C语言游戏外挂(三):自动模拟操作功能

  • A+
所属分类:逆向工程

声明:本系列文章由网络转载,

          转载来源未知,

          版权属于原作者,特此声明。

C语言游戏外挂(三):自动模拟操作功能

通过 C 语言编写一个外挂,通过 API 函数模拟进行连连看操作,实现自动进行游戏

  • 对象分析

  • 要用的 API 函数简单介绍

  • 编写测试效果

  • 总体评价

对象分析

C语言游戏外挂(三):自动模拟操作功能

本次游戏对象为某连连看游戏

试玩发现需要进行棋子确定和模拟鼠标操作

通过 CE 确定棋盘基址获得游戏数据,再利用算法确定目标,执行鼠标操作

要用的 API 函数简单介绍

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

其中 Msg 为 WMLBUTTONDOWN,WMLBUTTONUP,表示对鼠标的软件模拟操作 (虽然兼容性和安全性不如硬件模拟的 mouse_event,但不改变移动鼠标指针)

故一般写作 SendMessage(hwnd, WMLBUTTONUP/WMLBUTTONUP, 0, Y 坐标 <<16+X);

编写测试效果

C语言游戏外挂(三):自动模拟操作功能

打开游戏 

C语言游戏外挂(三):自动模拟操作功能

运行外挂 我用 MFC 将几个函数功能封装为按钮

  1. 单消:读取数据并消一对

  2. 自动:恢复 / 暂停一个线程,这个线程有消一对和延时的循环功能

  3. 秒杀:不延时,直接消 999 对

 

C语言游戏外挂(三):自动模拟操作功能

C语言游戏外挂(三):自动模拟操作功能

检测有效

  1. //

  2. //  03自动模拟操作功能(部分).cpp

  3. //  C/C++

  4. //

  5. #include<windows.h>

  6. #include<iostream>

  7. using namespace std;

  8. HWND gameh;

  9. DWORD processid = 0;

  10. HANDLE processh = 0;

  11. byte chessdata[11][19];     //数据保存缓冲区,假设棋盘为11*19

  12. const char *gamename = "连连看"; //某连连看游戏名称,可通过SPY++查找

  13. struct point {      //具体使用和算法见"连连看BFS算法"

  14.    int x, y, direct;

  15.    int step, hp;

  16. };

  17. void readchess() {  //读数据并更新

  18.    gameh = ::FindWindow(NULL, gamename);

  19.    ::GetWindowThreadProcessId(gameh, &processid);

  20.    processh = ::OpenProcess(PROCESS_ALL_ACCESS, false, processid);

  21.    LPCVOID pbase = (LPCVOID)棋盘基址;

  22.    LPVOID  nbuffer = (LPVOID)&chessdata;

  23.    ::ReadProcessMemory(processh, pbase, nbuffer, 11*19, &byread);

  24. }

  25. void click2p(POINT p1, POINT p2) {  //点击两个点的操作功能

  26.    HWND hwnd=FindWindow(NULL, gamename);

  27.    int lparam;

  28.    lparam=((p1.y*35+192)<<16)+(p1.x*31+21);

  29.    SendMessage(hwnd, WM_LBUTTONDOWN, 0, lparam);

  30.    SendMessage(hwnd, WM_LBUTTONUP, 0, lparam);

  31.    lparam=((p2.y*35+192)<<16)+(p2.x*31+21);

  32.    SendMessage(hwnd, WM_LBUTTONDOWN, 0, lparam);

  33.    SendMessage(hwnd, WM_LBUTTONUP, 0, lparam);

  34. }

  35. void clearapair() { //找到可消去的两个点并点击

  36.     POINT p1, p2;

  37.     int x1, y1, x2, y2;

  38.      for (y1=0; y1<11; y1++)

  39.          for (x1=0; x1<19; x1++) {

  40.             if (!chessdata[y1][x1])

  41.                continue;

  42.              for (y2=0; y2<11; y2++)

  43.                for (x2=0; x2<19; x2++)

  44.                  if (chessdata[y2][x2] && (chessdata[y1][x1]==chessdata[y2][x2]) && (x1!=x2 || y1!=y2) )  {  

  45.                      p1.x=x1; p1.y=y1;

  46.                      p2.x=x2; p2.y=y2;

  47.                      readchess();

  48.                      if (llk_bfs(y1, x1, y2, x2) != -1) {

  49.                        click2p(p1, p2);

  50.                        return;

  51.                      }

  52.                  }

  53.          }

  54. }

总体评价

简单自动模拟操作进行游戏

C语言游戏外挂(三):自动模拟操作功能

inn0team是一个正在成长的安全团队
微信号:inn0team
C语言游戏外挂(三):自动模拟操作功能
长按可关注我们


本文始发于微信公众号(inn0team):C语言游戏外挂(三):自动模拟操作功能

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: