12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 671|回复: 0

【原创】CE教程:《荒野行动》从内存数据修改到代码注入(不再更新)

[复制链接]
发表于 2019-8-19 11:03:55 | 显示全部楼层 |阅读模式
(请注意:本帖内容最后更新于2018年1月21日)

本教程仅供学习交流内存修改、反汇编、代码注入等学习用途使用,请勿用于非法用途。

2018年1月26日有回帖称,已被秒封,请尽可能小心地进行破解。

我已经卸载游戏了,教程不会继续更新了。

以下内容其实算不上教程,就是我在学习使用CE的时候摸索出来的一些方法吧。我对这个游戏本身已经没什么兴趣了,大部分只是在学习调试技术吧。

一、人物物品变黄色

2018年1月8日之后,某易似乎对hyxd的内存数据进行了简单的检测,原来的通过基址+偏移的方法改数据会被秒封。

物品红色gamma值地址:[[["hyxd.exe"+1B9A678]+AC]+E0]+E0,float类型,直接把该数值改成1000会导致账号被封,具体原因暂时不清楚。

研究过程:

1. 首先这个游戏有简单的反调试,Cheat Engine 菜单 > Edit > Settings > Debugger Options,改一下设置Debugger method: Use windows debugger,Debugger interface config: Try to prevent detection of debugger,简单粗暴的反反调试就可以了,至于“Try to prevent detection of debugger”具体做了什么暂时不太清楚,有待进一步研究。



2. 然后就可以对这个地址进行“Find out what accesses the address” > “Find what accesses the address pointed at by this pointer” 可以看到两条指令



经过测试,第一条是真正有用的代码,第二条大约每1秒触发1次,可能就是用来检测数据异常的。

既然直接改内存数据不太方便,那么不用内存数据修改的方法怎么办呢?

3. 代码注入



这三条指令,第一条是读取红色亮度,第二条是乘以白色亮度,第三条是存到[edi+40]。

代码注入原理很简单,就是二话不说,直接给[edi+40]赋值float的1000。

这块内存区域足够我们注入了,不需要申请新内存,直接在这块内存上修改即可。

原始代码:8 + 5 bytes

[Asm] 纯文本查看 复制代码hyxd.exe+64F3EA - F3 0F59 86 EC000000   - mulss xmm0,[esi+000000EC]hyxd.exe+64F3F2 - F3 0F11 47 40         - movss [edi+40],xmm0

修改后代码:7 + 6 * 1 bytes

[Asm] 纯文本查看 复制代码mov [edi+40], (float)1000.0nopnopnopnopnopnop

这个就是最简单的代码注入了。

4. 然后就是在CE中实现了



[Asm] 纯文本查看 复制代码[ENABLE]"hyxd.exe"+64F3EA:  mov [edi+40], (float)1000.0  nop  nop  nop  nop  nop  nop[DISABLE]"hyxd.exe"+64F3EA:  mulss xmm0,[esi+000000EC]  movss [edi+40],xmm0

保存到代码列表即可。

然而CE的自动汇编似乎每条指令不是同时写入的,连续的开关这个代码注入有时直接导致程序崩溃,所以我改为使用db直接拷贝字节数组,这样可以一次性写入,防止程序崩溃。


[Asm] 纯文本查看 复制代码[ENABLE]"hyxd.exe"+64F3EA:  db C7 47 40 00 00 7A 44 90 90 90 90 90 90[DISABLE]"hyxd.exe"+64F3EA:  db F3 0F 59 86 EC 00 00 00 F3 0F 11 47 40





这样基本可以完成了,2018年1月18日测试不会被封号。



二、摄像机抬高

关于这个游戏的摄像机位置,大家可能都知道了

人物站立搜1.65,蹲下搜1.30,趴下搜0.76,只剩下一个地址,这是跟随摄像机的高度。

不要直接修改这个数值,队友观战的情况下可以看到和你相同的画面(他们的视野也是提高的,或者说服务器会收到你修改的异常数据)。

对这个地址使用上述同样的方法,找出写入的代码,然后在原始内存上代码注入即可,比如设置成30,就可以拥有一个头上的无人侦察机了。

然而,简单的内存注入会使摄像机顶在天花板上,极其影响使用体验,所以,我们深入研究一下这段代码。

1. 人物站立搜1.65,蹲下搜1.30,趴下搜0.76,只剩下一个地址

2. Find out what accesses the address,只有一条指令,然后 Show disassembler



看到两条有用的指令

[Asm] 纯文本查看 复制代码hyxd.exe+23954D - F3 0F10 86 C4000000   - movss xmm0,[esi+000000C4]hyxd.exe+239555 - F3 0F11 45 C8         - movss [ebp-38],xmm0

把[esi+000000C4]赋值给[ebp-38]

于是我们就使用 Find out what addresses this instruction accesses 找出这条指令访问的地址



可以看到,找到的地址的值一直在变啊,我们下断点看看ESP(Stack Pointer,栈指针)的值,ESP和EBP比较接近,所以[ebp-38]指向的是一个栈内存的数据,很麻烦。

大家都知道,堆内存是分配完只要不销毁、无论怎么在函数间传递或调用都会一直存在的,也不会被其他数据占据,而栈是只在函数调用期间存在的,一旦这个函数调用结束,别的函数就会复用这块栈,这块数据会频繁的改变,所以栈内存根本没法使用普通方式修改,必须依赖代码注入。

[Asm] 纯文本查看 复制代码mov [ebp-38],(float)30.0nopnopnopnopnopnop

这样就可以了,非常简单,不过顶在天花板上的问题还没解决呢。

3. 虽然栈是短暂的,在线程外访问会得到不确定的结果。但是,如果我们下了断点,让程序在这里沿着游戏的线程执行,就不会出现这个问题了,但是 Find out what addresses this instruction accesses 这种简单的方法就不行了。



首先F5下断点,然后看寄存器,并右键EBP选择 Show in hexview,并且往上找3行8字节(就是[ebp-38]),右键 Data breakpoint > Break on access,然后F9继续执行就可以了,程序会断在对[ebp-38]访问的指令上,我们可以确定,这条指令一定是有用的,而不会被其他函数复用了这块内存(因为这个数据刚写入,第一次访问一定是有用的访问)。



[Asm] 纯文本查看 复制代码hyxd.exe+239B3D - F3 0F10 8E 84000000   - movss xmm1,[esi+00000084]hyxd.exe+239B45 - F3 0F10 86 88000000   - movss xmm0,[esi+00000088]hyxd.exe+239B4D - F3 0F58 96 80000000   - addss xmm2,[esi+00000080]hyxd.exe+239B55 - F3 0F58 4D C8         - addss xmm1,[ebp-38]hyxd.exe+239B5A - F3 0F58 45 C4         - addss xmm0,[ebp-3C]hyxd.exe+239B5F - 0F14 D1               - unpcklps xmm2,xmm1hyxd.exe+239B62 - 66 0FD6 17            - movq [edi],xmm2hyxd.exe+239B66 - F3 0F11 45 A4         - movss [ebp-5C],xmm0

我们可以分析一下这段代码的意图,在hyxd.exe+239B45处下断点,查看XMM1寄存器,很显然[esi+00000084]存放的是当前人物的Y坐标(高度方向坐标),然后使用addss指令把[ebp-38]的相机高度加上,然后unpcklps把xmm1和xmm2寄存器各自的前4字节合成到xmm2的前8字节,写入[edi],我们可以看到edi在每局游戏中是固定的,这个就非常舒服,我们直接添加到地址列表中就可以研究了。



4. 我们可以尝试第一个实验,直接把 movq [edi],xmm2 改为 nop,右键该条指令, Replace with code that does nothing,我们发现镜头不会跟随我们了,然后我们可以对edi的地址用CE直接进行内存修改,发现镜头真的可以随数值移动,证明,EDI这个地址是有用的。

