⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 源码.txt

📁 分析外挂如何显示人怪信息与人物坐标偏移的查找
💻 TXT
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls,Math;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Button1: TButton;
    Label17: TLabel;
    Label18: TLabel;
    ListView1: TListView;
    GroupBox2: TGroupBox;
    Button2: TButton;
    Button3: TButton;
    ListView2: TListView;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
    aatom:atom;
  end;

var
  Form1: TForm1;
  ProcessID: Thandle;
  ProcID: Thandle;
  Ghwnd: Thandle;
  Ecxi,Ecxg: Cardinal;
  mytime:integer;
  r_level,r_hp,r_maxhp,r_mp,r_maxmp,r_dq,r_money,g_N,g_MAX,g_StartAdd,pn,gEax,g_level,g_ID,r_Maxexp1:Cardinal;
  r_exp,r_Maxexp:double;
  r_Name,g_Name:array[0..16] of WideChar;
  r_Name1,g_Name1:integer;
  r_X,r_Y,rg_Local:single;
  const Baseadr = $0097D558;  //一级基址

implementation

{$R *.dfm}
procedure GetLook;//刷新
 var
  Num: Cardinal;
  MinLocalID:integer;
  MaxLocal:integer;

begin
  ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
  ReadProcessMemory(ProcessID, Pointer(Baseadr), @ECXI, 4, Num);

  ReadProcessMemory(ProcessID, Pointer(ECXI + $208), @r_Maxexp1, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(r_Maxexp1 + $8), @r_Maxexp1, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(r_Maxexp1 + $64), @r_Maxexp, 8, Num);

  ReadProcessMemory(ProcessID, Pointer(ECXI + $1C), @ECXI, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(ECXI + $24), @ECXI, 4, Num);//ECXI具体值
  ReadProcessMemory(ProcessID, Pointer(ECXI + $42C), @r_Name1, 12, Num);
  ReadProcessMemory(ProcessID, Pointer(r_Name1), @r_Name, 20, Num);//角色名字
  ReadProcessMemory(ProcessID, Pointer(ECXI + $290), @r_level, 4, Num);// 人物等级
  ReadProcessMemory(ProcessID, Pointer(ECXI + $2AC), @r_HP, 4, Num);//当前血
  ReadProcessMemory(ProcessID, Pointer(ECXI + $2CC), @r_MAXHP, 4, Num);//最大血
  ReadProcessMemory(ProcessID, Pointer(ECXI + $2B4), @r_mp, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(ECXI + $2B0), @r_dq, 4, Num);//当前斗气
  ReadProcessMemory(ProcessID, Pointer(ECXI + $2A4), @r_exp, 8, Num); //经验
  ReadProcessMemory(ProcessID, Pointer(ECXI + $3C), @r_X, 4, Num);//x
  ReadProcessMemory(ProcessID, Pointer(ECXI + $44), @r_Y, 4, Num);//y
  ReadProcessMemory(ProcessID, Pointer(ECXI + $340), @r_Money, 4, Num);//钱

//怪物列表
  ReadProcessMemory(ProcessID, Pointer(Baseadr), @ECXG, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(ECXG + $1C), @ECXG, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(ECXG + $8), @ECXG, 4, Num);
  ReadProcessMemory(ProcessID, Pointer(ECXG + $20), @ECXG, 4, Num);//ECXG具体值
  ReadProcessMemory(ProcessID, Pointer(ECXG + $14), @g_N, 4, Num);//当前怪物数量
  ReadProcessMemory(ProcessID, Pointer(ECXG + $24), @g_max, 4, Num);//数组最大值
  ReadProcessMemory(ProcessID, Pointer(ECXG + $18), @g_startadd, 4, Num);//怪列表首地址
  for pn := 0 to g_Max do
    begin
      ReadProcessMemory(ProcessID, Pointer(g_startadd + 4 * pn), @gEax, 4, Num);
        if gEax > 0 then
          begin
            ReadProcessMemory(ProcessID, Pointer(gEax + $4), @gEax, 4, Num);
            ReadProcessMemory(ProcessID, Pointer(gEax + $12C), @g_ID, 4, Num);
             ReadProcessMemory(ProcessID, Pointer(gEax + $1A4), @g_name1, 4, Num);
             ReadProcessMemory(ProcessID, Pointer(g_name1), @g_name, 20, Num);
             ReadProcessMemory(ProcessID, Pointer(gEax + $134), @g_level, 4, Num); //等级
             ReadProcessMemory(ProcessID, Pointer(gEax + $1DC), @rg_Local, 4, Num);     //距离
            //ReadProcessMemory(ProcessID, Pointer(gEax + $3C), @g_X, 4, Num);
            //ReadProcessMemory(ProcessID, Pointer(gEax + $44), @g_Y, 4, Num);
            //
            {if rg_Local < 10 then
              begin
                ReadProcessMemory(ProcessID, Pointer(gEax + $208), @pgName, 4, Num);      //名称
                ReadProcessMemory(ProcessID, Pointer(pgName), @gName, 32, Num);
                tgName := gName;
                lstGname.Items.Add(tgName + ' ' + inttostr(floor(rg_Local)));
                lstGID.Items.Add(inttostr(g_id));
                LabGNS.Caption := inttostr(lstGID.Items.Count);
              end;}
              MaxLocal:=100;
              if floor(rg_Local)<MaxLocal then
                begin
                 MinLocalID:= g_ID;
                 MaxLocal:= floor(rg_Local);
                end;
              with form1.listview1.items.add do
              begin
              caption:=g_name;
              subitems.add(inttostr(g_Level));
              end;
           end;
      end;
  form1.Label2.Caption  := r_Name;
  form1.Label4.Caption  := inttostr(r_level);
  form1.Label6.Caption  := inttostr(r_HP)+'/'+inttostr(r_MAXHP);
  form1.Label8.Caption  := inttostr(r_MP)+'/100';
  form1.Label10.Caption  := inttostr(r_dq)+'/100';
  form1.Label12.Caption  := floatToStr(r_exp)+'/'+floatToStr(r_Maxexp);
  form1.Label14.Caption  := inttostr(floor(r_X))+','+inttostr(floor(r_Y));
  form1.Label18.Caption  := inttostr(g_N);
  form1.Label16.Caption  := inttostr(floor(r_Money / 10000)) + '金 ' + inttostr(floor((r_Money Mod 10000) / 100)) + '银 ' + inttostr(floor(r_Money Mod 100)) + '铜';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ghwnd := FindWindow('ChiBiElementClient Window', 0);   //获取窗口
  if Ghwnd = 0 then
  begin
    ShowMessage('游戏未启动');
    Application.Terminate();
  end;
  GetWindowThreadProcessId(Ghwnd, ProcID);    //进程ID
  ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);      // 进程句柄
  if ProcessID = 0 then
  begin
    showMessage('无法打开线程');
    Application.Terminate();
  end;
  CloseHandle(ProcessID);     //关闭进程句柄
  GetLook;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.listview1.Clear ;
  GetLook;
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  with listview2.items.add do
    begin
    caption:=listView1.Selected.Caption;
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
For i:=0 to ListView2.Items.Count-1 Do
If ListView2.Items[i].Selected then
begin 
ListView2.Items.Delete(i); //删除当前选中行 
end;
end;



end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -