爱内涵易语言论坛

 找回密码
 立即注册

在线
客服

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

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

快速
发帖

客服
热线


7*24小时客服服务热线

关注
微信

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

游戏外挂制作技术分析

[复制链接]
avatar

1767

主题

1853

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
9845
巨币
12887
积分
39630
online_admin 发表于 2020-6-2 22:13:18 | 显示全部楼层 |阅读模式
最近在学习逆向分析和外挂编程,总结了外挂开发的基本思路和一些初级的技巧和经验。
3 ]" B8 z# i6 L, p4 w首先说说基本思路,我觉得外挂开发主要分为两部分:
0 s5 L* ?& W/ n+ b. z
  • 对游戏的分析调试,主要是找基址和call地址等游戏信息。
  • 使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。- x# ]( W/ s+ Q6 t' H& w+ y

% e* t8 d' w' G3 @; l2 m; X# y) D4 c* o& D8 w* Q) H
开发中使用的技巧一般包括:
# c, A5 R8 U$ V2 K0 l& C5 q  B
  • 窗口查找
  • 获得窗口句柄
  • 获得进程句柄
  • 读取游戏进程内存
  • 修改游戏进程内存
  • 远程call调用等; n% r/ N/ m% L4 y
: J: E6 x; u0 K% O( H* f2 k7 T
; q" n+ J8 J, Q6 i& _! X( N. d7 h
通过学习和交流发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。
6 [( k: s; {7 O* c. I+ s  E7 e0 B: [' I
7 B  l) Y4 W* p/ C3 c) {' w工欲善其事必先利其器,首先说说我们要使用的工具吧.对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具。
) e' W3 ?% o' h如果感觉delphi难上手,我们可以使用易语言。
: Y7 g) L: Z$ C3 _! x+ S5 ?
- m; a2 ?8 m/ B) O. {第一部分:游戏调试篇" {( v2 \; ?# S2 L1 U% J1 f' s1 \
4 a/ Y. z% G, Z
在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。
0 a3 }1 s' Q+ j4 z) C+ r
8 d+ y% }) k# C" i( L第一步:游戏窗口信息的获取
5 s$ A2 F6 i9 ^0 x1 f8 R( r- A6 C! c( {
首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:
1 `  T9 h9 j* Z1 D, h4 }( f6 j; t, d0 q
在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示' n! Z5 y- ?) R! u

' Z  z* V- q1 K2 {7 i
# i8 [( u) A: j' c然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:
9 _. ^8 R7 ]$ O# e$ v2 i' g5 k) Y
8 X2 V" Z) j2 [在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:
: u. y" s; K. i+ C+ `; B
; D' p1 ~1 h+ M! I9 ~8 N( f  n1 H记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。% n! C, }  s( }; S: `" q7 |
第二步:游戏内存地址的获取
2 y, L2 B9 u7 S6 N6 X% \9 F3 H% i分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。
& ^+ d7 e! r5 N: y, |* ~1 C, J, y打开CE,附加游戏进程,如图4所示:1 e2 J% F9 f+ r/ c- [# e8 P  Q

/ Z, E. T/ g5 N9 x, @然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:
. j9 e0 e7 D" Q4 U3 S; @: N# S2 S: \) a& E7 ~$ u2 J
这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:
  l6 ?' \! j2 o* W- o: `1 o# X$ g* A# H
) H* r! X" Q7 j% X; o# w8 |& Z0 O如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:
8 ]) Z, m0 g5 _
+ S" P3 O6 B/ u6 m那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:
. L# x! Q) _$ j6 T. N# K$ [9 D- v1 D+ d& s% ~# o  {
时间的基址是:0043E0A9。下面再查踩雷的数据地址,一开始找这个地址的时候有点麻烦:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:
& @! u) b7 {) o3 o7 e! G2 s% ~3 e; q& x. s( G6 B
踩雷的基址是:0043C698、0043C788、0043E06C。只要让这3个地址的数据一直为0就可以实现踩雷不死了。得到了这些游戏数据在内存中的地址后,我们就可以通过编写代码来实现外挂功能了。
, [* k7 d9 ^  N0 C7 Y9 P/ E8 ^# u1 J3 H
第二部分:外挂编程篇
$ G7 J% y0 T7 }! V6 ^编程我们主要使用delphi来实现,你也可以用易语言来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:7 Y; ^5 S* D+ n5 {- ?! L  ?' K3 a: _

& K4 P* ]5 n  u* b下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。1 P" }9 m, t3 W/ C+ d! q

0 |0 D- O9 A4 r2 R2 f+ v8 ?
8 @) Q7 j& G0 {/ l第一步:进程句柄获取
: s# G. E) J6 U获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:/ \0 h- j4 }) f6 Q

, R. j9 W" `$ n2 D7 Qbegin+ l( ^9 w6 N, z5 D  m0 |
$ n4 g1 n) {/ j" Z( D$ }
  //获取挖金子游戏窗口句柄$ \" x& h. T1 q
- X7 b& a9 l. {5 h7 H
  Gameh:=findwindow('#32770','挖金子');$ Y- n& z- x0 g

$ [3 Y0 l: E) r: M) Z8 w  //通过窗口句柄获取进程ID
0 V; a0 m2 ^1 E" `, l5 D* @% _- K  A: P- t
  GetWindowThreadprocessID(Gameh,GamePid);: e9 B! s( D% ^/ f
6 r: A* O8 Q# e
  //获取进程句柄
) `& v; `* p! ^# L' L/ t" R( Z0 `4 ^# o$ [. D/ Y9 D% B% h
gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);$ N" O( V' d( R  ?

