爱内涵易语言论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

在线
客服

支付故障请联系客服服务时间: 9:00-24:00

选择下列客服马上在线沟通:

快速
发帖

客服
热线


7*24小时客服服务热线

关注
微信

关注微信二维码
顶部
查看: 1818|回复: 0

游戏外挂制作技术分析

[复制链接]

1762

主题

1848

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
9845
巨币
11640
积分
39494
发表于 2020-6-2 22:13:18 | 显示全部楼层 |阅读模式
最近在学习逆向分析和外挂编程,总结了外挂开发的基本思路和一些初级的技巧和经验。& f5 S& X- ]0 z# t. S4 U
首先说说基本思路,我觉得外挂开发主要分为两部分:
4 _% F6 X' U) P9 O0 e0 I. ~5 {5 n
  • 对游戏的分析调试,主要是找基址和call地址等游戏信息。
  • 使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。
    ! _" V5 G1 k! [( O3 J1 J5 q* @

$ A9 J4 a$ m7 O. d: u
1 e9 P, i2 t* i  R' ]/ e$ l- k开发中使用的技巧一般包括:
; c- K) B1 T8 I' ~  l
  • 窗口查找
  • 获得窗口句柄
  • 获得进程句柄
  • 读取游戏进程内存
  • 修改游戏进程内存
  • 远程call调用等
    / i7 B4 r% d. Y- N+ U

/ E+ a3 P$ \9 d# }1 J8 ^1 m$ g$ I% I$ F& W- w" k9 u
通过学习和交流发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。
6 v5 ]0 p0 R. }' ~
( w$ S7 w% u( ]% q. }: A工欲善其事必先利其器,首先说说我们要使用的工具吧.对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具。
" b: r, Y4 b% A/ y如果感觉delphi难上手,我们可以使用易语言。
2 m" Q: c# Z: I. W
! V) m' ]9 Z8 b7 k第一部分:游戏调试篇
* ?9 v! Y( a: Y+ J) J& k  N& K) j- Z1 M! s9 w& ^, O  O" U
在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。
& t5 ^( j) y7 x* A1 b
* B% J3 V% d9 _7 {: w" o" B第一步:游戏窗口信息的获取1 ?1 g, S4 Q, N
; `* R( w" L" ?4 h; W
首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:: M4 s8 J: h$ X& l
5 j1 N& g/ G- r
在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示- a8 G- y$ F5 A, P3 R: d7 o

% ?- A) o6 Y- Y. h& j  j
. c6 G: n* V) P  }! ^7 P- X然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:! n; d% I/ {- H1 F4 ]+ {2 {

/ L$ w; w3 l8 a0 _7 ?在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:- D6 v) ^8 {5 g& N3 D- m% Y

0 G5 V  i( y4 _: d0 \记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。
3 v2 Z; a, R5 Y, H  ~第二步:游戏内存地址的获取; a- s9 y5 g* f, }
分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。
3 r9 t* |7 ^. Q* R打开CE,附加游戏进程,如图4所示:
- x8 v) N* {0 p: B, {( Z" ?/ k# [7 b& I7 a3 }3 V- U
然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:
; @  }# B9 q, a+ d* ]% m8 O$ n4 o7 ~, q- b
这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:# {4 j* Y! V# [  T5 n1 D; N# K. C
/ U3 B1 ?, C9 G) t" F
如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:- x3 l# w! ~2 e! L

6 {% z( a6 r# g) D' _7 Y那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:' l- i- Q) m7 [" _# C

9 Q% `) n+ c  r! n时间的基址是:0043E0A9。下面再查踩雷的数据地址,一开始找这个地址的时候有点麻烦:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:
7 g3 o9 S3 B1 j/ I5 k) H: R$ p5 n; _2 B1 Z  B5 b" S; n1 e
踩雷的基址是:0043C698、0043C788、0043E06C。只要让这3个地址的数据一直为0就可以实现踩雷不死了。得到了这些游戏数据在内存中的地址后,我们就可以通过编写代码来实现外挂功能了。: E  b1 Z( L* m' s' [( S% L
( U  `1 x& V2 ^$ @% _
第二部分:外挂编程篇) M" d$ V/ D% D4 `) g. x1 f2 J$ x1 g7 F
编程我们主要使用delphi来实现,你也可以用易语言来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:; e- D. a2 s# S$ A

( N. Q: r' L+ |' [9 u9 t) N* v下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。
: X4 J. u$ H1 Q' i8 I7 t# V$ _! G2 q4 D6 x9 b6 B. U. A3 v
+ b! _4 h0 K, v8 Q1 B' _% s1 c# _
第一步:进程句柄获取1 z  B- v$ [0 [" F3 r5 g
获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:
0 i/ U8 n( d3 F& p3 M" Z% s1 B  f; t5 T! @, U  L8 J
begin
! y. r* w/ L7 k
1 U+ R$ d. R) k, }, U& e/ j' g  //获取挖金子游戏窗口句柄' b0 c' m! g, @. f& h: G

6 p2 W& p% _4 ^/ E% ?  Gameh:=findwindow('#32770','挖金子');
/ H& s& T; v* T" R" i) Q3 |
6 J( v4 N# }5 r) D6 W  //通过窗口句柄获取进程ID1 l1 V; l* O0 [$ i- o; ]' N9 N, Q0 ]! v

' K7 A) ~9 u' q4 o& P  \# t/ E  GetWindowThreadprocessID(Gameh,GamePid);
  Z! o4 b8 k7 t9 \7 ~0 |6 ^
' v; C, c4 s& D& q  //获取进程句柄5 H4 y$ @; n) j
% C$ ^& B2 U: D% u  ]
gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
2 r) L, U+ R, m3 W6 a- L" |5 W+ y: d5 f/ s3 }
end;; S5 G1 f8 D# D4 M: M

0 j% _. P; S1 J( [6 O第二步:修改内存数据
  w! P% v" e$ o首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据实现,我用的是时间控件实现的,时间间隔为每秒。
2 e% C7 o" {$ ]. {0 {: |- [, ^/ A& j8 K% {8 d1 k
  timestop:=30000;
  r  A8 H- c/ E( n6 K- Q
* R; G0 R+ Y( l9 m  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);, O% J' y( G9 p

# u; K- l% @" ]+ H" ~$ E4 ]  S- k秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:! N6 [0 s# J* Q9 d/ A# b
1 U# \( p  z' N1 \  b, K& |
  seckill:=4;
: H# h4 X4 t" S1 x) E. o
9 ^. O8 Z# _: G8 Z$ {6 a' i  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
* I6 M8 y) _! q7 ~
6 c$ h8 `% O+ G/ Y/ b$ L: ]5 a踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:
! w8 `; \7 J  k2 Z
& f& G$ u0 y2 b6 y- y! J$ V  undie:=0;
0 {8 H" N6 E# _/ P; H7 g8 j0 V; e6 s& N9 a0 h6 P
  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);4 x. j8 W6 O3 c3 X" e5 R# x  G

( ^: j8 g3 z' G3 }- Z2 r( u" l1 b  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);
+ S; D$ K/ s* r4 x0 Z, X% k* V# q1 o( O# d3 ?$ }
  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);
* h* V7 Y: v) L" h; s1 t
3 @! d0 ?) b- @7 G1 A" a窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:
3 E7 T8 R, |4 p, |& y. J/ z+ Z" S3 v9 c, ?- I) X
  seckill:=strtiint(edit1.text);
6 u4 H! A7 w3 f1 c5 n# i% f7 U9 E$ \5 e
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
" R$ h5 }+ u9 H; K
5 v) g2 I3 i. o$ e. W& h2 hOk!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:7 R; G- v0 w* b- f, w! {, m

/ k; A* O( g* _总结:
2 Y( u& d! N- f; g" B5 L这个辅助程序比较基础,主要是使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。
5 x* l' t3 P* P4 i+ O2020年外挂程序基本上已经用易语言来制作了。易语言外挂学习教程:http://www.inhsoft.com/forum-49-1.html
' S- Q* }! m/ u, K; x( C
6 G( m* R: p/ P  R* b

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|爱内涵易语言论坛 ( 浙ICP备19016710号-3 )

GMT+8, 2021-9-16 19:04 , Processed in 0.072994 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表