转自:http://www.cr173.com/html/14254_1.html
原文:摘自CheatEngine Help (v6.1)
翻译:axdx
自动汇编可以让你用写脚本的方式,在不同的地址写入汇编代码。自动汇编可以在”内存浏览”(Memory View)的”工具”(Tools)中找到。
有三个特殊命令可以使用:ALLOC,LABEL,以及FULLACCESS。使用LABEL,你可以事先宣告一个名子, 并把它附给一个地址,接下来,你就可以用这个名子代替地址来使用。基本上,ALLOC也是相同的功用,只不过ALLOC还可以分配内存给你。
使用方式:
LABEL(标签名):让标签名可以被当作一个地址使用。
ALLOC(分配的内存标签名, 字节数):使用方式同LABEL,同时分配内存,指向被分配的内存地址。
ALLOC(分配的内存标签名, 字节数, 优先考虑的内存区域):同上。
DEALLOC(分配的内存标签名):释放使用ALLOC分配的内存空间。不管DEALLOC被放在脚本的什么地方,它永远是最后才被运行,且只在所有脚本分配的空间都被释放的时候,它才会真正地释放内存。只适用在添加到作弊列表中的脚本〈使用在作弊取消时〉。
FULLACCESS(地址, 字节数): 使指定的地址,至少所需的字节数,拥有可读、可写、可运行的属性。
REGISTERSYMBOL(符号名):将符号名加入到使用者自定义的符号表中。该符号名可以在作弊列表以及内存浏览中,被视为一个地址使用。符号名被使用前必须在脚本中先宣告。
UNREGISTERSYMBOL(符号名):从使用者自定义符号表中,删除此符号名。即使符号名不存在,也不会产生错误信息。
DEFINE(名子, 任意字符串):将指定的名子取代为任意字符串。
INCLUDE(档案名):在此命令的所处位置,包含进另一个自动汇编的脚本档案。
LOADBINARY(地址, 档案名):在指定的地址载入一个二进制档案。
CREATETHREAD(地址):于目标进程中,在指定的地址创建线程。
LOADLIBRARY(档案名):注入指定的DLL到目标进程中。
READMEM(地址, 字节数):在此命令的所处位置,复制写入指定的地址的资料。相当于内存复制。
GLOBALALLOC(名子, 字节数):分配内存空间,并且注册一个符号名到使用者自定义符号表中。因此可以在作弊列表的另一个脚本中使用该名子。在另一个脚本中,对同一个名子使用GLOBALALLOC,将不会再次分配新的内存,而是使用已经分配过的内存〈或者,如果不存在已经分配的内存,则会分配新的内存〉。
ASSERT(地址, 字节数组):检查指定地址的字节数组,是否与给定的字节数组相同。如果不相同,自动汇编脚本将不会运行。
AOBSCAN(名子, 字节数组):在内存中搜寻给定的字节数组〈支援通配符〉,并将找到的地址附给指定的名子。如果没有找到地址,自动汇编脚本不会运行。通配符:使用??或*代表未知字节。
数值表达方式:
一般来说,在自动汇编脚本中,所有的数值都是以十六进制来表示的,不过也有方法可以取代,你可以输入十进制数值,甚至也可以是浮点数值。
举例来说,一个十进制数值100可以写成十六进制的64,不过你也可以写成 #100,或是 (int)100。
对于浮点数值像是100.1,你可以写成 (float)100.1。
对于double双浮点数,你可以写成 (double)100.1。
基本示例:
00451029:
jmp 00410000
nop
nop
nop
00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031
LABEL示例:
label(mylabel)
00451029:
jmp 00410000
nop
nop
nop
mylabel:
00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel
ALLOC示例:
alloc(alloc1,4)
00451029:
jmp 00410000
nop
nop
nop
00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031
ALLOC以及LABEL示例:
alloc(alloc1,4)
label(mylabel)
00451029:
jmp 00410000
nop
nop
nop
mylabel:
00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel
FULLACCESS示例:
FULLACCESS(00400800,4) //00400800通常是只读、不可运行,此行使它可写、可运行
00451029:
jmp 00410000
nop
nop
nop
00410000:
mov [00400800],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031
DEFINE示例:
DEFINE(clear_eax,xor eax,eax)
00400500:
clear_eax
READMEM示例:
alloc(x,16)
alloc(script,2048)
script:
mov eax,[x]
mov edx,[x+c]
ret
x:
readmem(00410000,16) //将地址00410000的内容放至地址X处
AOBSCAN示例:
aobscan(codestart,8b 4c 24 24 ?? ?? 0c d8 07 00)
[ENABLE]
codestart+ 0A:
db 90 9090 90 90 90
[DISABLE]
codestart+ 0A:
jne0054233c
//Alt: db 0F 85 7A 01 00 00
学习自动汇编最好的方法绝对就是练习。在开始的时候,跟着训练教程,一步步练习,并且运用到游戏上。用的越多,你就可以写得越快越强大。虽然它一开始看起来令人生畏〈像一门编程语言〉,但是如果你对游戏修改抱有认真的态度,自动汇编将会是你最好的新朋友。