30659653 发表于 2020-4-5 17:17

天龙N部游戏逆向分析

本帖最后由 30659653 于 2020-4-7 16:10 编辑

**** Hidden Message *****
==================

武侠游戏的核心首先是一套挂机功能.能自动打怪,寻路,检测血量自动吃药,捡东西.

在追数据之前,要说的一句话是:一定要懂正向,了解数据结构,脑中构思功能间的调用关系.
比如打怪功能.,点击怪物之后触发的功能调用可能如下
鼠标点击CALL
{
      ..判断点的什么东西call
      {
            ....选中怪物call
            {
                ......走路call
                {
                  ..........攻击call
                  {
                        技能CALL
                        {
                            ...
                            ...
                        }
                  }
                }
            }
      }
}


这是调用关系的构思,同时还要捋清楚数据结构,比如技能对象的结构
struct 技能对象
{
技能ID
当前是否可用
攻击距离
消耗MP
伤害值
恢复值
技能类型
冷却
学习等级
}

脑中只有有了框架才会有突破口和追的方向.

接下来开始正式工作,首先要把人物自身对象结构找到.这个突破口比较多,比如利用人物的血量变化搜索到HP(同理MP/真气等) ,只要找到人物的一个属性(HP),那么基本等于找到了人物对象
http://note.youdao.com/yws/res/169/DE8AE0390D384690A37B4F4D96D8B6B2

左上角数值显示,人物当前血量为3871,进入CE搜索四字节的3871
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/93F0A75952C54E93B6A85DE6F64AF03A/1146
然后,想办法让这个血量变化,换装备/掉血/吃药.这里我选择吃药,比较方便.
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/904ED51519EB4A75B6A01E8B530DDED6/1151
再次搜素4733

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/26BABA36415748F3A58E9919D366125E/1154
直接得到一条线索.接下来要做的就是追数据来源,所有新手们都知道,直接搜到的地址下次开游戏就不一定是这个地址了.要追到他的来源(基址),基址是固定不变的(游戏更新会变).

接下来开始追来源
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/E024573AB5AF4C5FA03DFDD8FD86CEDB/1164
在找到的血量 右键=>查找是什么写入这个地址. 弹出来的页面没有变化,因为我们还没有改变血量,就没有写入内容. 再次吃药!
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/B25550841685452E92C1023E17688A5D/1170
血量上升的同时,收到一条写入数据. 观察这条代码不难理解,将新的血量写入到人物血量地址.,eax是新的血量,是存储的血量.
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/2EBF1261EFBE4F67B3C592F73FB5CB65/1184

然后继续搜索ecx的值0x4F1FA458,看是什么地方存储了这个值.记得标选HEX(16进制)
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/1C293A0B68AA4B6ABD180D71B2492DC7/1189

将得到的结果 右键点击=>是什么访问    这里不需要再找写入了,找访问就可以(它存储的不再是人物血量了,而是存储的人物某个结构的指针,是不停的访问这个结构的,所以通过访问就能得到数据)

如上图所述,都是+0x4的偏移,在选择的时候有两个选择方法:
1.不要选这种左右都是同一个寄存器的,会让你分析的时候不知道给你的数值是左边的还是右边的.具有干扰性


2.尽量不要选择来源是eax的,因为eax还可以作为call的返回值,容易追错地方.(纯新手容易犯错)
(什么是call的返回值??在写C语言代码的时候每个函数都可以给他写一个返回值,return给一个东西.那么在汇编代码里面,所有的call只要有返回值都会在call内部的结尾赋值给eax)

继续,我们选中一行合适的代码继续往下分析.追0x51E539F8

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/0B333D6190EE4667BDFBEBFC6FA72974/1230
得到三个结果,都选中,数量不多,挨个右键查看访问.发现只有第二个有访问数据.所以其他两个不是我们的目标/

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/0534FDBA39ED442296A6CC58A5FFB8EF/1234
从第二个得到如下图数据

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/BE96052B7EC44B67B8DE14008C3121F1/1240
我们继续选择合适的一行追.0x423E5DC8

又得到这么多数据,继续按照前面的方法挨个访问.

其中两三个数据都有访问,并且访问得到的偏移不同,这时可能有的数据特别难追追不通,也可能每条数据都可以使用.需要我们都去追一下,我已经挨个试过了都没问题都能追到,最后我选择的追+54的偏移.


接下来再次搜索我们便得到了四条基址

这个时候还不要高兴的太早,还有几个要注意的地方!!!
第一,一定要考虑这个游戏是不是模块动态加载.如果是那么基址一定要用模块+偏移的方式来写,如果不是,那么绿色的地址可以直接用.很巧,这个游戏是动态加载的.双击基址就可以查看他的模块+偏移



