游戏外挂原理解析与制作,游戏外挂原理解析

玩过Computer游戏的同查对于外挂肯定不素不相识,可是你在用外挂的时候有未有想过怎么样做一个外挂呢?(当然用外挂不是那么道义哈,呵呵卡塔 尔(英语:State of Qatar),那大家就来看一下怎样用python来创立八个外挂。。。。

游戏外挂原理解析与制作,游戏外挂原理深入分析

  本章目的在于讲授如何运用高等语言依照变量数值搜索内部存款和储蓄器地址。涉及代码以C#为例。

  我用C#写了五个WinForm格局的德姆o,分界面如下:

  威尼斯网址开户网站 1

  源代码:

        //血量初始值
        private int value = 1000;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 刷新界面:将最新的血量显示在界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_refresh_Click(object sender, EventArgs e)
        {
            this.label_display.Text = value.ToString();
        }

        /// <summary>
        /// 更新血量:将自定义的数值写入血量变量
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_update_Click(object sender, EventArgs e)
        {
            int iVaule = -1;
            bool ParseResult = int.TryParse(this.textBox_value.Text,out iVaule);
            if (ParseResult)
            {
                value = iVaule;
                this.label_display.Text = this.textBox_value.Text;
            }
        }    

  很简短的多少个德姆o:二个名字为value的变量,整数型,付与其最初值1000;七个开关:修正按键点击后把文本框的数值赋值给value,並且更正标签文本=矫正后value的值;另一个刷新开关,点下后更新标签文本=value的新式值。

  

  回看上黄金年代章节,我们讲到查询数值的内存地址需求用到五个函数VirtualQueryEx和ReadProcessMemory:

  当中VirtualQueryEx的第几个参数是一个用于吸收接纳内部存款和储蓄器新闻的结构体指针,来看一下重新组合这些结构体的分子

        //接收内存信息的结构体
        public struct MEMORY_BASIC_INFORMATION
        {
            //区域基地址
            public int BaseAddress;
            //分配基地址
            public int AllocationBase;
            //区域被初次保留时赋予的保护属性
            public int AllocationProtect;
            //区域大小
            public int RegionSize;
            //状态
            public int State;
            //保护属性
            public int Protect;
            //类型
            public int lType;
        }

  那么些注释是自己从百度百科上摘抄的,更确切的解释提出查阅MSDN的API,上边贴代码的时候作者也会据自己的领会去解释涉及到的积极分子,但要么提出中肯学习Computer的操作系统原理本领真正调节那几个术语与它们的意思。特意贴出那生机勃勃段是自己觉着那是生机勃勃体外挂制作进度中最珍视的三个手续。套用大家现有的模板或然选择三番两回小编也会涉嫌的后生可畏多种协助理工科程师具去做到外挂的炮制,是很难成才的,一些闻名的嬉戏靠工具寻觅基址千辛万苦,独有慢慢的去精晓这么些API、通晓寄放器和汇编语言,本事走的更远。

 

  原归正传,笔者就一贯跟着实际测验来一步一步解说:

  1). 展开测量试验程序

  威尼斯网址开户网站 2

  程序的名目:WinMemory_威尼斯网址开户网站,Test

  威尼斯网址开户网站 3

  2). 依据上豆蔻年华章节通过进度名称获取PID=7956

  威尼斯网址开户网站 4

  3). 照旧上豆蔻梢头章节波及的通过PID=7956收获进度句柄Handle=1072

  威尼斯网址开户网站 5

  4). 通过Handle循环遍历可读写内部存款和储蓄器地址,得到字节数组。

 public void SearchAddress()
        {
            MEMORY_BASIC_INFORMATION MBInfo = new MEMORY_BASIC_INFORMATION();
            //获取结构体大小[单次读取字节数]
            int MBSize = Marshal.SizeOf(MBInfo);
            //从0x00开始查询
            StartAddress = 0x000000;
            //实际读取的字节数
            int ReadSize = 0;
            //从0开始查询,直到查询到整形的最大值2147483647
            while (StartAddress >= 0 && StartAddress <= 0x7fffffff && MBInfo.RegionSize >= 0)
            {
                //读取结果存入输出参数MBInfo
                MBSize = VirtualQueryEx(hProcess, (IntPtr)StartAddress, out MBInfo, Marshal.SizeOf(MBInfo));
                //如果实际读取到的字节数等于结构体MEMORY_BASIC_INFORMATION字节数,表示读取成功
                if (MBSize == Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)))
                {
                    //PAGE_READWRITE:允许读写的内存区。
                    //MEM_COMMIT:已分配物理内存[要找的数值确定了,那么内存肯定提前分配了]。
                    if (MBInfo.Protect == PAGE_READWRITE && MBInfo.State == MEM_COMMIT)
                    {
                        byte[] FindArray = new byte[MBInfo.RegionSize];
                        //把读取到的字节写入上面定义的数组byData中
                        if (ReadProcessMemory(hProcess, (IntPtr)StartAddress, FindArray, MBInfo.RegionSize, out ReadSize))
                            //如果读取的字节数无误
                            if (ReadSize == MBInfo.RegionSize)
                            {
                                //处理数据[对比分析]
                                DealData(DataArray, StartAddress);
                            }
                    }
                }
                else
                {
                    break;
                }
                StartAddress += MBInfo.RegionSize;      
            }

        }

   

  5).
