吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 166796|回复: 601
收起左侧

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

    [复制链接]
Ganlv 发表于 2018-1-18 03:07
本帖最后由 Ganlv 于 2018-1-28 22:48 编辑

(请注意:本帖内容最后更新于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”具体做了什么暂时不太清楚,有待进一步研究。

过检测.png

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] 纯文本查看 复制代码
1
2
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] 纯文本查看 复制代码
1
2
3
4
5
6
7
mov [edi+40], (float)1000.0
nop
nop
nop
nop
nop
nop


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

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

自动汇编.png

[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
[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] 纯文本查看 复制代码
1
2
3
4
5
6
7
[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


保存到列表.png

设置热键.png

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

效果.png

二、摄像机抬高

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

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

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

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

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

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

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

搜索访问指令.png

看到两条有用的指令

[Asm] 纯文本查看 复制代码
1
2
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 找出这条指令访问的地址

查找指令访问.png

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

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

[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
mov [ebp-38],(float)30.0
nop
nop
nop
nop
nop
nop


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

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

下断点调试.png

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

内存访问断点.png

[Asm] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
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,xmm1
hyxd.exe+239B62 - 66 0FD6 17            - movq [edi],xmm2
hyxd.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在每局游戏中是固定的,这个就非常舒服,我们直接添加到地址列表中就可以研究了。

查看FPU.png

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掉。大功告成,我们可以在屋子里提高视野了。

写入相机高度指令.png

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

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

查找访问相机高度指令.png

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

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

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

7. 开始修改

Show disassembler

最后访问相机高度的操作.png

[Asm] 纯文本查看 复制代码
1
2
3
hyxd.exe+21F7FB - F3 0F10 47 04         - movss xmm0,[edi+04]
hyxd.exe+21F800 - F3 0F5C C5            - subss xmm0,xmm5
hyxd.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 模板

Full Injection.png

CE提供了以下 Full Injection 模板

[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 return
 
address: // 这是原始的地址,这个标签之后的内容会覆盖原始指令(就是跳转到我们分配的那一段内存里)
  jmp newmem
return:
 
[DISABLE]
 
address:
  db bytes
  // movss [ebp-70],xmm0
 
dealloc(newmem)


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

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

我的写法如下:

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


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

这里基本就完事了。

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

提高视角效果.png

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

8. 课后拓展:

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

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

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

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

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

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

最后我定位到这段代码了

设置视野大小代码.png

[Asm] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
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,xmm0
hyxd.exe+175FD9 - 84 C0                 - test al,al
hyxd.exe+175FDB - 75 32                 - jne hyxd.exe+17600F
hyxd.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+17600F
hyxd.exe+175FEA - 8B 4D 08              - mov ecx,[ebp+08]
hyxd.exe+175FED - F3 0F11 8F 98000000   - movss [edi+00000098],xmm1
hyxd.exe+175FF5 - F3 0F59 0D 8CDD4802   - mulss xmm1,[hyxd.exe+168DD8C] { [0.02] }
hyxd.exe+175FFD - 51                    - push ecx
hyxd.exe+175FFE - 8B 01                 - mov eax,[ecx]
hyxd.exe+176000 - F3 0F11 0C 24         - movss [esp],xmm1
hyxd.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] 纯文本查看 复制代码
1
2
3
push (float)5.0
movss xmm1,[esp]
add esp,4


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

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

四、高级代码注入

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

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

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

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

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

[Asm] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
// 首先定义了很多常量
// 这个代码地址是原来的计算已经结束的地方,我们的目的是在得到原始计算结果之后再进行修改
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)0
delta_y:
  dd (float)0
delta_z:
  dd (float)0
v_x:
  dd (float)0
v_y:
  dd (float)1
v_z:
  dd (float)0
v:
  dd (float)0.5
v_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
  // 返回值保存到EAXAX的最高位为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],xmm0
not_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],xmm0
not_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],xmm0
not_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],xmm0
not_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],xmm0
not_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],xmm0
not_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],xmm0
not_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],xmm0
not_press_VK_OEM_6:
  // 恢复栈平衡
  popf
  pop edx
  pop ecx
  pop eax
  ret
 
address:
  jmp newmem
return:
 
[DISABLE]
 
address:
  db bytes
  // movss [ebp-34],xmm0
 
dealloc(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++] 纯文本查看 复制代码
1
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. 位移速度时间计算,高中数学+物理,这个自行解决吧。

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

前后左右计算方法.jpg

5. 题外话:

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

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

效果:

无人机效果1.jpg

无人机效果2.jpg