改完记得在右键 Restore with original code 还原代码

5. 然后,就是 Find out what writes the address,可以看到,在相机不碰到天花板的时候只有一条指令写入,在碰到天花板的时候有两条写入,我们直接把第二条nop掉。大功告成,我们可以在屋子里提高视野了。



于是我们又发现问题了,开镜、开车和观战的时候,步骤2中注入的代码不好使,搜索对EDI这个地址的写入,我们发现开镜、开车和观战的时候分别有不同的代码写入EDI这个地址,我们必须继续探究EDI这个地址到底之后被用来做什么了。

6. 还是熟悉的套路,右键刚才那个相机高度的地址,Find out what accesses the address,查找访问(访问包括写入和读取),可以看到通常情况下有4条指令,当进行某些复杂的相机位置计算的时候回多出来很多(比如顶到天花板,比如开镜)



注意,前面的计数器是相等的,很显然这些操作是一系列有顺序的操作,其中第二条是刚才写入[edi]的那条指令。

另外,这里显示的指令的顺序是非常重要的,CE按照触发顺序列出了所有的访问指令,我们要改的应该是哪一个呢?

肯定是最后一个嘛,我们的想法就是,前面无论你怎么算,让游戏随便算,我们到最后一步,把结果一改就OK啦。(你前面尽管算,结果对了算我输)

7. 开始修改

Show disassembler



[Asm] 纯文本查看 复制代码hyxd.exe+21F7FB - F3 0F10 47 04         - movss xmm0,[edi+04]hyxd.exe+21F800 - F3 0F5C C5            - subss xmm0,xmm5hyxd.exe+21F804 - F3 0F11 45 90         - movss [ebp-70],xmm0

[edi]是X坐标,[edi+04]是Y坐标(相机高度)

我们要做什么你们懂吧,在 movss [ebp-70],xmm0 这句话之前,在xmm0上加30.0就可以了。

对这句指令进行 Auto Assemble,使用 Template > Full Injection 模板



CE提供了以下 Full Injection 模板

[Asm] 纯文本查看 复制代码define(address,"hyxd.exe"+21F804) // 定义我们要修改的地址define(bytes,F3 0F 11 45 90) // 这是改地址原来的指令机器码[ENABLE]assert(address,bytes) // 只有在我们要修改的地址为原来的指令的时候才继续alloc(newmem,$1000) // 分配1KB内存label(code) // 定义标签label(return) // 定义标签newmem: //这是我们刚分配的内存地址,在这里添加修改代码// ...// ...// ...code: // 这是原来指令的拷贝(因为jmp newmem指令覆盖了原来的指令,所以需要把原来的指令搬到我们新分配的地址中来)  movss [ebp-70],xmm0  jmp returnaddress: // 这是原始的地址,这个标签之后的内容会覆盖原始指令(就是跳转到我们分配的那一段内存里)  jmp newmemreturn:[DISABLE]address:  db bytes  // movss [ebp-70],xmm0dealloc(newmem)

代码中有解释,不过我还要再说明一下,newmem: code: address: return:这四个东西的用途是不一样的。newmem和address是具体的内存地址,他表示接下来所有指令将被写入这个内存地址。code和return是标签,不占据字节,不占据指令,他表示一个暂时不知道的地址,仅仅用于跳转,所以从newmem:到address:之间的指令都会写到新分配的地址中,address:到[DISABLE]之间的指令都会覆盖原始指令(实现代码注入的效果)

我们需要做的就是在newmem:后面添加几条指令,你们可以自行发挥(由于newmem:到address:之间的指令都会写到新分配的地址中,改code:之后的指令也是没有任何问题的)。

我的写法如下:

[Asm] 纯文本查看 复制代码push (float)30.0addss xmm0, [esp]add esp, 4

由于ss系列指令不能接受具体的数值(应该叫立即数吧,我对ASM只是粗略的了解),所以我先直接往栈中压入一个数值,由于栈可以通过地址使用[esp]访问(ESP永远指向栈顶),然后再把栈指针增加4,恢复栈平衡。