将赢得的字节数组转变整型与1000伸开对照,将追寻到的富有结果保存到全局List.

public void DealData(byte[] DataArray, int StartAddress)
        {
            byte[] intBuff = new byte[4];

            for (int i = 0; i < DataArray.Length - 4; i++)
            {
                Array.Copy(DataArray, i, intBuff, 0, 4);
                int num = BitConverter.ToInt32(intBuff, 0);
                if (num == 1000)
                {
                    AddressList.Add(StartAddress + i);
                }
            }
        }

   看一下结出:

  威尼斯网址开户网站 6

   至此,德姆o中整形数值等于1000之处已经全体被我们找到了,下豆蔻年华章节疏解怎么着稳固我们所要查找的老大“1000”以致校勘其值。

 

  PS:转发请附带原来的作品路线: ,笔者已委托“维护合法权益骑士”为自己的篇章进行维护合法权益行动。

  应接关怀Wechat公众号[娱乐外挂原理剖析与创制],对本文有不明了的地点恐怕不一样的观点可以给自个儿留言,一定苏醒。

       威尼斯网址开户网站 7

本章意在疏解怎么着行使高档语言依据变量数值搜索内部存款和储蓄器地址。涉及代码以C#为例。
我用C#写了…

娱乐外挂原理剖析与创造,游戏外挂原理深入分析

  前三篇的博文结合了C#的德姆o对内部存款和储蓄器数据订正生龙活虎类的挂剖判了规律,利用C#语言调用Windows
API,我们实际早已写出了多少个粗略的内部存款和储蓄器扫描工具,可是它存在有的毛病,举例说只可以所搜索单生龙活虎类型数值(整型),只可以搜索分明的数值,举例1000、贰零零贰,而无法展开模糊寻找,比方搜索有个别值变小了,可能在某某区间内转移了等。

 

  笔者向来感觉语言只是风姿浪漫种工具,只要能够达到规定的标准纠正数值的目标,用什么语言都能够,以致能够匹配着各个语言和工具来成功大器晚成项数值的退换。其实骨子里中多如牛毛都是那样,因为每个语言有和睦的优势,举个例子C语言/易语言那类非托管的语言对底层操作的权限非常之大,非常是易语言,轻便上手加上不菲人曾经封装了大量的操作底层的模块,而C#、Java等优势就展现在应用层的卷入,API的灵巧调用。合理的应用言语的优势在它们长于的世界,对技巧保障开放的心境,不被封锁在言语层面工夫对各个娱乐进行剖析。

  

