找到个地图的边缘 ,2个地名相互切换的地方比如这个地方可以 422,851,22
使用工具把地图名称转换成UNICODE
鹏程客栈
4F 9E 0B 7A A2 5B 08 68
剑仙城郊外
51 52 D9 4E CE 57 CA 90 16 59 0D 00 0A 00
CE搜索类型 array of byte
能搜索20多个 判断方法:
通过修改 数值 看游戏里的地图名称是否改变了 改变了正确
通过右键查找 能找到地图名称的基址
//=
地图名称=[[[[[b3f6cc]+1c]+1c]+60]+4]+0
改变名称 就对
地图名称=[[[[[b3f6cc]+1c]+1c]+60]+4]+0
这 个地图名称的数值写入
感谢 Written by GustFox QQ:309140945 提供的教程
大概就是找到写屏操作的CALL 找法:
写屏是先读取地图名, 然后在写在屏幕上面, 所以我们只要对地图名的内存地
址下内存读取断点, 跑到另外一张地图游戏自动断下, 现在我们按CTRL+F9往回
找, 或者直接ALT+K观察堆栈我们一个CALL 一个CALL 的排除发现
push esi //一个指针, 指向一个数据结构,地图名字就是其里面的一个结构体
mov ecx,eax //EAX也是一个参数,往上跟一下就能跟踪出来源
call 0053D830
EAX往上跟一下就出来了:
mov ecx,dword ptr[$A3E018]
mov ecx,dword ptr[ecx+$1C]
mov ecx,dword ptr[ecx+$4]
mov eax,dword ptr[ecx+$8]
ESI 指向的内容:对PUSH ESI 下断, 断下后观察ESI 指向的值:
可以看出来1C FE 6B 0A CC FE 6B 0A 是地图名的UNICODE编码大概是这么
一个结构体
Struct SayInfo
{
DWORD Say1=0x0095D4E0;
DWORD Say2=0x0952696C;
DWORD Say3=0x0095D4F0;
DWORD Say4=0x0094AA38;
DWORD Say5=0x0;
DWORD Say6=0x0;
DWORD Say7=0x0;
DWORD Say8=0x10;
Widechar* SayValue=” GustFox 的写屏测试!”;
}
大概就是这么一个意思, 当然可能有点语法错误.
喜欢DELPHI 的朋友也可以看下面的代码:
首先定义数据结构:
type
screensay=record
Say1:dword;
Say2:dword;
Say3:dword;
Say4:dword;
Say5:dword;
Say6:dword;
Say7:dword;
Say8:dword;
SayValue:dword;
end;
将我们的窗体注入游戏进程
procedure TForm1.Button4Click(Sender: TObject);
var
myscreensay:screensay;
saystr:pwidechar;
addr,addrc:pointer;
begin
saystr:=pwidechar(widestring('GustFox 的写屏测试!'));//写屏的内容
myscreensay.Say1:= $0095D4E0;
myscreensay.Say2:=$0952696C;
myscreensay.Say3:=$0095D4F0;
myscreensay.Say4:=$0094AA38;
myscreensay.Say5:=$0;
myscreensay.Say6:=$0;
myscreensay.Say7:=$0;
myscreensay.Say8:=$10;
myscreensay.SayValu:=dword(saystr);
addr:=@myscreensay;
addrc:=pointer($005758D0);
asm
pushad
mov esi,addr
push esi
mov ecx,dword ptr[$A3E018]
mov ecx,dword ptr[ecx+$1C]
mov ecx,dword ptr[ecx+$4]
mov eax,dword ptr[ecx+$8]
mov ecx,eax
call addrc
popad
end;
end;