这里基本就完事了。

我甚至发现一个有趣的东西,就是可以在天上开镜,甚至还可以打到人。看来这个游戏的命中检测是客户端做的。



如果在车上开提高视角,一旦屏幕中没有显示出自己的车子,屏幕就会非常卡,暂时不知道原因是什么。(所以在车里提高视角之后只能竖直向下看)

8. 课后拓展:

看到 movss [ebp-70],xmm0 这条指令,对[ebp-70]有没有什么兴趣。

ebp 和 esp 差不多,通常都是指向栈内存的,分析这个地址也需要单步或内存断点。

三、放大视野(自带8倍镜)

不开镜搜39.4,枪自带的镜或红点搜31.52,二倍镜搜39.4/2,四倍镜搜39.4/4,以此类推。

1. 先通过内存搜索把地址定下来,应该会有4个地址。

2. 你们可以一个一个试,找出访问这个地址的指令。

最后我定位到这段代码了



[Asm] 纯文本查看 复制代码hyxd.exe+175FBD - F3 0F10 05 94DD4802   - movss xmm0,[hyxd.exe+168DD94] { [179.90] }hyxd.exe+175FC5 - F3 0F10 0D 90DD4802   - movss xmm1,[hyxd.exe+168DD90] { [0.10] }hyxd.exe+175FCD - F3 0F5D 86 FC010000   - minss xmm0,[esi+000001FC]hyxd.exe+175FD5 - F3 0F5F C8            - maxss xmm1,xmm0hyxd.exe+175FD9 - 84 C0                 - test al,alhyxd.exe+175FDB - 75 32                 - jne hyxd.exe+17600Fhyxd.exe+175FDD - 0F2E 8F 98000000      - ucomiss xmm1,[edi+00000098]hyxd.exe+175FE4 - 9F                    - lahf hyxd.exe+175FE5 - F6 C4 44              - test ah,44 { 68 }hyxd.exe+175FE8 - 7B 25                 - jnp hyxd.exe+17600Fhyxd.exe+175FEA - 8B 4D 08              - mov ecx,[ebp+08]hyxd.exe+175FED - F3 0F11 8F 98000000   - movss [edi+00000098],xmm1hyxd.exe+175FF5 - F3 0F59 0D 8CDD4802   - mulss xmm1,[hyxd.exe+168DD8C] { [0.02] }hyxd.exe+175FFD - 51                    - push ecxhyxd.exe+175FFE - 8B 01                 - mov eax,[ecx]hyxd.exe+176000 - F3 0F11 0C 24         - movss [esp],xmm1hyxd.exe+176005 - FF 50 34              - call dword ptr [eax+34]hyxd.exe+176008 - C7 45 FC FFFFFFFF     - mov [ebp-04],FFFFFFFF { -1 }hyxd.exe+17600F - F3 0F10 86 00020000   - movss xmm0,[esi+00000200]

读取[esi+000001FC],然后与给定范围对比,最大179.9度,最小0.10度。

(然后后面那一堆代码可以不用理解,具体想研究的话需要去查ucomiss和lahf指令的具体含义,反正我研究了半天,也没什么大用)

如果 [edi+00000098] 不等于 xmm1 则令 [edi+00000098] 等于 xmm1,然后把 xmm1 乘以 0.02 存入 [esp],调用 [eax+34] 这个函数 。

这个0.02是四舍五入以后的,具体看一下那个内存地址是0.017,猜一猜嘛,高中数学,就是 π/180 呗。(就算知道了又怎样呢.....)

3. 我们需要做的很简单,把 maxss xmm1,xmm0 那一堆直接改成令 xmm1 = 39.4/8 就行了。(下面的代码没有填充nop,自己调整一下就好了)

[Asm] 纯文本查看 复制代码push (float)5.0movss xmm1,[esp]add esp,4

这样其实就可以了。不过你会发现这样的放大视野并不会加载远处的东西,那怎么办呢?我还没研究出来

(还在探索中,不过真不太想玩这个游戏了)

四、高级代码注入

1. 抬高相机玩的还不够爽,毕竟只是改变一个Y轴。那么X轴和Z轴呢?

当然也可以改,不过问题来了,我怎么知道X轴、Z轴的数值要怎么改变呢,我们需要更人性化的使用方法。

以下代码实现的功能,简单来说就是一个隐形无人机:IJKL:控制方向,P/分号:上升/下降,左/右方括号:减速/加速

如果是可以开镜的枪,开镜使用就是一个具备攻击能力的隐形无人机。

以下内容需要对Windows的API有一定了解,对汇编有一定了解。如果你对汇编不太了解可以用C语言写,然后使用CE进行注入(不过这个我还没试过)。

[Asm] 纯文本查看 复制代码// 首先定义了很多常量// 这个代码地址是原来的计算已经结束的地方,我们的目的是在得到原始计算结果之后再进行修改define(address,"hyxd.exe"+21F812)define(bytes,F3 0F 11 45 CC)define(VK_I,49)define(VK_J,4A)define(VK_K,4B)define(VK_L,4C)define(VK_P,50)define(VK_OEM_1,BA) // 分号键define(VK_OEM_4,DB) // 左方括号define(VK_OEM_6,DD) // 右方括号[ENABLE]// 目标地址必须是指定指令才进行注入assert(address,bytes)// 分配代码内存alloc(newmem,$1000)// 分配变量内存alloc(delta_x,4)alloc(delta_y,4)alloc(delta_z,4)alloc(v_x,4)alloc(v_y,4)alloc(v_z,4)alloc(v,4)alloc(v_ratio,4)// 定义标签label(return)label(uav)label(not_press_VK_I)label(not_press_VK_J)label(not_press_VK_K)label(not_press_VK_L)label(not_press_VK_P)label(not_press_VK_OEM_1)label(not_press_VK_OEM_4)label(not_press_VK_OEM_6)// 变量初始化delta_x:  dd (float)0delta_y:  dd (float)0delta_z:  dd (float)0v_x:  dd (float)0v_y:  dd (float)1v_z:  dd (float)0v:  dd (float)0.5v_ratio:  dd (float)1.05// 注入的代码newmem:  // 原来地址上的代码  movss [ebp-34],xmm0  // 把速度存下来,供其他部分使用  // movss xmm3, [edi+0c]  movss [v_x], xmm3  // movss xmm5, [edi+10]  movss [v_y], xmm5  // movss xmm4, [edi+14]  movss [v_z], xmm4  // 检测键盘操作  call uav  // 在相机位置上加上偏移量  movss xmm0,[ebp-6C]  addss xmm0,[delta_x]  movss [ebp-6C],xmm0  movss xmm0,[ebp-70]  addss xmm0,[delta_y]  movss [ebp-70],xmm0  movss xmm0,[ebp-34]  addss xmm0,[delta_z]  movss [ebp-34],xmm0  // 我调试了半天才发现,call user32.GetAsyncKeyState会清空xmm寄存器  // 恢复xmm寄存器  movss xmm3, [edi+0c]  movss xmm5, [edi+10]  movss xmm4, [edi+14]  jmp return// 这个是我们通过键盘操控的代码uav:  // 记录寄存器和标志位  push eax  push ecx  push edx  pushf  // GetAsyncKeyState接受一个参数,就是虚拟按键的编码  push VK_I  call user32.GetAsyncKeyState  // 返回值保存到EAX,AX的最高位为1则按下,这里简单的判断EAX是否为0  test eax,eax  je not_press_VK_I  // delta_x = delta_x + v * v_x  movss xmm0,[delta_x]  movss xmm1,[v_x]  mulss xmm1,[v]  addss xmm0,xmm1  movss [delta_x],xmm0  // 这里可以根据自己的喜好,选择注释或取消注释。  // movss xmm0,[delta_y]  // movss xmm1,[v_y]  // mulss xmm1,[v]  // addss xmm0,xmm1  // movss [delta_y],xmm0  movss xmm0,[delta_z]  movss xmm1,[v_z]  mulss xmm1,[v]  addss xmm0,xmm1  movss [delta_z],xmm0not_press_VK_I:  push VK_K  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_K  movss xmm0,[delta_x]  movss xmm1,[v_x]  mulss xmm1,[v]  subss xmm0,xmm1  movss [delta_x],xmm0  // movss xmm0,[delta_y]  // movss xmm1,[v_y]  // mulss xmm1,[v]  // subss xmm0,xmm1  // movss [delta_y],xmm0  movss xmm0,[delta_z]  movss xmm1,[v_z]  mulss xmm1,[v]  subss xmm0,xmm1  movss [delta_z],xmm0not_press_VK_K:  push VK_J  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_J  // 左右移动需要动动脑子,delta_x = delta_x + v * v_z,delta_z = delta_z - v * v_x  movss xmm0,[delta_x]  movss xmm1,[v_z]  mulss xmm1,[v]  addss xmm0,xmm1  movss [delta_x],xmm0  movss xmm0,[delta_z]  movss xmm1,[v_x]  mulss xmm1,[v]  subss xmm0,xmm1  movss [delta_z],xmm0not_press_VK_J:  push VK_L  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_L  movss xmm0,[delta_x]  movss xmm1,[v_z]  mulss xmm1,[v]  subss xmm0,xmm1  movss [delta_x],xmm0  movss xmm0,[delta_z]  movss xmm1,[v_x]  mulss xmm1,[v]  addss xmm0,xmm1  movss [delta_z],xmm0not_press_VK_L:  push VK_P  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_P  movss xmm0,[delta_y]  addss xmm0,[v]  movss [delta_y],xmm0not_press_VK_P:  push VK_OEM_1  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_OEM_1  movss xmm0,[delta_y]  subss xmm0,[v]  movss [delta_y],xmm0not_press_VK_OEM_1:  push VK_OEM_4  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_OEM_4  movss xmm0,[v]  divss xmm0,[v_ratio]  movss [v],xmm0not_press_VK_OEM_4:  push VK_OEM_6  call user32.GetAsyncKeyState  test eax,eax  je not_press_VK_OEM_6  movss xmm0,[v]  mulss xmm0,[v_ratio]  movss [v],xmm0not_press_VK_OEM_6:  // 恢复栈平衡  popf  pop edx  pop ecx  pop eax  retaddress:  jmp newmemreturn:[DISABLE]address:  db bytes  // movss [ebp-34],xmm0dealloc(newmem)dealloc(delta_x)dealloc(delta_y)dealloc(delta_z)dealloc(v_x)dealloc(v_y)dealloc(v_z)dealloc(v)