无人机效果3.jpg

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

可谓杀人于无形。

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

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

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

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, 下载次数: 1897, 下载积分: 吾爱币 -1 CB

hyxd_20180121.zip

4.6 KB, 下载次数: 2596, 下载积分: 吾爱币 -1 CB

点评

很详细的教程,感谢楼主  发表于 2018-1-24 09:31
大佬 附件无法下载了,可以上传到云盘吗,另外教程很好,我学了不少东西,嘿嘿  发表于 2018-1-23 00:29
大佬,真牛,写的真的详细。。  发表于 2018-1-22 19:54

免费评分

参与人数 222吾爱币 +235 热心值 +215 收起 理由
jiangjian + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
aiq136 + 1 + 1 我很赞同!
feishicheng + 1 + 1 大佬,佩服
弈剑听雨 + 1 + 1 谢谢@Thanks!
oncemore996 + 1 + 1 用心讨论,共获提升!
一牛神一 + 1 + 1 用心讨论,共获提升!
无痕软件 + 3 + 1 谢谢@Thanks!
BINGIT + 1 + 1 用心讨论,共获提升!
JerryJerry + 1 + 1 我很赞同!
少年与梦 + 1 + 1 用心讨论,共获提升!
bianqi + 1 + 1 我很赞同!
hbwazxf + 1 + 1 技术相当高深的帖子,学习了……
lxf + 1 我很赞同!
Keange_miss + 1 谢谢@Thanks!
ms998784 + 1 + 1 大佬,写的十分详细,让我这种小白受益了。
虚滞 + 1 + 1 谢谢@Thanks!
q小辣 + 1 + 1 看不懂 但是还是赞一个
林小新 + 1 + 1 谢谢@Thanks!
辻堂先生 + 1 我很赞同!
qi01053 + 1 + 1 我很赞同!
大猪说有 + 1 + 1 我很赞同!
405900601 + 1 + 1 提示:现在已经用不了了
99859874 + 1 + 1 虽然我是小白,看不懂,但是膜拜dalao
LseKit + 1 + 1 谢谢@Thanks!
笨鸟不一定先飞 + 1 + 1 学习了,这套教程相当有用
坏掉了 + 1 这东西以后真的别再出了,不管你什么初心.结果都导致大量普通玩家糟心
GaTyz丶 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
夏末知秋 + 1 + 1 膜拜!学到很多
LINJINGMAO + 1 + 1 用心讨论,共获提升!
7892505647 + 1 谢谢@Thanks!
liu66434280 + 1 + 1 太厉害了。大佬!
disikejj + 1 + 1 用心讨论,共获提升!
WSNBB + 1 用心讨论,共获提升!
♂格式囮、 + 1 + 1 谢谢@Thanks!
SeeAua + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
无所谓我养你啊 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Jaydenchan + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
a3228467 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
XhyEax + 2 + 1 我很赞同!
ww957750676 + 1 + 1 无后怎么用
eumenides_ + 1 + 1 很好的一个教程
gwt0354 + 1 + 1 热心回复!
2676856274 + 1 + 1 谢谢@Thanks!
tchivs + 2 + 1 热心回复!
赤魂煌 + 1 + 1 热心回复!
syxxfx + 1 我很赞同!
gongwanlin + 1 我很赞同!
CROW_df + 1 + 1 感谢您的宝贵建议,我们会努力争取做得更好!
Doer + 1 + 1 我很赞同!
SomnusXZY + 1 + 1 热心回复!
hackeydg + 1 + 1 用心讨论,共获提升!
jiahao + 1 + 1 那个说开挂孤儿看好了这是分析贴,你还不如多回家吃点屎,比现在有用多了
305117352 + 1 + 1 铁头的来试试
慕冬 + 1 + 1 不玩这游戏,单纯过来送个分
a425869651 + 1 多开点挂,封死你们这些开挂的孤儿
halcakaka + 1 + 1 鼓励转贴优秀软件安全工具和文档!
冰天雪地君 + 1 + 1 建议提升权限,避免被奸商利用
珺华Swich灬 + 1 + 1 谢谢@Thanks!
a8826603 + 1 + 1 谢谢@Thanks!
最佳配角 + 1 + 1 谢谢@Thanks!
rland + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
QS白 + 1 + 1 我很赞同!
qwe30245868913 + 1 + 1 佩服佩服
13201593650 + 1 + 1 确实强,我想自己用ce去试试
dyb9582 + 1 + 1 我很赞同!
ELLE + 1 + 1 用心讨论,共获提升!
iso9001 + 1 + 1 谢谢@Thanks!
sinceret + 1 + 1 谢谢@Thanks!
610100 + 1 膜拜!
lensong + 1 + 1 这个挂是我用过最最牛B的。。。只是担心被奸商利用
ii丶BigBreast + 2 + 1 我很赞同!
226tiger + 1 + 1 老哥稳
Saber_凛 + 1 + 1 步骤分享的那么细致 厉害了
810086218 + 1 透视的已经上头条了,兄弟 估计你也快了,希望你能持续更新支持一个
小学生黑大帅 + 1 + 1 谢谢@Thanks!
FearBa + 1 + 1 热心回复!
暗黑佟大为 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Vesslan + 1 + 1 热心回复!
cb19989 + 1 + 1 膜拜大佬,写的很详细
dayer + 1 + 1 我很赞同!
从0开始的小小怪 + 1 + 1 谢谢@Thanks!
爱飞的猫 + 3 + 1 上天入地无所不能 666
qq2074319 + 1 + 1 谢谢@Thanks!
f4cku + 1 + 1 我很赞同!
qq6645856 + 1 + 1 你的CE比我的新啊
gamingnow + 1 + 1 用心讨论,共获提升!
若溪风 + 1 + 1 谢谢@Thanks!
Tar_Rasha + 1 + 1 用心讨论,共获提升!
ADCarry丶橙子 + 1 + 1 我很赞同!
zhiyi1120 + 1 + 1 谢谢@Thanks!
tianshiaina001 + 1 + 1 表示搞机械的深深的仰慕
Excuses + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Mmmmmmmorz + 1 + 1 鼓励转贴优秀软件安全工具和文档!
连晋 + 1 + 1 大佬 附件无法下载了,可以上传到云盘吗
qq308518933 + 1 + 1 我很赞同!
wz52pj + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaofengzi + 1 + 1 热心回复!
1绝对1 + 1 + 1 谢谢@Thanks!
liaozhen + 1 + 1 热心回复!
DK/F + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

