找到技能数组

    xiaoxiao2025-04-21  7

       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; 

    转载请注明原文地址: https://ju.6miu.com/read-1298310.html
    最新回复(0)