这个代码是完全在绘图线程上做的,CE其实还可以支持createthread再建立一个自己的线程,在自己的线程完成移动视角的操作,这样就可以减轻原始线程的负担。


2. GetAsyncKeyState 函数

参考 https://msdn.microsoft.com/en-us/library/windows/desktop/ms646293

判断当这个函数被调用时,某一个按键是否处于按下状态。如果处于按下状态,则返回值的最高位为1(返回值为-32767),通常简单的判断非零即可。

[C++] 纯文本查看 复制代码SHORT WINAPI GetAsyncKeyState(_In_ int vKey);

他接受一个参数,就是虚拟按键码,Visual C++开发可以直接使用VK_*的常量来表示,这里需要我们自己定义。

3. WIN32 API

直接使用汇编语言调用API其实不是特别难,如果这个DLL已经加载了,那就更简单了,逆序push进去参数,call即可,返回值保存在EAX寄存器

参考 https://www.52pojie.cn/thread-434732-1-1.html

4. 位移速度时间计算,高中数学+物理,这个自行解决吧。

左右移动可能需要一些比如向量的乘法或者行列式之类的东西,不过这里简单的说一下,如下图,就两种情况,试一试就知道了。



5. 题外话:

现在的挂不就是比谁更牛逼嘛,飞天、遁地、穿墙又能怎样?