这才是他的最终结果.
还有一点就是,尽量使用主模块+偏移. 这个游戏的主模块就是Game.exe
我再双击另一个基址大家看一下他的模块+偏移是什么

是一个陌生的模块,可以用但没必要.

这时一整条人物血量的基址得到了.
[[[[+54]+1a0]+4]+2D00]//人物血量
这个时候需要读者思考一下.大家都写过结构体,用过结构体指针+偏移表示某个成员. 也就是说人物血量作为人物结构的一个成员,他的偏移是2d00,那么是不是表示在同一层下面还有其他成员.
为了方便观察我们打开OD附加游戏
(附加过程中会发现附加失败,因为咱们用CE下过写入和访问断点.只要点一下ce的小电脑图标重新选择一下游戏进程就可以了.)



在OD中 dd 4F1FD158就直接看到了血量的数据(16进制的),然后再dd 4F1FD158-2d00就是本层结构的头部. 我们从头开始看看,看着感觉像是什么数据都把他转换为10进制在游戏里找找对比一下

比如上图,看到一个1F,选中之后右键修改,显示10进制位31.回到游戏观察一下人物属性,人物的等级为31

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/4723EA7CC4F14301927C964DBAEA7641/1327
那么2d00改为6c就是表示人物等级
就继续往下翻,或者说需要什么人物属性就到这里找什么.我把我找到的直接分享给大家.
+38//名称
+6C//等级
+80//称号

+2d00 //当前血量
+2d04//当前蓝量
+2d08//拥有经验
+2d14//精力
+2d18//精力上限
+2d1c//活力
+2d20//活力上限

+2d50//体力
+2d54//定力
+2d58//身法

+2d60//力量
+2d64//灵力
+2d68//外功功力
+2d6c//内功功力
+2d70//外功防御
+2d74//内功防御

+2d78//生命上限
+2d7c//蓝量上限
+2d88//命中
+2d8c//闪避
+2d90//会心攻击
+2d94//会心防御

然后大家观察发现,这个结构下面并没有人物的坐标.看来游戏把坐标结构和人物属性结构分开了.
[[[[+54]+1a0]+4]+2D00]//人物血量
观察一下这行数据. [+4]下面是人物结构,坐标不在这里他有可能在[+8]或者说他可能在前面的几层结构下面,可能在+54也可能在+1A0.这样一来范围太广无从下手.
方法有两个:
1.重新打开CE搜索人物地址,和搜索血量一样,不过人物坐标是个float(浮点)类型,不要选错
2.利用网上的遍历工具一层一层找坐标

我都用过了,方法不再展示,直接贴数据:
[[[+54]
      +2C//人物X坐标
            +30//人物Z坐标
      +34//人物Y坐标


这里我们所需要的人物属性已经搜完了.接下来是找怪物
找怪物的话突破口在哪,从什么地方下手呢.打开怪物血量看一眼,不显示HP数值,也不显示MP.
只有怪物ID露在外面,那就搜索怪物的ID:花港毒蜂



得到800+数据,我们跑到别的地方,让身边的怪物不再是花港毒蜂,因为我们要找身边怪物,存储身边怪物的数组或者链表等结构是一直存在的,当我们身边怪物变成小狗,他就会存储小狗.
那么我们去别的地方看看,搜ID:白堤柳鬼




出去第二个带身 字的 ,就是我们要的结果.那么哪些名称才是在怪物对象下面呢.???
我给大家分析一下,我们都学过类,学过继承,无论是人物还是怪物,游戏程序员在写的时候会有一个父类,然后人物和怪物会继承那个父类.在内存中观察的话,父类结构放在子类的头部,也就是说,人物和怪物对象的头部结构应该很相似.我们就利用这一点,用得到的怪物名称地址减去0x38,dd一下(因为人的名称偏移是38)
首先人物对象的头部结构是这样的

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/131BF85A3DA648E2B4900425F406E449/1405
然后挨个dd得到的数据-38,最后有一个比较相似的,其他的都截然不同,如下图

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/89D0E09A121041A99C06017F102960EC/1426
验证一下,+6c也是等级,和人物的一样,说明没找错
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/FF5E9EB09A2E4BA2A99A38545967E04E/1438

上面的这个过程极其麻烦,要忍住寂寞,保持耐性.

基础到这里结束,接下来是重点部分了,寻找怪物遍历

我们在头部下硬件访问断点,
因为周围的怪物是在不断变化的,怪物列表在不停的访问怪物对象,所以我们要在怪物对象地址处下断


断在上图位置,这个游戏大部分是二叉树结构,大家做好心理准备,我开始走一次正常分析路线,把路上的坑给大家分析一遍
这个eax就是咱们下断的怪物对象,并且发现每次下断点eax在不断变化,说明前面有代码把所有的怪物都遍历了一遍,那么咱们就追eax的来源就会找到怪物遍历的地方.开始追!

直到最后追到这么一个地方,要继续追eax了.但是eax上面有个call,那么我们需要进入call追eax,给call下断点,断下之后按F7进入call内部,这时下面这个结构我们一步步分析


如下图的循环就是二叉树遍历,回想二叉树在C语言中是什么样的写法,先传递一个树根节点先遍历左子树,然后遍历右子树.

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/EE739F0DDB58449D8B9C6201EA6B8834/1481
在循环中,就是+0得到左子树   就是+8得到右子树. 通过循环把所有节点扫描出来

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/7957618A9C94481A8EDD235C56823FC5/1483
那么这个树根节点是谁呢?就是这个循环头部的eax,然后开始追她的来源.来自,在追esi

esi来自    //[+4],再追ecx



在外层得到一个基址,不要忘记是动态加载,点击E按钮查看所有模块,找到主模块Game.exe


Game.exe的地址是00BB0000


然后用166ABC0-00BB0000得到偏移ABABC0
Game.exe+ABABC0(和人物基址偏移一样)

这个时候我们得到了树根然后观察二叉树结构也能知道遍历的规则,最后就能得到所有的二叉树节点.
这里就可以编程实现遍历了,我们是在逆向分析游戏,就不教学写代码了.代码不会写的朋友要多敲代码.
我们写代码便利观察发现周围的花草树木NPC怪物人物宠物全部遍历出来了,这是什么情况.我们得到的竟然不是怪物二叉树而是所有环境对象的二叉树.

掉进坑里了,这个时候思考一下文章开头所说的游戏结构.
我们给怪物对象下断点断在了大环境对象中,那么他细致分类应该是在遍历结束之后.我们回到给怪物对象下断点断下的地方.

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/5D1E236DD1674BA4BCA7845A5747EB9C/1542
这个地方的eax还是大环境中的所有对象,那么下面的代码应该会有细致对象的分类遍历

D:\weixinobU7VjmLCuVLSHl9apKGn-NmEXzU\92b1b286486040c18b0edfca5a0bcf09\clipboard.png
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/3296572B4C11495B8CEE5062942C6CF2/1546

下面的代码就是这些,一行一行分析并没有做分类处理,然后进入每个CALL看看,没有任何异常,直到最后一个CALL,里面是一个二叉树结构!!!!
这个地方进行判断,如果对象头部是-1也就是FFFFFFFF就跳转到最后一个call(新的二叉树遍历)


call内部结构如下图所示

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/136E0CF6B5E84261A5B8446E1C85C685/1556
我们按照之前的方法可以轻松找到树根.内部遍历也和之前的遍历一样.
最后遍历出内容发现.得到的内容范围确实缩小了.只剩下了玩家.自己.NPC.怪物.掉落物
我们要细分就需要手动分析对象结构了.分别拿出一个类型,挨个对比发现,在便利的道德节点下
+14]+20]+8]表示的是对象的类型
+14]+20]+8]//分类标志//6其他玩家//4npc(4包含怪)//8自己//1凋落物//9珍兽
这个过程需要耐心思考耐心比较,过程很痛苦.

在二叉树遍历的过程中,我们需要对这个+14]+20]+8]进行判断筛选怪物

经过细化我们找到了,npc和怪物类型是4,但是该怎么区分npc和怪物呢?如果不区分的话打怪就会选中NPC从而出错.
我在结构中继续找,没有找到区分NPC和怪物的地方,那么只能能从另一个思路下手了.既然打怪会失败.那么会有什么提示呢.???进游戏看一下
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/58F1F8295CBD47749482C2FA94A59C70/1584
他提示不能攻击此目标,进CE搜这句话


把这个地址放到OD中dd然后下访问断点.再回到游戏攻击NPC,触发断点.看看是什么地方调用了它

断下之后点击一下上方的K按钮.调用来自都会显示出来


https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/474516F5D6764DB9B0C7616C439A2009/1594
然后我们给所有调用来自主模块的地方下断点.这些地方可能就是打印不能攻击那句话的CALL
下断之后 运行游戏,先不要进行任何攻击,如果哪些断点自己断了就把他删除,说明这个地方不是相关功能CALL,(功能CALL不会自己没事乱运行)