' B0 }& W! Q3 bend;
" J( f9 h. _6 D: q3 E2 S1 n! u0 G" a2 }
第二步:修改内存数据& f+ ^5 w  U$ |$ y6 f4 ^
首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据实现,我用的是时间控件实现的,时间间隔为每秒。% R, W1 k* {" A
2 O  N) \; G6 B- h2 d
  timestop:=30000;: l  k; X0 ]. }3 I6 J
! X& i9 m# l7 j* z
  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);
2 f: g$ \( z. D9 |8 M* |4 _  o, }+ i$ \: ~! H- d
秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:
! |+ c& u7 T1 b/ E( s7 A9 m; J# b* R3 Q' T4 B; ~, ^+ r
  seckill:=4;
( U8 T) \4 R2 i8 W- U/ t3 G" y# @  W! V* y$ v5 t! X, O
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);  M/ I0 _+ @4 |! |2 e
- F" ?0 d5 Q' D( a) O4 C1 W
踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:5 p2 v$ v  f/ `1 r8 w+ ?1 X
  M( K2 x0 Y/ Q! r0 E0 p
  undie:=0;
. m7 K. @/ N- \5 [2 Z* L! V: @' g  h; n+ V3 G2 ~
  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);- l# A$ }9 E/ X
+ K% Y$ N/ T7 Z
  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);
' R( K9 o( m7 l/ B+ t6 z8 ^; {5 J/ a& B
  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);# a1 x$ T0 v" e5 j5 A

' t; _4 E( o1 U) `6 E) x0 g窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:5 o) d& Z! H# _9 X
+ {2 t. W' Y! a4 `
  seckill:=strtiint(edit1.text);0 {( P/ O4 v; m  k9 |: l

8 q/ `$ \6 p9 l, }  [  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
/ N! ~: [2 U! @- U) O, E2 W
4 t2 x5 x( s) Y& f# u. ?Ok!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:
' U9 E4 c  I1 _+ s6 \* M' N& X3 O. R7 A& f
总结:( W2 Q8 H9 o; w+ X
这个辅助程序比较基础,主要是使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。
) J; y$ A8 D+ I+ |2020年外挂程序基本上已经用易语言来制作了。易语言外挂学习教程:http://www.inhsoft.com/forum-49-1.html
0 ~! W* X3 H& d5 ]" y$ j! U0 `) G2 J6 |! }# x1 H. g6 `- ~

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-7-5 17:41 , Processed in 0.044514 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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