当你们还在用人体作战,我们已经拥有无人机了。

效果:







这个功能严重影响游戏平衡,请酌情使用!

可谓杀人于无形。

运筹帷幄之中,决胜千里之外。

(上面这句话的引用纯属娱乐,语文考生请勿如此使用)

外挂是百分之一的灵感加上百分之九十九的汗水。

6. 课后练习:

设计一个可以动态改变瞄准镜倍数的外挂。


其他:

1. 有人在回复询问,39.4是怎么找到的?

学习CE最开始肯定是破解CE自带的Tutorial.exe了,CE的第三步就是未知初始值查询。

首先我们不开镜选择Scan Type: Unknown initial value。至于 Value Type,对这个游戏研究一下就会发现他全都用的是 Float 类型,如果实在不知道可以选择 All,

然后就是开镜,Scan Type: Changed value,搜索,Scan Type: Unchanged value,搜索,搜索,搜索。关镜,Scan Type: Changed value,搜索,Scan Type: Unchanged value,搜索,搜索,搜索。如此反复。中间可以夹杂着一下比如 Bigger than ... 1e-9、Smaller than ... 1e9 之类的,把没用的地址去掉。

最后剩下的就是这个数值了。

同理:1.65、1.30、0.76 可以通过同样的方法获取到。

2. 人物颜色那个地址是哪来的?

恕我直言,我不知道怎么获取。

原贴地址: https://www.52pojie.cn/thread-674430-1-1.html

3. 基本上算是结帖了,有什么问题可以我也可以回复,这个游戏真的没什么意思了,到处都是神仙,上天入地满地乱爬的,希望大家也尽量少开挂,本着学习交流的心态去使用辅助工具。

4. 恕我直言,根据以上分析,这个游戏的命中检测肯定实在客户端做的,而且只在打枪的一方做,服务器和被打中的一方没有其他检测。恕我直言这个游戏吃枣药丸。真希望网易尽快解决这个问题。之前也在论坛里看到有人发不用瞄准,随便打,枪枪打中人的动态图,我希望这个功能的外挂我希望还是最好不要放出来。

5. 我已经卸载游戏了,教程不会继续更新了。

6. CE有自带的Trainer,可以将CE存档文件直接生成exe可执行文件

7. 我不会易语言,而且我也不想单独发布外挂,这个教程仅仅是个教程,具体怎么用就看你们自己的了,更何况附件的CE存档文件又不是不能用。

如果想使用其他编程语言编写外挂 可能需要 OpenProcess VirtualAllocEx WriteProcessMemory 等Windows API函数,如果要过检测,还需要Hook住相关的API,易语言可能有相关的模块,这个我不太懂。

8. 我在这方面只是研究了不到一个月,我是靠这个内容申请的吾爱破解账号( https://www.52pojie.cn/thread-686004-1-1.html )。之前只是对计算机其他东西有所了解,对反汇编、代码注入这方面仅仅只有不到一个月的水平。不要向我要联系方式,也不要提是否收徒这种问题,这篇文章是我在这方面研究的全部内容,就算收徒也不会带来其他的知识了。有相关问题可以回帖,在这个帖子凉之前我应该都会回答。私信我我会视情况回复的,如果是常见问题尽量还是在下面回帖提问。

9. 2018年1月26日有人回帖称,已被秒封,请尽可能小心地进行破解。

10. 有其他帖子有制作 Trainer 教程

原贴地址: https://www.52pojie.cn/thread-690777-1-1.html


附件:

附件是我自己的 Cheat Engine 存档文件(密码52pojie.cn)。hyxd.zip
2.94 KB, 下载次数: 1832, 下载积分: 吾爱币 -1 CB

hyxd_20180121.zip
4.6 KB, 下载次数: 2534, 下载积分: 吾爱币 -1 CB


来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-24 12:40 , Processed in 0.125000 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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