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

📄 unit1.pas

📁 自己写的一个完美国际173版的读取角色信息的挂 delphi 7源码
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RzButton, RzPanel, ExtCtrls, ComCtrls;

const
  W2I_BASE_CALL=$03491130;//一级基址
type
  TForm1 = class(TForm)
    rzstsbr_1: TRzStatusBar;
    pgc_1: TPageControl;
    ts_1: TTabSheet;
    ts_2: TTabSheet;
    pnl_1: TPanel;
    RzToolbar1: TRzToolbar;
    RzToolButton2: TRzToolButton;
    RzToolButton3: TRzToolButton;
    RzToolButton1: TRzToolButton;
    mmo_1: TMemo;
    grp_1: TGroupBox;
    lbl_1: TLabel;
    lbl_2: TLabel;
    lbl_3: TLabel;
    lbl_4: TLabel;
    lbl_5: TLabel;
    lbl_6: TLabel;
    lbl_7: TLabel;
    lbl_LEVEL: TLabel;
    lbl_CURMP: TLabel;
    lbl_CURHP: TLabel;
    lbl_VIGOUR: TLabel;
    lbl_EXPER: TLabel;
    lbl_HONOR: TLabel;
    lbl_X: TLabel;
    procedure RzToolButton2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RzToolButton3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    W2I_ROLE_ADDR:Cardinal;
    W2I_ROLE_NAME:array [0..16] of WideChar;
    W2iServerName : array[0..16] of WideChar;  //(CHAR *)(W2I_BASE_ADDR+$314)   //服务器名称(MultiByte)
    W2i_ROLE_EXPERS_ADDR:Cardinal;//(DWORD)(W2I_BASE_ADDR+$a14)  //升级所需经验列表(DWORD)[当前等级-1]  // 0xa14

    W2I_DYNAMIC_BASE_ADDR:cardinal;//    (*(DWORD *)(W2I_BASE_ADDR+0x1c))   //动态基址
    W2I_ENVIRON_BASE_ADDR :Cardinal ;// (*(DWORD *)(W2I_DYNAMIC_BASE_ADDR+0x8))     //周围环境基址
    W2I_ROLE_BASE_ADDR:Cardinal ;//   (*(DWORD *)(W2I_DYNAMIC_BASE_ADDR+0x20))    //角色基址
 //--------------------------------------------------------------------------------------
   W2I_ROLE_X:single;  //当前角色X坐标 取整(float/10)+400 float(W2I_ROLE_BASE_ADDR+0x3c))
   W2I_ROLE_Z:single;  //当前角色Z坐标 取整(float/10) float(W2I_ROLE_BASE_ADDR+0x40))
   W2I_ROLE_Y:single;  //当前角色Y坐标 取整(float/10)+550 float(W2I_ROLE_BASE_ADDR+0x44))
   //W2I_ROLE_ID:cardinal;  //当前角色ID (DWORD)(W2I_ROLE_BASE_ADDR+0x43c))
   W2I_ROLE_PROG:cardinal;  //当前修真(筑基 灵虚 和合 元婴 空冥 履霜 渡劫 寂灭 大乘)(DWORD )
   W2I_ROLE_LEVEL:cardinal; //当前等级   (DWORD )(W2I_ROLE_BASE_ADDR+0x448))   (W2I_ROLE_BASE_ADDR+0x44c))
   W2I_ROLE_CURHP:cardinal;   //当前血量   (DWORD)(W2I_ROLE_BASE_ADDR+0x450))
   W2I_ROLE_CURMP :cardinal;  //当前魔量   (DWORD)(W2I_ROLE_BASE_ADDR+0x454))
   W2I_ROLE_EXPER :cardinal;   //当前经验  (DWORD )(W2I_ROLE_BASE_ADDR+0x458))
   W2I_ROLE_VIGOUR :cardinal;         //当前元神(DWORD )(W2I_ROLE_BASE_ADDR+0x45c))
   W2I_ROLE_DOTS :cardinal;           //剩余点数(DWORD )(W2I_ROLE_BASE_ADDR+0x460))
   W2I_ROLE_ENERGY :cardinal;         //当前元气(DWORD )(W2I_ROLE_BASE_ADDR+0x464))
   W2I_ROLE_PHYSICAL :cardinal;    //体质点数(*(DWORD *)(W2I_ROLE_BASE_ADDR+0x468))
   W2I_ROLE_SPIRIT :cardinal;      //灵力点数   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x46c))
   W2I_ROLE_STRENGTH:cardinal;    //力量点数    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x470))
   W2I_ROLE_AGILITY:cardinal;      //敏捷点数    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x474))
   W2I_ROLE_MAXHP:cardinal;       //全部血量      (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x480))
   W2I_ROLE_MAXMP :cardinal;     //全部魔量      (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x484))

   W2I_ROLE_PRECISE :cardinal;    //准确度      (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x498))
   W2I_ROLE_MINPATTACK:cardinal;    //最小物理攻击    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x49c))
   W2I_ROLE_MAXPATTACK:cardinal;    //最大物理攻击   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4a0))
   W2I_ROLE_MINMATTACK:cardinal;    //最小法术攻击   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4d4))
   W2I_ROLE_MAXMATTACK:cardinal;    //最大法术攻击   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4d8))

   W2I_ROLE_GOLDDEFENCE :cardinal; //金抗    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4dc))
   W2I_ROLE_WOODDEFENCE :cardinal; //木抗    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4e0))
   W2I_ROLE_WATERDEFENCE :cardinal; //水抗  (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4e4))
   W2I_ROLE_FIREDEFENCE :cardinal;  //火抗   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4e8))
   W2I_ROLE_EARTHDEFENCE :cardinal;//土抗   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4ec))
   W2I_ROLE_PDEFENCE  :cardinal; //物防     (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4f0))
   W2I_ROLE_JOUK   :cardinal;     //闪避    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4f4))
   W2I_ROLE_MONEY  :cardinal;     //金钱     (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x4fc))

   W2I_ROLE_HONOR :cardinal;  //声望         (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x55c))

   W2I_ROLE_PARTYID  :cardinal;  //帮派ID       (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x598))
   W2I_PARTY_NAME :array[0..16] of WideChar;   //帮派名称
   //W2I_ROLE_NAME1:cardinal;  // 角色名称
   W2I_ROLE_CAREER :cardinal; //职业(0武侠 1法师 3妖精 4妖兽 6羽芒 7羽灵)         (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x5d4))
   W2I_ROLE_SEX :cardinal;  //性别(0男 1女)           (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x5d8))
   W2I_ROLE_POSITION :cardinal; //当前位置状态(0地面 1水中 2空中)      (*(DWORD *)(W2I_ROLE_BASE_ADDR+0x5EC))
   W2I_ROLE_REDLEFT:cardinal; //(*(DWORD *)(W2I_ROLE_BASE_ADDR+0x970)) 红药冷却剩余时间
   W2I_ROLE_BLUELEFT :cardinal;//(*(DWORD *)(W2I_ROLE_BASE_ADDR+0x978)) 蓝药冷却剩余时间
   W2I_ROLE_STATIC:byte;  //
   W2I_ROLE_STATUS :byte ;//角色当前状态(0正常 32打坐 16飞行)        (*(BYTE *)(W2I_ROLE_BASE_ADDR+0x638))

   W2I_ROLE_WATERLEFT:cardinal;//(*(DWORD *)(W2I_ROLE_BASE_ADDR+0x9a8)) 清水冷却剩余时间
   W2I_ROLE_SELECT_OBJSN:cardinal;//(*(DWORD *)(W2I_ROLE_BASE_ADDR+0xA24)) 角色选中的事物SN
   W2I_ROLE_LCLICK_OBJSN:cardinal;//(*(DWORD *)(W2I_ROLE_BASE_ADDR+0xA28)) 角色点击的事物SN
   W2I_ROLE_MOVER_OBJSN:cardinal;// (*(DWORD *)(W2I_ROLE_BASE_ADDR+0xA3c)) 角色鼠标指向的事物SN
   //-------------------------物品---------------------
   W2I_ITEM_BASE_ADDR:cardinal;   /////////////////
   W2I_ITEM_COUNT:cardinal;
   W2I_ITEM_ADDR:cardinal;
   W2I_ITEM_MAXCOUNT :cardinal;
   W2I_ENV_ITEM_ADDR :cardinal;
   W2I_ENV_ITEM_OBJ :cardinal;
   W2I_ENV_ITEM_SN :cardinal;
   W2I_ENV_ITEM_ID :cardinal;
   W2I_ENV_ITEM_GETTYPE :byte;
   W2I_ENV_ITEM_DIST :single;
   W2I_ENV_ITEM_X  :single;
   W2I_ENV_ITEM_Z  :single;
   W2I_ENV_ITEM_Y  :single;
   W2I_ENV_ITEM_NAME1 :cardinal;
   W2I_ENV_ITEM_NAME : array[0..16] of WideChar;
   //------------------------怪物---------------------
   W2I_MONSTER_BASE_ADDR:cardinal; ////////////////////
   W2I_MONSTER_COUNT:cardinal;
   W2I_MONSTER_MAXCOUNT:cardinal;
   W2I_MONSTER_ADDR:cardinal;
   W2I_ENV_MONSTER_ADDR:cardinal;
   W2I_ENV_MONSTER_OBJ:cardinal;
   W2I_ENV_MONSTER_NAME1:cardinal;
   W2I_ENV_MONSTER_NAME:array[0..16] of WideChar;
   W2I_ENV_MONSTER_ID:cardinal;
   W2I_ENV_MONSTER_DIST:single;
   W2I_ENV_MONSTER_TYPE:cardinal;
   W2I_ENV_MONSTER_CURHP:cardinal;
   W2I_ENV_MONSTER_MAXHP:cardinal;
   W2I_ENV_MONSTER_X:single;
   W2I_ENV_MONSTER_Z:single;
   W2I_ENV_MONSTER_Y:single;
   //------------------包裹------------------
   W2I_PACKAGE_ADDR :cardinal;
   W2I_PACKAGE_SIZE:cardinal;
   W2I_PACKAGE_ITEM_ADDR:cardinal;
   W2I_PACK_ITEM_ADDR:cardinal;
   W2I_PACK_ITEM_TYPE:cardinal;
   W2I_PACK_ITEM_ID:cardinal;
   W2I_PACK_ITEM_COUNT:cardinal;
  //------------------------------技能--------------------------------------------------------
  //角色技能基址=角色基址+$bdc=一级基地址+$20
  W2I_MAGIC_ADDR :cardinal;       //    (*(DWORD *)(W2I_ROLE_BASE_ADDR+0xbf0))                //角色技能基址
  W2I_MAGIC_COUNT:cardinal;       //   (*(DWORD *)(W2I_ROLE_BASE_ADDR+0xbf4))                //角色已学技能数量
  W2I_ROLE_MAGIC_ADDR:cardinal; // (i)  (*(DWORD *)(W2I_MAGIC_ADDR+(i)*4))                    //相应位置技能基址

  W2I_ROLE_MAGIC_ID:cardinal;//(role_magic_addr)     // (*(DWORD *)(role_magic_addr+0x8))      //相应位置技能ID
  //W2I_ROLE_MAGIC_LEVEL:cardinal;//(role_magic_addr)   // (*(DWORD *)(role_magic_addr+0xc))      //相应位置技能等级
  //W2I_ROLE_MAGIC_TIMELEFT:cardinal;//(role_magic_addr) //(*(DWORD *)(role_magic_addr+0x10))    //相应位置技能冷却剩余时间
  //W2I_ROLE_MAGIC_INTER:cardinal;//(role_magic_addr)   // (*(DWORD *)(role_magic_addr+0x14))    //相应位置技能施放间隔
  //W2I_ROLE_MAGIC_STATUS:byte;//(role_magic_addr) // (*(BYTE *)(role_magic_addr+0x18))      //相应位置技能状态(0可用 1冷却)

  W2I_ROLE_MAGIC_NAME_ADDR1:cardinal;//(role_magic_addr)//  (*(DWORD *)(role_magic_addr+0x4))
  W2I_ROLE_MAGIC_NAME_ADDR2:cardinal;//(role_magic_addr)//  (*(DWORD *)(W2I_ROLE_MAGIC_NAME_ADDR1(role_magic_addr)+0x4))
  W2I_ROLE_MAGIC_NAME:cardinal;//(role_magic_addr) //  (WCHAR *)(*(DWORD *)(W2I_ROLE_MAGIC_NAME_ADDR2(role_magic_addr)+0xc)) //相应位置技能名称
  W2I_ROLE_MAGIC_NAME1: array[0..16] of WideChar;

    t1,t2:Cardinal;
    l:Integer;

  public
    { Public declarations }
    procedure InjectFunc(Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
    function OpenProcessID:boolean;
  end;
type  //信息刷新
  TRefreshinfomationThread=class(TThread)
  private
  protected
    procedure Execute;override;
end;


var
  Form1: TForm1;
  refreshinfomation:TRefreshinfomationThread;
  ThreadAddr,ParamAddr:Pointer;
  ProcessID,Ghwnd:THandle;
  num:Cardinal;
  start_f:Boolean;
implementation

{$R *.dfm}

procedure TForm1.InjectFunc(Func, aParams: Pointer; aParamsSize: DWORD);
var
  hthread:THandle;
  lpnumberofbytes:DWORD;
begin
  //if process

end;

function TForm1.OpenProcessID: boolean;
var
  ProcID:THandle;
begin
  Result:=False;
  Ghwnd:=FindWindow('ElementClient Window','Element Client');//获取窗口
  if Ghwnd=0 then
  begin
    Application.MessageBox('游戏未启动!','提示');
    Result:=False;
  end
  else
  begin
  GetWindowThreadProcessId(Ghwnd,ProcID);//获取进程序ID
  ProcessID:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcID);
  if ProcessID<>0 then
  begin
     Result:=True;
  end
  else
  begin
    Application.MessageBox('无法打开线程!。。。','提示');
    Result:=False;
  end;