接下去的几篇小说保护传授[Cheat
Engine]那款内部存款和储蓄器修正器,近似的还或者有OD、金山游侠(那款工具未有色金属商量所究的意义,效用单意气风发化、对于指针和汇编的精通救助颇少),大家温馨包装工具耗费时间的老本实在是异常高的,何况这个工具已经具备很苍劲的效果了,大家得以利用这么些工具越来越好的了然原理。

 

  本章先讲一下差少之又少的接纳,大家本次就不写德姆o了,直接找四个小游戏举办测量试验。

 

  那几个是三目童子,笔者童年在小霸王游戏上玩的。

  威尼斯网址开户网站 8威尼斯网址开户网站 9

  

  我们近日观望的消息有:

   6格血  威尼斯网址开户网站 10 
   
  0个金币 威尼斯网址开户网站 11 
   
  2条命威尼斯网址开户网站 12

 

  那便是我们肉眼能收看的局地新闻,还会有人物坐标、道具器械等是现阶段不恐怕看见但实际存在的数值。

  

  以往大家开荒CE:威尼斯网址开户网站 13

  下图是它的主分界面:  

       威尼斯网址开户网站 14

  

  笔者那么些是比较老的版本了,首先点击Logo威尼斯网址开户网站 15,张开选拔进程的分界面。

  威尼斯网址开户网站 16

  从图标或然经过名称中能够观看,小编用赫色框出来的那些进度正是大家三目童子的游艺进程。

     威尼斯网址开户网站 17

  这一步的目标很鲜明正是获得该游戏进程的PID和句柄Handle

  

  大家点击展开,张开之后方可看出侧边控件已经化为可用状态了。

  威尼斯网址开户网站 18

 

  接下去大家就来尝试寻觅一下血量(6)那一个数值

  威尼斯网址开户网站 19

  

  大家在值中输入6,点击第一遍扫描,在侧面展示如下的列表,能够看看整个内部存款和储蓄器块中有2801个值为6
之处。

   威尼斯网址开户网站 20

  

  未来采用上大器晚成章节提到的法子,使得6这些值爆发变化,大家去撞一下小兵:

   威尼斯网址开户网站 21

  能够见见血量产生5格了

 

  这个时候把值更改成5后,点击重新扫描:

  威尼斯网址开户网站 22

  

  下图是找出结果,未有找到呼应的地址, 能够观望数据是 0

  威尼斯网址开户网站 23

  那就狼狈了,其实是因为我们的数值类型采用的是4字节,CE展开暗中认可4**字节搜索便是整形数,而原先的游艺机比不上明天有那么高的仓储体积,日常能以字节寄放的变量就定义为BYTE,所以我们再次起始搜寻,点击新的扫视威尼斯网址开户网站 24,然后下拉扫描类型为字节**。

   威尼斯网址开户网站 25

  

  这时按下第三次扫描,拿到以下扫描结果

  威尼斯网址开户网站 26

  能够看见 字节方式置放的变量高达686玖拾陆个,我们世襲撞一下小兵

  威尼斯网址开户网站 27

  好了,那下产生4格血量了,大家把CE供给扫描的值改为4,然后点击重新扫描

  威尼斯网址开户网站 28

  

  找到4个结果

  威尼斯网址开户网站 29

  在那之中 地址0x2D00044 的值一向在变化,我们得以消灭这么些地址

 

  那么在多余的五个地点中有未有寄放血量的地点呢,大家继续改换血量

  威尼斯网址开户网站 30

  血量产生八个格子了,我们对3重新开展寻找

  威尼斯网址开户网站 31

  

  结果如下图:

   威尼斯网址开户网站 32

 

  以往就剩下贰个地址0x2D0009第22中学贮存的字节值为3,大家来规定下那一个地点是还是不是是血量寄存的地点,大家点击该地方

  威尼斯网址开户网站 33

  

  然后点击箭头Logo威尼斯网址开户网站 34把她增多到待操作之处列表中

  威尼斯网址开户网站 35

  

  双击此记录的值

  威尼斯网址开户网站 36

  

  我们把值改进为6,大家再来看中游戏中的血量是不是跟着变化了,注意分界面上的血量只怕未有应声跟着变动,因为那类游戏独有在血量产生变化的时候才会去读取展现它的值,所以大家必要再去撞一下怪。

   威尼斯网址开户网站 37

  能够见见血量产生5格了,那表达改革成功了(修正6格血量后,撞一下怪减了大器晚成格血量,所以剩5格),大家再来看下CE的分界面

   威尼斯网址开户网站 38

  未有毛病,数值展现5,那样的话大家就接着CE那款工具完结了三回最功底数据的校正。大家看其实和大家写代码修正用的准则是平等的,就好像破解WIFI密码同样,穷举比较,找到正确的地点或密码。

  

  下意气风发节讲明动态地址指针和偏移的追寻。

  

  PS:转发请附带原版的书文路线:  ,作者已委托“维护合法权益骑士”为自家的篇章张开维护合法权益行动。

  应接关切Wechat大伙儿号[游戏外挂原理深入分析与创造],对本文有不亮堂的地点恐怕差异的见识能够给本人留言,相互交换合作进步。

    威尼斯网址开户网站 39

       扫码关心民众号

 

