爱内涵易语言论坛

 找回密码
 立即注册

在线
客服

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

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

快速
发帖

客服
热线


7*24小时客服服务热线

关注
微信

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

游戏外挂制作技术分析

[复制链接]
avatar

1766

主题

1854

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

金币
9845
巨币
13159
积分
39645
online_admin 发表于 2020-6-2 22:13:18 | 显示全部楼层 |阅读模式
最近在学习逆向分析和外挂编程,总结了外挂开发的基本思路和一些初级的技巧和经验。! K5 h: Y( U% H3 `9 E
首先说说基本思路,我觉得外挂开发主要分为两部分:
6 x. i3 `: S  V: h2 J3 r1 J3 s
  • 对游戏的分析调试,主要是找基址和call地址等游戏信息。
  • 使用编程工具进行外挂功能开发,比如用delphi或者VB、VC等自己熟悉的一种开发工具进行开发。
    8 C; k7 k& s# y, V) a

( [! B" w5 g" y) {1 q6 V) y$ L# u. [3 L0 w& i3 ^
开发中使用的技巧一般包括:
8 {4 |& G/ c8 K2 Q
  • 窗口查找
  • 获得窗口句柄
  • 获得进程句柄
  • 读取游戏进程内存
  • 修改游戏进程内存
  • 远程call调用等( A/ F" x) k! c2 ~1 l( w

3 I+ N. i* H' ~  L0 ]" Y, Q% A: ~: g6 q  B  z. D! w. o& k
通过学习和交流发现用简单的小游戏入门还是很容易的,下面我就以QQ挖金子游戏为例与大家分享我的入门经历吧。
1 f7 b# ?- V4 ]. `3 N
5 ]+ w" `9 {. e% {. x3 g工欲善其事必先利其器,首先说说我们要使用的工具吧.对于刚入门的一来说首先掌握几款常用的工具即可,对于简单的游戏分析,调试工具使用CE即可,编程工具我们使用DELPHI7(当然也可以使用delphi2010,不过推荐使用delphi7,因为delphi7的绿色U盘版很好用、很方便哈),需要一个辅助工具SPY++,不过delphi7的绿色版已经集成了很多辅助工具。8 G% A3 E" \+ v5 f1 L
如果感觉delphi难上手,我们可以使用易语言。
% N/ A( m- X4 I/ a" J; N) l2 |, P8 H, N/ G
第一部分:游戏调试篇' Q% A9 a" ?+ T9 H3 M

9 @8 t& N1 C) }* s5 s4 q在开始编程之前,首先是对游戏进行分析,获得游戏窗口基本信息和数据内存基址,这一步需要有一定的逆向工程能力和耐心。
5 w5 c+ s1 `3 |  ?8 \3 O# g6 k) R7 ?) O5 H7 u7 {
第一步:游戏窗口信息的获取. P! {+ `8 S  E7 V
: ~9 j1 K; H- N, Z6 m- i
首先是获得窗口标题信息,我们可以用SPY++这类工具进行分析,不过在分析的过程中发现SPY++是无法查到挖金子游戏窗口标题的(看来腾讯是把微软的这个窗口分析工具给屏蔽了),因此我们使用delphi7绿色版自带的工具Spy4Win来进行查找,方法比较简单:$ O! P' u9 b- j/ s

2 ^7 i* m3 Z! `! q在delphi7的“Tools”菜单下找到工具“Spy4Win”,如图一所示- E; A/ L) t* H( w! P) \
( [6 Q% F7 d0 o& Z  D, q8 b! R
9 b& X- s0 [/ F! l  P# X& j" h3 w% [
然后拖动Spy4Win界面上的小狗图标到QQ挖金子游戏窗口,就可以查看窗口信息了。查找到的信息如图2所示:
9 G6 E! s7 S( d5 ]; N7 b; v3 k3 T' y1 f$ S* D/ t
在工具的“代码”页可以看到关于窗口句柄查找的api函数,而且还有vc、vb、delphi三个版本的说明,这对编程是有一定帮助的。如图3所示:8 ~8 P9 F8 _! {& h: H& A" v5 n

9 W! e  P/ Q) y; f记录这些信息,我们继续下一步的分析。其实只要记住图3中的代码即可。
! s+ k) T5 R9 {  H  S" A7 W第二步:游戏内存地址的获取- `, i" {8 u0 R" A4 n
分析游戏数据在内存中的地址是比较重要的,因为外挂的原理一般都是通过对游戏数据的操作来实现外挂功能的。首先我们确定要查找的数据:座位号、时间、踩雷数据等。
* a: Z* F' H( x* ]7 e* k0 g; X打开CE,附加游戏进程,如图4所示:- G3 N* o) }: t' |
7 u7 [: ^8 a" ^$ w* N5 y
然后变换座位号,用CE查找变化的数据。操作方法如下:首先设置扫描类型为“未知初始化数值”、数值类型为“字节”,然后点击“首次扫描”进行数据获取。如图5所示:7 r5 {* e2 e) p  y1 ~0 U( O: U3 {

6 t5 |3 e+ a6 O+ o: Y& w这样会找到很多结果,然后在QQ游戏大厅中,换座位,再在CE窗口中设置扫描类型为“更改的数值”,点击“再次扫描”进行数据的筛选。如图6所示:" p9 d! G' _$ k# R1 ?2 [6 z  j* s

( }( [+ b) j- J; e6 V5 ^9 ~) L" m9 m如上步骤反复筛选,在结果栏中绿色数据就是我们要找的座位号基址了。然后双击这个基址将其保存在下面的数据监视窗口进行实时查看。如图7所示:5 S8 s) k1 A1 w! o: Y7 p

" z) q& G  u" Q% h那么座位号基址就是:0043E1F4。下面我们来查找其他数据了,查找其他数据的方法与此类似,游戏开局以后,时间的值会逐渐减少,那我们就可以用CE查找“减少的数值”进行筛选。如图8所示:5 d2 _+ ?' r1 I9 O; R
* R* `& M9 b: r- S1 b
时间的基址是:0043E0A9。下面再查踩雷的数据地址,一开始找这个地址的时候有点麻烦:在没有踩雷时在CE中扫描“未知初始化数值”,踩雷后在CE中扫描“更改的数值”,然后在挖金子中点击“取消”后,回到CE中扫描“更改的数值”,多次踩雷后扫描后发现三个基址。也发现一个规律:踩雷后这三个地址的数据变为1,未踩雷或者点击“取消”后者三个数据都为0,因此大家在找这三个基址的时候可以使用这个规律进行快速查找,如图9所示:5 b6 G* E: Y* R' _$ h& x* g

2 u) H- U0 X  {( }* J踩雷的基址是:0043C698、0043C788、0043E06C。只要让这3个地址的数据一直为0就可以实现踩雷不死了。得到了这些游戏数据在内存中的地址后,我们就可以通过编写代码来实现外挂功能了。
. g  s' A- V& ]. i, s6 T8 w, Q  {, ?' M! e
第二部分:外挂编程篇: s2 V# a6 d# ~" ~9 I
编程我们主要使用delphi来实现,你也可以用易语言来实现。基本原理都是一样的,调用的API函数基本也是一样的。界面可以如图10设计:
2 v" s* W  n; M2 O' Q9 U) W6 z+ ~) ]
. h+ a, _% Q) [下面就是编写功能代码了,主要介绍核心代码,完整工程及外挂程序关注5ecurity公众号领取。
0 p( l6 m: l9 F. F6 s( \
/ _7 u0 P- @5 ~  |
* j( x7 O& M1 B  }( R. _& X  {第一步:进程句柄获取
/ x2 m2 Q9 y* ^& V3 f获得了游戏的基本信息就可以通过编程来实现几个简单的功能了。关于api函数的说明MSDN中说的很详细了,这里就不多说了,核心代码如下:* Z  v; m2 d0 e0 @& d5 _" F3 T
6 d4 p# b! U$ L
begin2 _. Z! z6 t2 U3 Y. r2 }; @
7 O+ J/ u* Q6 c) s
  //获取挖金子游戏窗口句柄" t  O0 `* M2 L! Z& s3 T, j

9 i* U# B) \" A4 T- R6 O) r6 d  Gameh:=findwindow('#32770','挖金子');7 H( O# m/ S6 V& s5 l# A
8 `8 t. o/ f8 r+ u& h
  //通过窗口句柄获取进程ID7 i# n1 |2 N; R! T3 N4 g
* U4 d% j+ ?1 o
  GetWindowThreadprocessID(Gameh,GamePid);
! l/ U$ |3 b# ~' v
+ ]6 _1 X  x7 l: g; E4 P, p! M  //获取进程句柄
( n# S* B+ H" p8 F, l% K6 e6 {$ T3 ^$ p/ r2 }/ a3 z9 X6 J" B
gamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
! w! J5 Z/ e- n: Y& u1 D0 B( H% ~- B* G6 E/ K8 x
end;
9 D9 I/ \& H3 V$ z9 p! O8 _1 J, T" n! ?( J* p7 ]* n
第二步:修改内存数据
1 h5 r) B' B: t: p9 ^首先是时间无限功能的实现,这个功能可以通过定时修改时间基址的数据实现,我用的是时间控件实现的,时间间隔为每秒。
8 q8 G% T, Y, ]+ \( v5 }# D) s# a) |4 ^) m
  timestop:=30000;: U* @2 R( G0 h$ o, T5 s! J

! x2 R" J6 Y' n% x  Writeprocessmemory(gamehProcess,pointer($0043e0a8),@timestop,4 ,WriteByte);
& L% ^1 {# x: y2 ?. ?8 k; o$ K  {" k
秒杀功能可以通过修改座位号的方法实现,在调试时发现座位号是这样分布的0、1、2、3代表上、右、下、左四个座位,如果将座位号复制为其他不存在的数据,则可实现秒杀的效果,这应该是游戏的一个bug吧。具体功能实现代码很简单,如下编写即可:2 S8 l% m8 N* _& `0 J& H

! |$ c7 t4 |  }+ n5 ]  seckill:=4;
/ \9 y3 ~- [, m+ H) n' b
7 K; k9 V; y: ]9 B0 i7 i' ?* x  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
9 w0 b* q- u  n6 o( g3 B2 V" _! y4 X2 a1 X6 u" O
踩雷不死功能也比较简单,通过前面分析,只要保持下面三个地址的数据一直是0就可以了,代码如下:
. T, H# |# a: Q/ ~8 n% E
& |! U8 ^9 Q# d  undie:=0;* i/ Z2 V% g- Y0 n3 P

( d: m# i0 c7 P' A* Y  G9 [3 y/ Z$ z! ~  Writeprocessmemory(gamehProcess,pointer($0043C698),@undie,4 ,WriteByte);& ^1 y* I( X! i1 ]1 ?

& H4 S# Q6 r: z  Writeprocessmemory(gamehProcess,pointer($0043C788),@undie,4 ,WriteByte);  B7 \( j5 M+ T, s3 C. r6 k" o
4 G' p3 f7 m, J2 z" {4 ?2 P" x" _
  Writeprocessmemory(gamehProcess,pointer($0043E06C),@undie,4 ,WriteByte);
* z4 N' K  b0 w/ L, Q
3 L7 u6 P% t: z窃屏功能也很容易实现,只要座位号改为其他玩家的就可以显示其他玩家的游戏信息了。代码如下:
6 r. ]' C/ H) M! c% R8 {/ k- K9 U* `" B  \; ?) s
  seckill:=strtiint(edit1.text);+ _0 f2 u9 Z7 X3 A9 s
8 x4 P! }9 I+ m
  Writeprocessmemory(gamehProcess,pointer($0043E1F4),@seckill,4 ,WriteByte);
8 ]5 G, |1 o' w7 M8 t+ K/ ]
0 _; \- T  n$ dOk!代码写好了,下面编译一下进行测试吧,进入游戏之后再运行外挂,然后体验一下各项功能吧。我的秒杀效果如图11所示:
. P3 o; j; }( {$ Y
( U, V- P! P. E) N总结:  c: I( r5 r* j5 K3 C; N& I5 I0 M4 {7 `
这个辅助程序比较基础,主要是使用CE进行分析,获得游戏数据:座位号基址、时间基址、踩雷变化基址。这些地址都属于一级基址。如果继续开发,建议查找多级地址进行深入分析,比如道具数据和道具格子地址,以及道具使用call调用等,这样可以完成一些变态功能的开发,比如无限道具,无限加分等操作。在本文中使用修改座位号来进行秒杀的做法还是比较新颖的,利用游戏的这个bug来直接快速的实现秒杀功能。因此在外挂开发的实践中,一定要尽可能多的尝试,也许就会有意想不到的收获。
5 ^/ c, l) _7 U- H) t/ r8 e2020年外挂程序基本上已经用易语言来制作了。易语言外挂学习教程:http://www.inhsoft.com/forum-49-1.html
3 Q2 e" W( B( ]: d/ f) m; ^4 E' ], g* Y! A  {

本帖子中包含更多资源

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

x
回复

使用道具 举报

avatar

0

主题

4

帖子

2

积分

程序员

Rank: 1

金币
0
巨币
8
积分
2
在线会员 发表于 2022-8-31 12:15:30 | 显示全部楼层
楼主,下面的易语言帖子没了啊,打不开,404
回复

使用道具 举报

avatar

0

主题

1

帖子

1

积分

程序员

Rank: 1

金币
0
巨币
5
积分
1
在线会员 发表于 2022-9-26 12:47:03 | 显示全部楼层
可以定制一个外挂辅助吗
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-12-3 07:29 , Processed in 0.051341 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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