秘境1杀怪数量的修改
游戏是用lua脚本处理这数据的,它存储的形式其实是一个双浮点数,所以我们先把搜索的数值类型改为“双浮点”,进秘境后先搜索0,杀一怪后再搜索1,一般就能搜索出数值存储地址。
如果想简单修改,直接修改这地址的数值就行了。我们继续吧,要实现杀一只怪就能下秘境2层。继续对此地址下断,看谁改写它,最终我们能找出是以下语句:
lua51vc12.dll+2B10 - 89 68 04 - mov [eax+04],ebp { ebp = 浮点数,杀一只 +0.125 }
这是lua脚本语句,如果要修改它,我们应该按共用函数的形式来处理。
通过对此语句下断追踪,我们获悉,它是杀怪得经验函数这个函数里调用的调用lua脚本

下面是调用lua脚本语句的具体地址:
gamesvr.exe+CD2B0 - FF 15 2C967F00 - call dword ptr [gamesvr.exe+18962C]
所以第一个脚本可以是这样:
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
label(flag_mjing1) // 标志
registersymbol(flag_mjing1)
newmem:
mov [flag_mjing1],1
originalcode:
call dword ptr [gamesvr.exe+18962C]
mov [flag_mjing1],0
exit:
jmp returnhere
flag_mjing1:
db 00 00 00 00
"gamesvr.exe"+CD2B0:
jmp newmem
nop
returnhere:
[DISABLE]
dealloc(newmem)
"gamesvr.exe"+CD2B0:
call dword ptr [gamesvr.exe+18962C]
第2个脚本:
[ENABLE]
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem:
mov ecx,[flag_mjing1]
test ecx,ecx
je originalcode
cmp ebp,40490000 // 50.00 双浮点的后4位的数值
jae originalcode
mov ebp,40490000
originalcode:
mov ecx,[edx+ecx*8]
mov [eax+04],ebp
exit:
jmp returnhere
"lua51vc12.dll"+2B0D:
jmp newmem
nop
returnhere:
[DISABLE]
dealloc(newmem)
"lua51vc12.dll"+2B0D:
mov ecx,[edx+ecx*8]
mov [eax+04],ebp
//Alt: db 8B 0C CA 89 68 04
需要注意的地方就是:
脚本的启用顺序是第1个,然后是第2个
修改数量时,操作的双浮点数,不是写8个字节,它只写后面的4个字节