end;
end;

procedure TForm1.RzToolButton2Click(Sender: TObject);
begin
  mmo_1.Lines.Clear;
  if OpenProcessID then
  begin
    ReadProcessMemory(ProcessID,Pointer(W2I_BASE_Call),@W2I_ROLE_ADDR,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$478),@W2I_ROLE_MAXHP,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$450),@W2I_ROLE_CURHP,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$454),@W2I_ROLE_MAXMP,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$47C),@W2I_ROLE_CURMP,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$448),@W2I_ROLE_LEVEL,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$458),@W2I_ROLE_EXPER,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$45C),@W2I_ROLE_VIGOUR,4,num);
    ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$55C),@W2I_ROLE_HONOR,4,num);
    ReadProcessMemory(ProcessID,Pointer($00927080),@t1,4,num);
    ReadProcessMemory(ProcessID,Pointer($00927084),@t2,4,num);
    l:=(t2-t1) ;
    ReadProcessMemory(ProcessID,Pointer(t1),@W2I_ROLE_NAME,l,num);

    mmo_1.Lines.Add('窗口句柄    '+IntToHex(Ghwnd,8));
    mmo_1.Lines.Add(IntToStr(W2I_ROLE_ADDR)+'    '+IntToHex(W2I_ROLE_ADDR,8)+'      角色基址');
    mmo_1.Lines.Add(WideCharToString(W2I_ROLE_NAME));
    mmo_1.Lines.Add('等级    '+IntToStr(W2I_ROLE_LEVEL));
    mmo_1.Lines.Add('经验    '+IntToStr(W2I_ROLE_EXPER));
    mmo_1.Lines.Add('元神    '+IntToStr(W2I_ROLE_VIGOUR));
    mmo_1.Lines.Add('生命    '+IntToStr(W2I_ROLE_CURHP)+'/'+inttostr(W2I_ROLE_MAXHP));
    mmo_1.Lines.Add('真气    '+IntToStr(W2I_ROLE_CURMP)+'/'+inttostr(W2I_ROLE_MAXMP));

  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseHandle(ProcessID);
