📄 unit1.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 + -