sunshine_昊 发表于 2018-1-29 11:14
过检测才是重点
yangwengu 发表于 2018-2-4 18:59
支持,不过新的版本直接用CE要被检测,建议加隐藏
L4Nce 发表于 2018-1-18 15:44
期待楼主完整分析(后续)文章,等楼主写完后续之后可以@我,我将对完整的教程进行高亮、加分加精等操作。
连晋 发表于 2018-1-23 12:28
Ganlv 发表于 2018-1-23 11:32
如果你是来看教程的,根本不需要下载附件,所有涉及的数据、地址、代码文中均有,如果你是来下载外挂的, ...

  已经参考楼主教程 弄出来了 就是   车辆颜色 和 人物颜色 还有 武器颜色 我不知道怎么找 所以才 想看他附件里面是怎么写的  

xd1225 发表于 2018-1-18 18:13
精彩,辛苦了.虽然我不知道讲了些什么鬼
snaki 发表于 2018-1-18 17:40
某易....
头像被屏蔽
zhanyeah 发表于 2018-2-1 23:31
提示: 该帖被管理员或版主屏蔽
 楼主| Ganlv 发表于 2018-1-28 05:52 来自手机
13201593650 发表于 2018-1-28 01:27
[at]楼主,我在自己破解的时候为什么调试器附加到荒野行动进程,游戏就会闪退啊?@Ganlv [/at]

开启设置里的反反调试的那个“避免调试器被发现”的选项。不过我不知道现在还可不可以,可能需要换级别更高的调试器。我不会过检测,这个真不会。
cosxiaobaitu 发表于 2018-1-22 14:12
某易的仓惶之作,有问题是肯定的,也不知道能修复到什么程度,真心的希望天下无挂
idon123 发表于 2018-1-21 23:38
楼主居然是这个技术贴申请通过会员的,厉害了
执子之手丶 发表于 2018-1-18 16:00
学习了,楼主写得很好啊,期待后续的摄像机抬高教程
不良熊 发表于 2018-1-18 17:17
学习了1111111111
a1231564123 发表于 2018-1-18 17:57
望尘莫及。。。。
liuwz8585 发表于 2018-1-18 18:00
膜拜楼主  我什么时候才能向您一样优秀
太阳下的月亮 发表于 2018-1-18 18:01
大佬,期待后续
nyhsjc 发表于 2018-1-18 18:01
学习了,期待后续的摄像机抬高教程。
AnkhSpirit 发表于 2018-1-18 18:01
学习学习,谢谢楼主教程
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-19 04:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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