前三篇的博文结合了C#的德姆o对内部存款和储蓄器数据改过后生可畏类的挂解析了规律, 利用 C#
语言调用 Windows…

本人展开了4399小游戏网,点开了多个不盛名的玩乐,唔,做寿司的,有资料在一面,客人过来后揭发他们的渴求,你根据菜单做好端给她便好~
为何这么有难度?8种菜单记不清,点点就点错,鼠标还倒霉使肌肉劳损啥的伤不起啊……

第后生可畏要证明,这里的玩耍外挂的概念,和那多少个大型网络电游里的外挂可不一样,不能够自动打野,无法喝药无法隐敝放线菌壮观素……
那做这么些外挂有甚用?问的好,没用,除了可以浪费你或多或少时间,提升级中学一年级下编制程序本事,扩大一丢丢点点点点的做外挂的根基以外,毫无用项,要是您是以塑造四个惊天动地感草木不开则已大器晚成开立刻超神的外挂为对象复苏的话,或者要让您大失所望了,请及早绕道。我的目标不会细小略,就是半自动玩那款小游戏而已。

工具的备选

需求安装autopy和PIL以致pywin32包。autopy是一个自动化操作的python库,能够如法泡制一些鼠标、键盘事件,还是可以对显示器举办访谈,本来我想用win32api来模拟输入事件的,发现那一个用起来比较轻便,最厉害的是它是跨平台的,请寻找安装;而PIL那是有名了,Python图像管理的No.1,上边会表达用它来做什么;pywin32实际上不是必得的,不过为了便于(鼠标它在投机动着吧,怎样收场它呢),依然提议安装一下,哦对了,作者是在win平台上做的,外挂大概唯有windows客户供给吗?
截屏和图像处理工科具
截屏是赢得游戏图像以供解析游戏提示,其实并未有特别的工具间接Print
Screen粘贴到图像管理工科具里也足以。作者用的是PicPick,非常好用,而且个人客商是无偿的;而图像处理则是为了拿到种种音信的,大家要用它拿走点菜图像后保存起来,供外挂剖析决断。作者用的是PhotoShop…
不要告诉Adobe,其实PicPick中自带的图像编辑器也丰富了,只要能查看图像坐标和剪贴图片就超级饿了,只可是笔者习于旧贯PS了~
编辑器
本条笔者就绝不说了啊,写代码得要个编辑器啊!小编用VIM,您若愿意用写字板也得以……
原理深入分析

外挂的历史啥的本人不想说啊,有意思味请Google或度娘(注:非技巧问题尽能够百度卡塔 尔(阿拉伯语:قطر‎。

看那么些娱乐,有8种菜,各类菜皆有定位的做法,客户只要坐下来,头顶上就能够有四个图片,看图片就了解他想要点什么菜,点击左边原料区域,然后点击一下……不晓得叫什么,像个竹简相仿的东西,菜就做完了,然后把办好的食品拖拽到客商近年来就好了。

顾客头上显示图片的职分是平素的,总共也唯有两个职位,大家得以逐条深入分析,而原料之处也是定点的,每个菜的做法更是清晰,那样一来大家全然能够判别,程序能够很好的帮我们做出生龙活虎份少年老成份的美味并奉上,于是钱滚滚的来:卡塔 尔(英语:State of Qatar)

autopy介绍

github上有风流浪漫篇很科学的入门小说,固然是意大利语可是超轻便,然则笔者仍旧摘多少个本次用赢得的证雅培下,以突显作者很努力。

活动鼠标

1 import autopy
2 autopy.mouse.move(100, 100) # 移动鼠标
3 autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)

这一个命令会让鼠标飞速移动到钦定荧屏坐标,你精通如何是荧屏坐标的吧,左上角是(0,0卡塔尔,然后向右向下依次增加,所以1024×768显示屏的右下角坐标是……你猜对了,是(1023,767卡塔 尔(阿拉伯语:قطر‎。

不过某个不幸的,借令你实际用一下以此命令,然后用autopy.mouse.get_pos()获得一下脚下坐标,开掘它并不在(100,100)上,而是越来越小部分,举个例子作者的机械上是(97,99卡塔尔国,和分辨率有关。那么些运动是客商了和windows中mouse_event函数,若不清楚api的,知道那回事就好了,正是其一坐标不是很可相信的。像我相仿很好奇的,可以去读一下autopy的源码,笔者发觉她计算相对坐标算法不正常:

point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);
那边先做除法再做乘法,学过一些计算办法的就应有精通对于整数运算,应该先乘再除的,不然就能够时有发生相当大的抽样误差,如若他写成:

point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);
就能够准多了,即使理论上会慢一丢丢,可是自个儿也懒得改代码重新编写翻译了,差多少个像素,这里对大家影响非常的小~咱要吸收教导呀。

点击鼠标

1 #引入autopy模块
2 # ***
3 import autopy
4 autopy.mouse.click() # 单击
5 autopy.mouse.toggle(True) # 按下左键
6 autopy.mouse.toggle(False) # 松开左键

那个比较简单,不过记得这里的操作皆以十分非常快的,有希望游戏还未有反应过来吧,你就成功了,于是退步了……
所以必要的时候,请sleep一小会儿。

键盘操作

大家这一次没用到键盘,所以笔者就隐瞒了。
如何是好?剖析顾客头上的图像就能够,来,从获得图像初始吧~

开发你垂怜的图像编辑器,最初丈量啊~
大家得精通图像在显示屏的具体地点,能够用标尺量出来,本来直接量也是足以的,可是小编那边运用了镜头左上角的职位(也正是点1卡塔尔来作为参照他事他说加以考查位置,那样风姿洒脱旦画面有改善,我们只必要纠正三个点坐标就好了,不然每二个点都亟待再一次写一次可不是生机勃勃件欢喜的业务。

看最右侧的花费者头像上面的图像,大家须求四个点才可规定那几个限定,分别是图像的左上角和右下角,也正是点2和点3,。前边还大概有七个客商的岗位,只须要轻松的丰裕三个增量就好了,for循环正是为此而生!

生机勃勃致的,大家原材质的岗位,“竹席”的岗位等等,都足以用这种措施赢得。注意获得的都以相对游戏画面左上角的相对地点。至于抓图的不二法门,PIL的ImageGrab就很好用,autopy也足以抓图,为啥不用,作者上面就能够聊到。

浅析图像

我们那几个外挂里一定有难度的三个难题应时而生了,如何了解大家拿到的图像到底是哪叁个菜?对人眼……以至狗眼来讲,那都以叁个万分easy的难题,“风流潇洒看就精晓”!没错,那正是人比机器高明的地方,大家做起来很简短的事情,计算机却傻傻分不清楚。
autopy图像局限

即便您看过autopy的api,会意识它有三个bitmap包,里面有find_bitmap方法,便是在二个大图像里寻觅样板小图像的。聪明的您早晚能够想到,大家能够截下整个游戏画面,然后计划有所的菜的小图像用那一个措施风流洒脱找就驾驭哪些菜被叫到了。确实,意气风发起首自个儿也有如此做的扼腕,可是当下就丢掉了……这几个方法寻觅图像,速度先不说,它有个标准是“正确相称”,图像上有二个像素的卡宴GB值差了1,它就查不出去了。大家驾驭flash是矢量绘图,它把一个点阵图片展现在显示器上是经过了缩放的,这里变数就十分大,理论上平等的输入相通的算法得出的结果一定是均等的,可是因为绘图背景等的涉及,总会有一丝丝的差别,正是那点间隔使得那一个能够的函数不可采纳了……

可以吗,不能够用也是好事,不然小编怎么引出大家高明的图像深入分析算法呢?

貌似图像查找原理

言听计行你一定用过Google的“按图搜图”功能,若无,你就落伍啦,快去试试!当你输入一张图纸时,它会把与那张图相仿的图像都给你显示出来,所以当你找到一张乐意的图想做壁纸又以为太小的时候,基本可以用那么些法子找到符合的~

我们将要动用和这么些日常的法规来推断客户的点餐,当然我们的算法不容许和谷歌那般复杂,博客园上有一篇十分不错的随笔陈述了那个标题,有意思味的能够看看,笔者一贯付出完毕:

1 def get_hash(self, img):
2     #使用PIL模块缩放图片,***
3     image = img.resize((18, 13), Image.ANTIALIAS).convert("L")
4     pixels = list(image.getdata())
5     avg = sum(pixels) / len(pixels)
6     return "".join(map(lambda p : "1" if p > avg else "0", pixels))
7

只要你需求四个两全其美的上学沟通条件,那么您能够思索Python学习交换群:548377875;
假令你供给少年老成份系统的求学质地,那么您能够伪造Python学习调换群:548377875。

因为这是类的叁个艺术,所以有个self参数,无视它。这里的img应该传入二个Image对象,能够使读入图像文件后的结果,也得以是截屏后的结果。而缩放的尺码(18,13卡塔 尔(阿拉伯语:قطر‎是自个儿根据真实景况定的,因为花费者头像上的菜的图像基本便是其意气风发比重。事实表明这一个比重如故挺主要的,因为我们的菜有个别雷同,如若比例不相宜压缩后就失真了,轻易误判(笔者此前就吃大亏损卡塔 尔(英语:State of Qatar)。

获得三个图片的“指纹”后,我们就足以与行业内部的图样指纹相比较,怎么对比呢,应该运用“汉明间隔”,也便是三个字符串对应地方的不等字符的个数。达成也很容易……

def hamming_dist(self, hash1, hash2):
return sum(itertools.imap(operator.ne, hash1, hash2))
好了,我们得以用策动好的正经图像,然后预先读取总计特征码存款和储蓄起来,然后再截图与它们相比较就好了,间距最小的要命正是呼应的菜,代码如下:

 1    def order(self, i):
 2        l, t = self.left + i * self.step, self.top
 3        r, b = l + self.width, t + self.height
 4        hash2 = self.get_hash(ImageGrab.grab((l, t, r, b)))
 5        (mi, dist) = None, 50
 6        for i, hash1 in enumerate(self.maps):
 7            if hash1 is None:
 8                continue
 9            this_dist = self.hamming_dist(hash1, hash2)
10            if this_dist < dist:
11                mi = i
12                dist = this_dist
13        return mi

此地有三个50的开端间距,假使截取图像与其它菜单比较都当先50,表达什么?表达现行反革命十三分地点的图像不是菜,也正是说客商尚未坐那地点上吧,大概大家把嬉戏最小化了(总COO来了卡塔尔国,那样管理十分重大,免得它放肆找一个最周围但又完全不搭边的菜举办管理。

机动做菜

这些标题很简短,大家只须求把菜单的原质地记录在案,然后点击相应岗位便可,我把它写成了多少个类来调用:

 1 class Menu:
 2    def __init__(self):
 3        self.stuff_pos = []
 4        self.recipes = [None] * 8
 5        self.init_stuff()
 6        self.init_recipe()
 7    def init_stuff(self):
 8        for i in range(9):
 9            self.stuff_pos.append( (L + 102 + (i % 3) * 42, T + 303 + (i / 3) * 42) )
10    def init_recipe(self):
11        self.recipes[0] = (1, 2)
12        self.recipes[1] = (0, 1, 2)
13        self.recipes[2] = (5, 1, 2)
14        self.recipes[3] = (3, 0, 1, 2)
15        self.recipes[4] = (4, 1, 2)
16        self.recipes[5] = (7, 1, 2)
17        self.recipes[6] = (6, 1, 2)
18        self.recipes[7] = (8, 1, 2)
19    def click(self, i):
20        autopy.mouse.move(self.stuff_pos[i][0] + 20, self.stuff_pos[i][1] + 20)
21        autopy.mouse.click()
22    def make(self, i):
23        for x in self.recipes[i]:
24            self.click(x)
25        autopy.mouse.move(L + 315, T + 363)
26        autopy.mouse.click()

那是本外挂中最没才具含量的二个类了:卡塔 尔(英语:State of Qatar)请见谅小编从未写注释和doc,因为都很简单,相信你明白。

相关文章