爱内涵易语言

 找回密码
 立即注册

在线
客服

会员永久免费学习服务时间: 9:00-24:00

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

快速
发帖

客服
热线


7*24小时客服服务热线

关注
微信

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

游戏外挂制作技术分析

[复制链接]

1025

主题

1097

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
9845
巨币
7975
积分
37830
发表于 2020-6-2 22:13:18 | 显示全部楼层 |阅读模式
最近在学习逆向分析和外挂编程,总结了外挂开发的基本思路和一些初级的技巧和经验。
- s9 U8 K: w& F( E+ D$ G3 Q6 A首先说说基本思路,我觉得外挂开发主要分为两部分:0 f/ G! z! o9 s* b5 D
  • 对游戏的分析调试,主要是找基址和call地址等游戏信息。
  • 使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。  B  j8 e# g- P+ C4 j" U% Z8 g$ J
) Y' _7 N3 J$ `# F. f6 y; _

) h# T/ r& s6 P* b( T! Z; H开发中使用的技巧一般包括:
- x+ L/ `8 v  }; \% j) P
  • 窗口查找
  • 获得窗口句柄
  • 获得进程句柄
  • 读取游戏进程内存
  • 修改游戏进程内存
  • 远程call调用等. E# g6 ^$ D- {( T% y- u

1 j7 K2 ~; J2 Y2 e5 i: Z5 F( e( i$ v" t
通过学习和交流发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。4 D5 s7 u; t/ _7 Z# @" o& F( B4 C  V

0 x2 ^. x/ c" x/ J/ W工欲善其事必先利其器,首先说说我们要使用的工具吧.对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具。+ Y  I" X' [& R" H6 \2 Q% h8 v
如果感觉delphi难上手,我们可以使用易语言。  y) |, H& G) w. v
2 e- Y6 L6 V. M  Y
第一部分:游戏调试篇
) ~( Q2 r& n& n5 ^/ o& J  g" M, h( v
在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。5 W; D& k" X( U* d; i
2 z( P  ]' H  P" C' F# L
第一步:游戏窗口信息的获取+ }7 {8 Z5 }# b0 P
: Q! @4 C4 V' x( ~) Q
首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:4 @8 {( j$ U) z, K( u) x) L( _( N
4 _0 z8 S% }* |
在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示3 ~4 i0 f+ s0 q  G6 d5 T  M0 @

9 E5 Q8 }  n% H' g5 M8 H4 R! R/ O. q, h4 W# h. P2 `! P
然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:5 X. a: h2 N7 M& J6 b& m/ ]

/ N/ O# Y  l8 E在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:4 q7 Y& S- k2 [$ o0 N2 R+ c5 J! r
) x) G4 X/ ^2 @7 t
记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。
0 t, Q) K' I, A# j第二步:游戏内存地址的获取7 t, [" H1 w; u1 v( I- _
分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。
1 X8 Q6 u3 d6 Z8 y2 n( b% {* H& ]7 a打开CE,附加游戏进程,如图4所示:2 D" U: Q, U1 @: P0 ]- I, y$ ~
  L& I" ?' c# G4 Y1 T8 |* [
然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:4 r, L* ]2 G8 _5 w

" V. m, u3 _* B1 R- S3 i2 a这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:
& N; G$ V: {4 p' ?$ a$ {* V! D+ o7 `4 q/ a- @
如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:7 E9 ]6 s7 q" Y( \, |/ ?, s. U; V* v

$ F1 z" z8 |0 h- ^* W2 t那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:
6 x& u: n& I5 s8 V  l
6 `8 q( K6 d& V) v$ b时间的基址是:0043E0A9。下面再查踩雷的数据地址,一开始找这个地址的时候有点麻烦:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:1 `! v- W# B  m! c+ e

) H' y7 M1 \; s9 {, X踩雷的基址是:0043C698、0043C788、0043E06C。只要让这3个地址的数据一直为0就可以实现踩雷不死了。得到了这些游戏数据在内存中的地址后,我们就可以通过编写代码来实现外挂功能了。8 U# B" K) k  E! U" ^* a5 L5 j
+ W7 H' W4 [' J' [( K
第二部分:外挂编程篇8 V- g. m5 Y) P' p3 T' R+ c. G4 D
编程我们主要使用delphi来实现,你也可以用易语言来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:
+ }- R& h8 E. a( ~  @: ^' _4 ~% y4 }; t( E$ x
下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。# L* p( m" d! G  [1 i( x) `

  y5 z6 t, c. Y. w
# u) c) n9 x# r! e' Z第一步:进程句柄获取
5 s0 n9 d. e& j. R) a获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:
& E% V0 K4 Y! G# D" u
; {1 z3 _& M. w) ~2 E% wbegin; U! k+ n' C* o0 Z3 ?7 u9 Y
# ?' Z! s: y# X% c# @7 v$ _$ b% |/ p
  //获取挖金子游戏窗口句柄
& k, Y/ n. e1 L. N# Z1 H' V4 |6 y% J( }3 g
  Gameh:=findwindow('#32770','挖金子');7 p, [+ z9 J0 N3 }( j1 ^

' e8 v' g0 w( x( w5 _+ B  //通过窗口句柄获取进程ID
, g7 D) c9 |8 ~2 X# s$ r) e4 Q/ \" u
  GetWindowThreadprocessID(Gameh,GamePid);
/ _4 K7 B  N4 p& j! f: M, k( C% [. I- G; ]* ^/ G9 \$ R
  //获取进程句柄6 W# B& M; K* Q1 [
1 p1 E. g* W3 O# z0 Y
gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
6 `$ b1 f) o* j5 k# Q  x/ ?, h  q' @0 _( Q- o2 V- ?
end;5 P5 P7 _0 x; |* r; z/ I) H' R! ]

0 A4 M/ K# g& s第二步:修改内存数据- L/ ^. d  K5 r9 w( e0 w: L0 p$ F
首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据实现,我用的是时间控件实现的,时间间隔为每秒。
4 E( C  ^0 t: F- q7 U! b6 G9 v7 ?) X- Y: J0 D. }
  timestop:=30000;
8 j) R' A" P1 |- F3 n- i) Z+ Y7 q: Q$ n. _1 n
  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);% }) ]) R9 V9 I( P8 _( n

; A$ s3 Z& n( @; }秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:. _: M5 f, P( C  A" A9 i/ ^% X
" m' X6 a2 t8 ~* i
  seckill:=4;# f- c" P0 X6 }6 q" G
6 j0 A1 `* @( N& v2 _/ x" y& k
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);% y- P( q8 e' }

& K9 |8 L: s5 ^+ ^踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:: N7 g  K. g" `* n

9 E- z( F3 h, v& u) E: S  undie:=0;
  @( l! ~8 |/ D' j8 o9 V) Z, I" V$ |6 O# g
  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);
6 F2 I8 P8 V/ G. V
+ s9 o6 Y: }! q  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);
) V! s( v* b0 X) T7 k
& X% V' a* U; T; K0 t  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);
. V  _0 s9 U$ O% F% _: s3 A" g
5 v2 A6 q* W3 a- g4 t窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:
& I# I" x/ `5 t! v1 X& Q2 M7 S6 {, @% R5 d4 Z
  seckill:=strtiint(edit1.text);1 v. K* r' `6 x- S) ]8 L
& g$ T) A2 @1 k& ?
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
' J3 z: w1 H4 R' H. ^& S$ i! L' s
6 ~% ?9 Z0 @! C% WOk!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:3 ?) w; l- g* T+ @: [

0 @. H+ \3 {$ Q" o$ ]4 T9 C总结:" y5 l# n/ Y  {; B: ]! `6 ]
这个辅助程序比较基础,主要是使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。% s# H* O; s7 {$ [2 d
2020年外挂程序基本上已经用易语言来制作了。易语言外挂学习教程:http://www.inhsoft.com/forum-49-1.html
- D' G8 U$ o# l2 h2 u
) e' Z6 ?, L# x, J3 s4 F

本帖子中包含更多资源

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

x
爱内涵论坛关注易语言与按键精灵的脚本辅助软件开发领域。                     VIP视频目录            VIP会员介绍            联系客服加入会员            爱内涵免费①群            爱内涵免费②群            爱内涵免费③群            自助加入会员
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【加入会员,永久免费学习】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|爱内涵易语言 ( 浙ICP备19016710号-3 )|网站地图

GMT+8, 2021-2-25 02:21 , Processed in 0.125985 second(s), 12 queries , Gzip On, File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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