1、更新打坐CALL地址;新地址$00452E20
2、找出F1-F8技能 数组+偏移
a、先用CE找到数组相对基址:
b、回溯找到 基址+偏移
c、推导出公式
为什么要找这个数组?
因为在按F1-F8调用技能时,会访问这个数组里存放的技能对象(物品对象),这将是找到(物品使用,技能,普攻)之类功能CALL的突破口。
dd 051FF1E8
48D581:eax=[esi+0c]
4c8aB1:[ecx+0C]
553CAA: dd [[ebx+eax*4+908]+0c]+4*0
基址:553BC0:
dd [[[[[95AD3C]+1c]+24]+1*4+908]+0c]+4*0 //0表示数组下标F1-F8
dd [[[[[95AD3C]+1c]+24]+1*4+8FC]+0c]+4*0 //1-9,0
1、F1-F8使用CALL
2、内存断点
3、条件断点
这一章 分析的数据是非常重要的,分析完后,基本能写个像样的外挂了
作业
技能栏 1-9与0 功能CALL的使用
//54F52A:CALL 0048D590
//54F537:CALL DWORD PTR DS:[EDX+8]
dd [[[[[95AD3C]+1c]+24]+1*4+908]+0c]+4*0 //0表示数组下标 F1-F8
dd [[[[[95AD3C]+1c]+24]+1*4+8FC]+0c]+4*0 //1-9,0
窗口过程:444710
窗口过程上,设置消息断点: WM_KEYDOWN
42C4DF jnz 改 jmp
54F52F: 取出 技能对象
function F1_F8(index:integer=1):boolean;
begin
index:=(index-1)*4;
asm
mov ecx,$95ad3c
mov ecx,[ecx]
add ecx,$1c
mov ecx,[ecx]
add ecx ,$24
mov ecx,[ecx]
add ecx,4
add ecx,$908
mov ecx,[ecx]
add ecx,$0c
mov ecx,[ecx]
add ecx,index
mov ecx,[ecx]
mov edx,[ecx]
mov edx,[edx+$8]
call edx
end;
end;
/
function F1():boolean; stdcall; begin //数组的偏移 asm mov ecx,$95ad3c mov ecx,[ecx] add ecx,$1c mov ecx,[ecx] add ecx ,$24 mov ecx,[ecx] add ecx,$4 add ecx,$908 mov ecx,[ecx] add ecx,$0c mov ecx,[ecx] add ecx,0 //F1-F8 的相对偏移 mov ecx,[ecx] mov edx,[ecx] //获取类函数列表地址 mov edx,[edx+$8] //取出偏移8处的类函数地址 call edx end; result:=true; end;
///
procedure TForm1.Button3Click(Sender: TObject); var h:HWND; tid,hProcess:Thandle; Calladdr:Pointer; writeByte:DWORD; begin h:=findwindow(nil,'Element Client'); windows.GetWindowThreadProcessId(h,tid); hProcess:=windows.OpenProcess(windows.PROCESS_ALL_ACCESS,false,tid); //在游戏进程里分配内存空间 Calladdr:=VirtualAllocEx(hProcess,nil,windows.MAX_PATH*8,windows.MEM_COMMIT OR windows.MEM_RESERVE,windows.PAGE_EXECUTE_READWRITE); //在游戏内存空间里写入代码 WriteProcessMemory(hProcess,@Calladdr,@F1,MAX_PATH*8,writeByte); //调用远程代码 CreateRemoteThread(hProcess,nil,0,Calladdr,nil,0,writeByte); VirtualFreeEx(hProcess,nil,windows.MAX_PATH,windows.MEM_COMMIT OR windows.MEM_RESERVE); end;