📄 unit1.~pas
字号:
end;
if (WorkIndex = 0) and (WorkStart = False) then Closehandle(ProcessID);
end;
end;
procedure TfrmMain.WMHotKey(var Msg : TWMHotKey);
begin
if msg.HotKey = id then
begin
jc := 2;
WorkIndex := 1;
// nocall(pTest);
end;
end;
function NoCall(pDaima: cardinal):Cardinal;
var
TempppHandle: Thandle;
Num: Cardinal;
begin
frmMain.SkillWork := True;
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
TempppHandle := CreateRemoteThread(ProcessID, nil, 0, Pointer(pDaima), nil, 0, num);
WaitForSingleObject(TempppHandle, INFINITE);
CloseHandle(TempppHandle);
CloseHandle(ProcessID);
frmMain.SkillWork := False;
Result := 0;
end;
procedure TfrmMain.FunIn(FunName:Pointer;Param:pointer;ParamSize:DWORD);
//Func: Pointer; Param: Pointer; ParamSize: DWORD
var
TAdd,PAdd: Pointer;
TmpHandle: THandle;
begin
jc := 1;
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
TAdd := VirtualAllocEx(ProcessID, nil, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
PAdd := VirtualAllocEx(ProcessID, nil, ParamSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(ProcessID, TAdd, FunName, 4096 , WriteCount);
WriteProcessMemory(ProcessID ,PAdd, param, ParamSize, WriteCount);
TmpHandle := CreateRemoteThread(ProcessID, nil, 0, TAdd, PAdd, 0, WriteCount);
WaitForSingleObject(TmpHandle, INFINITE);
VirtualFreeEx(ProcessID, TAdd, 4096, MEM_RELEASE);
VirtualFreeEx(ProcessID, PAdd, ParamSize, MEM_RELEASE);
CloseHandle(TmpHandle);
CloseHandle(ProcessID);
jc := 2;
end;
//选怪call
function GetGwCall(p: PGetGwCallParam):DWORD; Stdcall;
var
edx1: DWORD;
address:Pointer;
begin
address:=Pointer($57C760);
edx1 := p^.EDX;
asm
pushad
mov esi, edx1
push esi
mov ecx, dword ptr [$91CC34]
mov ecx, dword ptr [ecx+$20]
add ecx,$D4
call address
popad;
end;
result:=0;
end;
procedure TfrmMain.GetGw(a_gID: Cardinal);
var
tmpID1,tmpID2 : integer;
tmpID: cardinal;
CallParam:TGetgwCallParam;
begin
if jc <> 1 then
begin
if (a_gId = 0) and (frmMain.lstGID.Items.Count >0) then
begin
tmpID1 := strtoint(rightstr(frmMain.lstGID.items[0],5));
tmpID2 := strtoint(leftstr(frmMain.lstGID.items[0],Length(frmMain.lstGID.items[0])-5));
tmpID := tmpID2 * 100000 + tmpID1;
// tmpID := strtoint(frmMain.LstGID.Items[0]);
callparam.EDX := tmpID;
frmmain.LstGID.Items.Delete(0);
funin(@GetGwCall,@CallParam,SizeOf(CallParam));
SLEEP(500);
end
else
begin
callparam.EDX := a_gID;
funin(@GetGwCall,@CallParam,SizeOf(CallParam));
SLEEP(500);
end;
end;
WorkStart := False;
end;
//使用技能call
function UseSkillCall(p: PGetGwCallParam):DWORD; Stdcall;
var //ok
edx1: DWORD;
address:Pointer;
begin
address:=Pointer($465730);
edx1 := p^.EDX;
asm
pushad
mov eax, edx1
mov ecx, dword ptr [$91CC34]
mov ecx, dword ptr [ecx + $1C]
mov ecx, dword ptr [ecx + $28]
push -1
push 0
push 0
push eax
call address
popad;
end;
result:=0;
end;
function dati1(p: PGetGwCallParam):DWORD; Stdcall;
var //答题
edx1: DWORD;
addr1, addr2:Pointer;
begin
arr1=Pointer($4AF770);
arr2=Pointer($581EC0);
id := p^.EDX;
asm
pushad
MOV EAX,DWORD PTR DS:[$91cc34] //基地址
MOV EAX,[EAX+$1c]
MOV EAX,[EAX+$4]
MOV EAX,[EAX+$8]
MOV ESI,[EAX+$290]
MOV EDX,DWORD PTR DS:[ESI+188]
MOV ECX,DWORD PTR DS:[ESI+180]
PUSH id
PUSH 1
PUSH q_id
PUSH 1
MOV ECX,ESI
CALL arr1
MOV ECX,EAX
CALL arr2
popad;
end;
result:=0;
end;
procedure TfrmMain.dati;
var
CallParam:TGetgwCallParam;
begin
// frmMain.SkillWork := True;
// if jc <> 1 then
begin
//2 清风破
//78 回城术
callparam.EDX :=4;
funin(@dati1,@CallParam,SizeOf(CallParam));
SLEEP(500);
end;
// frmMain.SkillWork := False;
end;
procedure TfrmMain.UseSkill;
var
CallParam:TGetgwCallParam;
begin
frmMain.SkillWork := True;
if jc <> 1 then
begin
//2 清风破
//78 回城术
callparam.EDX :=218;
funin(@useskillCall,@CallParam,SizeOf(CallParam));
SLEEP(500);
end;
frmMain.SkillWork := False;
end;
//拾取物品call
function PickCall(p: PGetGwCallParam):DWORD; Stdcall;
var
edx1, eax1: DWORD;
address:Pointer;
begin
address:=Pointer($57C6F0);
edx1 := p^.EDX;
eax1 := p^.EAX;
asm
pushad
mov ecx, dword ptr [$91CC34] //ok
mov edx, edx1
push edx
mov ecx, dword ptr [ecx+$20]
mov eax, eax1
push eax
add ecx, $D4
call address
popad
end;
result:=0;
end;
procedure TfrmMain.PickUp; //捡物品
var
Num: Cardinal;
wID,wNID,wBase: Cardinal;
pDname: Integer;
pn: Cardinal;
//wg_Local: Cardinal;
w_X,w_Y: Single;
dName: array[0..16] of WideChar;
dWupin1: array[1..16] of Cardinal;
dWupin2: array[1..16] of Cardinal;
pWupin: Integer;
CallParam: TGetgwCallParam;
begin
ProcessID:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
if ProcessID <>0 then
begin
lstDw.Clear;
ReadProcessMemory(ProcessID, Pointer(FirstAdr), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $8), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $24), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $14), @d_Max, 4, Num); //地上所有物品数量
LabGWS.Caption := inttostr(d_Max);
pWupin:= 0;
if d_Max<>0 then
begin
for pn:= 0 to 768 do
begin
ReadProcessMemory(ProcessID, Pointer(ECXI + $18), @wBase, 4, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + pn * 4), @wBase, 4, Num);
if wBase >0 then
begin
ReadProcessMemory(ProcessID, Pointer(wBase + $4), @wBase, 4, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + $168), @pdName, 4, Num);
ReadProcessMemory(ProcessID, Pointer(pdName), @dName, 32, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + $110), @wID, 4, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + $10C), @wNID, 4, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + $3C), @w_X, 4, Num);
ReadProcessMemory(ProcessID, Pointer(wBase + $44), @w_Y, 4, Num);
lstDW.Items.Add(dName);
if pos(ItemFliter,dName) = 0 then
begin
pWupin:= pWupin + 1;
dWupin1[pWupin]:= wID;
dWupin2[pWupin]:= wNID;
end;
end;
end;
end;
end;
frmMain.LabNwS.Caption := inttostr(pWupin);
for pn:= 1 to pWupin do
begin
frmMain.LabNwS.Caption := inttostr(pWupin - pn);
CallParam.EDX:=dWupin1[pn];
CallParam.EAX:=dWupin2[pn];
funin(@PickCall,@CallParam,SizeOf(CallParam));
sleep(500);
end;
frmMain.GetWork := False;
frmMain.WorkStart := False;
frmMain.WorkIndex := 1;
end;
procedure TfrmMain.SkillGet;
var
sBase,skill_Max,s_Skill,sEax,s_ID: Cardinal;
pn,Num: Cardinal;
psName: Integer;
sName: array[0..16] of WideChar;
stName: string;
begin
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
if ProcessID <> 0 then
begin
lstSkill.Clear;
ReadProcessMemory(ProcessID, Pointer(FirstAdr), @sBase, 4, Num);
ReadProcessMemory(ProcessID, Pointer(sBase + $28), @sBase, 4, Num);
ReadProcessMemory(ProcessID, Pointer(sBase + $91c), @skill_Max, 4, Num);
frmMain.LabSkillNS.Caption := inttostr(skill_Max);
for pn := 0 to skill_Max-1 do
begin
ReadProcessMemory(ProcessID, Pointer(sBase + $918), @s_skill, 4, Num);
ReadProcessMemory(ProcessID, Pointer(s_skill + 4 * pn), @s_skill, 4, Num);
ReadProcessMemory(ProcessID, Pointer(s_skill + $8), @s_ID, 4, Num);
ReadProcessMemory(ProcessID, Pointer(s_skill + $4), @sEax, 4, Num);
ReadProcessMemory(ProcessID, Pointer(sEax + $4), @sEax, 4, Num);
ReadProcessMemory(ProcessID, Pointer(sEax + $6e), @sEax, 4, Num);
ReadProcessMemory(ProcessID, Pointer(sEax + $0), @sName, 32, Num);
// ReadProcessMemory(ProcessID, Pointer(psName), @sName, 32, Num);
stName := sName;
frmMain.LstSkill.Items.Add(inttostr(s_ID) + ' ' + stName);
end;
end;
CloseHandle(ProcessID);
end;
procedure TfrmMain.cmdSkillClick(Sender: TObject);
begin
skillGet;
end;
procedure TfrmMain.TWorkCTimer(Sender: TObject);
begin
if tCheck > 0 then
begin
tCheck:= tCheck - 1;
end
else
begin
frmMain.TWorkC.Enabled := False;
frmMain.WorkStart:= False;
frmMain.WorkIndex:= 1;
end;
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
UseSkill;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -