爱内涵易语言论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

快捷登录

在线
客服

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

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

快速
发帖

客服
热线


7*24小时客服服务热线

关注
微信

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

游戏外挂制作技术分析

[复制链接]

1766

主题

1852

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
9845
巨币
12233
积分
39555
发表于 2020-6-2 22:13:18 | 显示全部楼层 |阅读模式
最近在学习逆向分析和外挂编程,总结了外挂开发的基本思路和一些初级的技巧和经验。
- \* s2 K( F8 P首先说说基本思路,我觉得外挂开发主要分为两部分:
) e9 l7 D' e8 M0 k) y3 U$ x4 W: u9 i
  • 对游戏的分析调试,主要是找基址和call地址等游戏信息。
  • 使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。$ z) p' K, J! ]
- E9 p' l) n9 H0 ~& M8 G: G/ S0 _

3 Y9 Z/ M# \: |- J开发中使用的技巧一般包括:9 Q4 C0 p- Z; Q$ _
  • 窗口查找
  • 获得窗口句柄
  • 获得进程句柄
  • 读取游戏进程内存
  • 修改游戏进程内存
  • 远程call调用等
    " U2 B( u$ Z& z7 M! y% V. }
& F/ L5 p, `2 h9 x2 j
7 Z0 b5 N5 H; F) q3 V
通过学习和交流发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。
& ^  H1 C* h" J# j( I
/ a( m$ i# D! L) C工欲善其事必先利其器,首先说说我们要使用的工具吧.对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具。
' x- a, f" J- ~6 N1 {, p如果感觉delphi难上手,我们可以使用易语言。, d" L: b8 {$ T* o5 y. P

; {/ a. _+ a8 r0 X第一部分:游戏调试篇
& V, }# I$ w. ]. m6 A
6 G7 [% S. u# T  a# U8 w4 u在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。
* w1 _+ t6 c  @% O
3 o# ^$ L  U4 P第一步:游戏窗口信息的获取: B9 R! V  R$ q8 Q

0 b  R6 l! S+ `. v1 g5 w, D首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:
! C, H! w# r3 v% ~: Y& s" a* {0 w& G1 m9 K* q5 x9 c+ e5 w
在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示( z, o( P  J; H8 ?( m9 H

5 A, R) b3 e% u, m
. }' {: q% J0 z+ f8 [- x  ]然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:* o7 P, l# w8 z, K
: Z- {# {6 @+ z, U9 j9 C6 z& }
在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:
$ p  x% G- M6 o7 Z2 \* x: ^8 E/ p/ t4 v3 }5 V
记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。$ Z6 \' p4 N  |9 c- a$ s! V
第二步:游戏内存地址的获取
2 c( z; o* q1 w# F分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。
- P/ U; U& c- ^2 k: O  e, h8 ^打开CE,附加游戏进程,如图4所示:
1 E: b( k) I8 l# C7 x6 _2 l
8 X$ \# C' X' S, g然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:
, `% o3 K- b1 x  F% k- ]% B( I  r! ^; y& T) q2 n$ \5 j4 m  ^
这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:
, v$ F1 m- J9 `  R& j% D5 p. Q; }9 }6 q
如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:
1 D( R' ]* j( k; |
. k8 g; Z5 r' B$ N1 M( D! y7 l那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:. ?9 _' ~8 l0 w: r0 ]# @$ |0 o' B
6 V5 [1 N' v4 ^  b
时间的基址是:0043E0A9。下面再查踩雷的数据地址,一开始找这个地址的时候有点麻烦:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:
9 m4 n) J% s1 n0 N: r
  B0 z  B6 b9 Z2 v& x7 ~踩雷的基址是:0043C698、0043C788、0043E06C。只要让这3个地址的数据一直为0就可以实现踩雷不死了。得到了这些游戏数据在内存中的地址后,我们就可以通过编写代码来实现外挂功能了。+ s# G  a; {& Y. O% y' r

- f4 J. b3 |6 c. g- v第二部分:外挂编程篇
3 ]5 c- ]9 L2 P" n5 j) M+ t; q编程我们主要使用delphi来实现,你也可以用易语言来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:! g2 G  r6 y6 `+ I3 P

! E, F3 g, T# s  T! @下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。4 Q5 q# r+ ~& H( |$ U
( s* K. ~) d8 }" K; x# t5 P

7 P* b) \5 G5 L+ c$ X9 d" {, i- _第一步:进程句柄获取
. z! V. h" c0 v7 k获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:, v  B2 m& U) W1 E
) y# i, J* {. Y' G! }' H! P& Q7 w
begin
0 q# x: q: H! H9 n, ]3 c% Y$ U7 U3 t+ A& h7 W
  //获取挖金子游戏窗口句柄: F( M* T; n) b% U+ H  n* K
5 X4 Q% r6 l  s# x% ]9 t
  Gameh:=findwindow('#32770','挖金子');
1 }9 r" t2 l! g8 t& Y  J
! m  v) m: t- X, u9 [  //通过窗口句柄获取进程ID& ?6 ^0 R+ _6 X2 P; M2 _

+ y) [3 c! @1 V7 k  GetWindowThreadprocessID(Gameh,GamePid);) B3 p; _( D2 |1 l+ E

4 U# Q; x) S: p5 ?; S, z  //获取进程句柄' y- R" L! M* n3 v% ?% j; r, m* R6 J
+ `+ C0 D  v  E# C" E4 T2 q
gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
) h$ Z1 \, t% J* }% g' j3 y: }5 ~
end;: I. o2 i, |, h7 S& K  X

/ M5 o  x+ e* e1 k第二步:修改内存数据
  ]  O* P# D& C3 p$ _4 ?, V1 a首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据实现,我用的是时间控件实现的,时间间隔为每秒。0 P, L* ?& h! g0 h2 F$ \

" n1 L1 O5 I5 l6 M' }& E0 n0 a  timestop:=30000;
' r7 i2 c, `  G; N0 A3 v* y. v$ |/ c% l  o# e6 u! L
  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);0 _% v- ]7 u0 ~( ~4 o$ M' P
# W, v& n2 [! H. X$ n* ^% h
秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:, _/ g. D5 ]/ u& B( G

3 T  k7 W0 \0 o- I( l% |  seckill:=4;0 W7 g0 B4 R6 K8 g  n9 D

# D2 Z, t) o8 s7 t  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);$ h' x- n( L; l: ]/ E+ K, V- c
& p1 |# f/ _! j& I2 j! X( `. P9 W
踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:
0 n* N+ Z' W( U# K$ x7 t# m9 ^! X! p' Q
  undie:=0;, p3 F2 |# J  H5 `  M* P* f5 w" l

1 J; y8 w0 Q% F* I2 D# S  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);
. T8 X: G) r. M, \# h/ u0 D+ h# ?  l% e8 G
  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);
. x6 L- p2 \" w* H7 {/ A& P
3 f& d& Z, o) L  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);4 ]5 h# P# X8 K

. B. i' X  m- R+ [5 G7 y: ^3 D窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:8 i' [$ S0 h* Y& s% x- I& P" c

2 [' \" E4 t# ^! l  seckill:=strtiint(edit1.text);  |0 g& j( X2 l6 I4 d) `

8 S. D0 {+ s% Q( r3 D; D8 ~  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
8 w. Y$ i, V  a4 _* o3 J3 d0 A( ~$ q
9 l; D) Q0 J6 {! I# y  ZOk!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:
8 |6 [+ m5 D9 D1 {& Q
! P4 u2 b2 R, ]0 x1 k0 z0 L0 H总结:
% e( F" ~: h( J1 ~8 j; @( K* l& p这个辅助程序比较基础,主要是使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。/ r' k! ?3 e/ k' t
2020年外挂程序基本上已经用易语言来制作了。易语言外挂学习教程:http://www.inhsoft.com/forum-49-1.html
; d' l1 b! Q8 O
" t5 b8 W! ~& ~+ q: Z) L

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-1-18 06:34 , Processed in 0.084082 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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