然后选一个NPC攻击,这些断点回一次断下,按照断下的顺序,给这些断点12345编号排序

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/E3E569BAD99A4608AD179A1C2CF17CB1/1628
然后再选一个怪物进行攻击,发现他没有运行编号5的断点!!!!!!!
说明编号4内部进行了判断.重点分析编号4
问题又来了,这个函数的内部代码太多.那个地方才是判断呢.
我是用的方法是,头部下端,然后攻击NPC从上到下运行一遍,做一下标记
然后攻击野怪再运行一遍.找到他们那些代码运行了哪些没运行,没运行的代码前面的跳转就是关键判断,最后定位在了这个CALL.就是怪物NPC判断CALL
选中人物自身返回1,选中怪物返回0,选中NPC返回2
那么我们只需要把它添加进入二叉树中,把返回值为0的对象选出来进行攻击即可.

另外一件需要判断的事情是,打怪不能乱打不能看见怪物就上去打,为了考虑效率,先打距离自己最近的怪物,那么就应该在二叉树遍历中取出怪物的XY坐标和人物自身的XY坐标,计算出两者的X差值和Y差值,利用勾股定理计算出两者距离.需要注意的事情是,数据类型是float,不要写错,容易出错

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/F60A50165FAC4E9F81DB07CD321A187A/1740//角色位置
float RX = *(float*)(Base1 + 0x2C);float RY = *(float*)(Base1 + 0x34);
//怪物位置
float GX = *(float*)(Attribute0 + 0x1E8);float GY = *(float*)(Attribute0 + 0x1EC);                                                      
//计算
float tempjuli = sqrtf(labs(RX - GX) * labs(RX - GX) + labs(RY - GY) * labs(RY - GY));


到这里,怪物筛选完成了,接下来是选中怪物的实现
选中怪物如何下手分析呢
我作为一个新手,目前能想到的起手方法就两种,
第一种就是利用发包CALL追功能.因为每个功能都会发包,只要从发包call往回走就能找到功能,但是线程发包除外,线程发包的话需要先追到线程外的数据来源,然后再往回追才是功能CALL
第二种是找突破口(简单说法),比如,我想找某个动作的调用call,可以先找到动作列表,然后得知某个动作的对象地址,然后给他下访问断点,使用动作时就会断下,然后可以追到动作.再比如想追走路call,那么可以从人物的状态下手.静止不动可能状态为0,走路起来,状态改变,(一般改为1,也可能23456),最后搜索到人物状态的地址.那么给这个地址下写入断点,进行人物移动就会断下,就能找到功能call

我利用的是发包追CALL,为什么要用发包呢.游戏内的操作它是需要服务器去进行判断然后实现的,比如你打死了一个野怪,那么你需要告诉服务器你打死了野怪.

发包三大函数send sendto WSASend,ctrl+g分别输入这三个函数下断点,哪个正常断下就说明游戏用的哪个发包函数.如果ctrl+G找不到这三个函数,可以在函数名前面输入模块ws2_32.send这样去书写.
https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/ADABAE302080495CBB3A3F27ABBEC8DE/1668

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/E4737A817E0E4BEB9A0CB938441F2628/1676
最后我们找到了,这个游戏使用的send发包.
在send函数头部下断点,然后回到游戏右键选中一个怪物,断点断下.
堆栈数据如图:

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/FE65EF05A89F4793981A4B99D35A5A74/1681
data就是他的数据包,size是他的数据长度,
因为根据发包函数往回一层层的追发现这是线程发包,那么就需要在data右键数据窗口跟随. 在2c范围内给合适的一行数据下写入断,(删除发包函数的断点),然后会断在一个地方,再次运行起来,选择一只野怪,又会断下,这个时候就可以不停的返回上一层,把所有经过的主线程模块CALL都下断点(这些CALL中存在的选怪功能CALL),然后运行起来之后把自动断下的断点删除.   再次选怪,后把所有断下的CALL都挨个分析,看看他们的参数,找一个适合使用的CALL作为我们的选怪CALL

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/A4445EDF496048BEB985428F6CC1F466/1705
最后确定了这个CALL比较好用,只有两个参数.第一个参数 push1 第二个参数是目标ID.(在怪物对象下面可以找到)
然后传入ecx,就可以调用.