end;

procedure TForm1.RzToolButton3Click(Sender: TObject);
begin
  if start_f then
  begin
    RzToolButton3.Caption:='停止';
    start_f:=False;
  end
  else
  begin
    RzToolButton3.Caption:='开始';
    refreshinfomation.Suspend;
    start_f:=True;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
start_f:=True;
if OpenProcessID THEN     refreshinfomation:=TRefreshinfomationThread.Create(False)
else Application.Terminate;

end;

{ TRefreshinfomationThread }

procedure TRefreshinfomationThread.Execute;
begin
  inherited;
  repeat
  with Form1 do
  begin
  ReadProcessMemory(ProcessID,Pointer(W2I_BASE_Call),@Form1.W2I_ROLE_ADDR,4,num);
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$484),@W2I_ROLE_MAXHP,4,num);//最大生命
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$454),@W2I_ROLE_CURHP,4,num);//当前生命
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$488),@W2I_ROLE_MAXMP,4,num);//最大真气
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$458),@W2I_ROLE_CURMP,4,num);//当前真气
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$44C),@W2I_ROLE_LEVEL,4,num);//等级
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$45C),@W2I_ROLE_EXPER,4,num);//经验
  ReadProcessMemory(ProcessID,Pointer($0093a2f4+4*(W2I_ROLE_LEVEL-1)),@W2i_ROLE_EXPERS_ADDR,4,num);//经验

  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$460),@W2I_ROLE_VIGOUR,4,num);//元神
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$55C),@W2I_ROLE_HONOR,4,num);//声望
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$3C),@W2I_ROLE_X,4,num); //X
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$44),@W2I_ROLE_Y,4,num);//Y
  ReadProcessMemory(ProcessID,Pointer(W2I_ROLE_ADDR+$40),@W2I_ROLE_Z,4,num);//Z

  ReadProcessMemory(ProcessID,Pointer($00939320),@t1,4,num);
  ReadProcessMemory(ProcessID,Pointer($00939324),@t2,4,num);
  l:=(t2-t1);
  ReadProcessMemory(ProcessID,Pointer(t1),@W2I_ROLE_NAME,l,num);

  grp_1.Caption:=WideCharToString(W2I_ROLE_NAME)+'    '+inttostr(l);
  lbl_LEVEL.Caption:=IntToStr(W2I_ROLE_LEVEL);
  lbl_HONOR.Caption:=IntToStr(W2I_ROLE_HONOR);
  lbl_EXPER.Caption:=IntToStr(W2I_ROLE_EXPER)+'/'+IntToStr(W2i_ROLE_EXPERS_ADDR);
  lbl_VIGOUR.Caption:=IntToStr(W2I_ROLE_VIGOUR);
  lbl_CURHP.Caption:=IntToStr(W2I_ROLE_CURHP)+'/'+IntToStr(W2I_ROLE_MAXHP);
  lbl_CURMP.Caption:=IntToStr(W2I_ROLE_CURMP)+'/'+IntToStr(W2I_ROLE_MAXMP);
  lbl_X.Caption:=inttostr(((round(W2I_ROLE_X) div 10)+400))+','+inttostr(((round(W2I_ROLE_Y) div 10)+550))+' ↑'+inttostr((round(W2I_ROLE_Z) div 10));

  Sleep(500);
  end
  until    Terminated;
end;

end.

⌨️ 快捷键说明

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