选怪功能完成了.接下来就是打怪
打怪同样可以用发包函数返回的方式找到一个技能调用CALL,只需要传入目标ID和技能ID就可以释放技能,但是这样找到的CALL会有距离限制,不会自动寻路.
技能CALL
push 0xBF800000
push 0xBF800000
push 0xBF800000
push 0x26                        //若是攻击技能,则为目标ID
push 0xFFFFFFFF
push 0xFFFFFFFF
push 0x0                        //技能ID
mov ecx,0x2C72DBA0      //[[+128]+1b4]
call 0x01728470                //GAME.EXE+408470
017275A1   .F3:0F1087 E00>movss   xmm0, dword ptr
017275A9   .8B87 C8000000 mov   eax, dword ptr
017275AF   .83EC 0C       sub   esp, 0C                                        ;esp压入三个参数BF800000
017275B2   .8BCF          mov   ecx, edi                                       ;[[+128]+1b4]//game.exe+ABA0D0
017275B4   .F3:0F114424 0>movss   dword ptr , xmm0
017275BA   .F3:0F1087 DC0>movss   xmm0, dword ptr
017275C2   .F3:0F114424 0>movss   dword ptr , xmm0
017275C8   .F3:0F1087 D40>movss   xmm0, dword ptr
017275D0   .F3:0F110424   movss   dword ptr , xmm0
017275D5   .FFB7 D0000000 push    dword ptr                            ;非攻击技能:FFFFFFFF /攻击能能:野怪ID
017275DB   .83EC 08       sub   esp, 8                                       ;esp压入两个参数FFFFFFFF
017275DE   .8BD4          mov   edx, esp017275E0   .8902          mov   dword ptr , eax
017275E2   .8B87 CC000000 mov   eax, dword ptr
017275E8   .8942 04       mov   dword ptr , eax
017275EB   .FFB7 C4000000 push    dword ptr                            ;209/20A/217/21E四个技能ID 15骑马 0普攻
017275F1   .E8 7A0E0000   call    01728470            

并且在调用这个技能封包CALL之前你需要先确定自己的技能的ID,需要遍历技能背包.因为有太多局限性,还需要寻路,我们暂时不用这个去打怪.我们可以使用按键CALL打怪.

让游戏内自动按下F1实现调用技能,这样的好处是按键之后他会自己跑到打怪的距离内.不需要我们再去计算距离.

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/99D716973BE944DFB8928D3C7F8715DC/1764
下面写一下按键CALL的寻找方法.
前面我们用的发包法,这里我们利用突破口.按下F1之后能不能用他会去判断F1上面有没有技能.,我们不断的改变F1上面的技能得到F1-F10的数组
打开CE,F1放上一个技能搜索未知初始值

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/29B93642CC0A44EF929D0279DE4E7E2F/1725
切换技能位置搜索变动的数值.

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/F629B99FEA4A49F3A1CA1ED047B5BA94/1762
移走技能搜索0

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/84797A24533B4ED781F1862B2546F6DF/1770
重复上述步骤,将最终得到的几个结果分别放到OD中dd一下,然后下访问断点,之后实用技能访问他们.
和前面的找CALL方法一样,在断下的地方开始返回,每个返回得到的CALL都有可能是按键CALL.
接下来分析剩下的断点的参数.找一个最合适的CALL作为按键CALL

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/E3CF4ACBB23E45B6AE04C6228A6C72D1/1782
最后定位在这里,只需要传入一个1和一个下标(0-9)(F1-F10,C语言下标从0开始)就可以调用技能了.

到这里打怪功能已经实现了,我们需要吃药,可以把药品放在技能栏,检测到血量低于多少时按一下相应的键位.(人物血量前面已经得到基址)

https://note.youdao.com/yws/public/resource/a26f39ed6d8e156a0ad79e7d4974aab0/xmlnote/9A31AACBB5E04C55A9239D4FC0A5542B/1796
本篇文章仅供于逆向学习,请勿用于非法用途,利用所学发掘漏洞完善软件,为游戏安全做出贡献.
有兴趣学习的小伙伴可以留言一起学习,另外,急需HB,想攒HB换个ID哈哈哈








30659653 发表于 2020-4-5 17:29

日 链接也没发......脑子坏了

黑猫 发表于 2020-4-5 22:12

大神你好~! {:5_117:}

我是墨白!! 发表于 2020-4-5 22:47

前来观看大佬操作

liuhao1909 发表于 2020-4-5 23:21

谢谢分享,学习一下

迟是 发表于 2020-4-6 08:37

前来观看大佬操作

gx8451 发表于 2020-4-6 10:32

膜拜大神!来学习了!

2293225618 发表于 2020-4-7 20:27

游戏哪里下的,加我一个

309847695 发表于 2020-4-7 22:18

真是厉害!!!

wyip 发表于 2020-4-7 23:28

谢谢分享。。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 天龙N部游戏逆向分析