procedure Wait(MSecs: Integer);
var
  FirstTickCount, Now: Longint;
begin
  FirstTickCount := GetTickCount();
  repeat
    Application.ProcessMessages;
    sleep(1);
    Now := GetTickCount();
  until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount);
end;procedure bugviewer;
var
ListItem: TListItem;
i:integer;
Gamehwnd:cardinal;
GameHandle:Cardinal;
num:cardinal;
BugName:array[0..32]of wideChar;
//TargetName:array[0..32]of wideChar;
BugBase,BugArrayBase,BugNameBase:dword;//人物基址{(DNF幻影官网 WWW.DNFHUAYING.COM)}
BugArrayCount:cardinal;
TargetID:longint;
TargetHP,TargetMaxHP:cardinal ;
bugx,bugy,Bugjuli:single;
pid:cardinal;
begin
try
Gamehwnd:=findwindow(nil,'Element Client');
GetWindowThreadProcessId(Gamehwnd,@pid);  //获取PID;
GameHandle:=openprocess(process_all_access,false,pid); //最高权限打开游戏;
ReadProcessMemory(gamehandle,pointer(base),@BugBase, 4, Num);//一级基址
ReadProcessMemory(gamehandle,pointer(BugBase+$8),@BugBase, 4, Num);//
ReadProcessMemory(gamehandle,pointer(BugBase+$20),@BugBase, 4, Num);//怪物基址
ReadProcessMemory(gamehandle,pointer(BugBase+$24),@BugArrayCount, 4, Num);//怪物数组最大值
ReadProcessMemory(gamehandle,pointer(BugBase+$18),@BugArrayBase, 4, Num);//怪物数组首地址    {=========================怪物列表=======================}
    form1.ListView1.Items.Clear;//清空列表
    For i:= 0 to BugArrayCount-1 do
    begin
      ReadProcessMemory(gamehandle, Pointer(BugArrayBase+4*i),@BugBase,4,Num);
      if BugBase>0 then
      begin
        ReadProcessMemory(gamehandle, Pointer(BugBase+$4), @BugBase, 4, Num);
        ReadProcessMemory(gamehandle, Pointer(BugBase+$11c), @TargetID, 4, Num);//怪物ID
        ReadProcessMemory(gamehandle, Pointer(BugBase+$130), @TargetHP, 4, Num);//怪物HP
        ReadProcessMemory(gamehandle, Pointer(BugBase+$148), @TargetMaxHP, 4, Num);//怪物HP上限
        ReadProcessMemory(gamehandle, Pointer(BugBase+$3c), @bugx, 4, Num);//怪物X坐标
        ReadProcessMemory(gamehandle, Pointer(BugBase+$44), @bugY, 4, Num);//怪物Y坐标
        ReadProcessMemory(gamehandle,pointer(BugBase+$208),@BugNameBase, 4, Num);    //怪物名称地址
        ReadProcessMemory(gamehandle,pointer(BugNameBase),@BugName[0], 32, Num);    //怪物名称地址
        ReadProcessMemory(gamehandle,pointer(BugBase+$22c),@Bugjuli, 4, Num);        //ReadProcessMemory(gamehandle, Pointer(BugBase+$208), @BugName, 4, Num);//怪物名称
        //ReadProcessMemory(gamehandle, Pointer(BugName+0), @BugName, 32, Num);        //ReadProcessMemory(gamehandle, Pointer(BugBase+$208), @BugName, 4, Num);//怪物名称
        //ReadProcessMemory(gamehandle, Pointer(BugName+0), @TargetName, 32, Num);
        //tempname:=String(TargetName);
        with form1.ListView1 do
        begin
         ListItem := TListView(form1.ListView1).Items.Add;
         ListItem.Caption := ( BugName);
         listitem.SubItems.Add(inttostr(targetid));
         ListItem.SubItems.Add(inttostr(TargetHP)+'/'+inttostr(TargetMaxHP));
         listitem.SubItems.Add(inttostr(trunc(bugx))+','+IntToStr(Trunc(bugY)));
         listitem.SubItems.Add(inttostr(trunc(Bugjuli)));
        end;
      end;
    end;
  //end;
  except
  //
end;
  CloseHandle(gamehandle);
end;procedure  tform1.xuanguai;
var
i:integer;
myarray:Array of longint;
minvalue:longint;
s: string;
zxhwnd:hwnd;
begin
bugviewer;
setlength(myarray,form1.ListView1.Items.Count - 1);
for i := 0 to form1.ListView1.Items.Count - 1 do
begin
myarray[i]:=strtoint(form1.ListView1.Items[i].SubItems[3]);
//stringlist.Add(ListView1.Items[i].SubItems[3]);
end;
minvalue:=minIntValue((myarray));
for i := 0 to form1.ListView1.Items.Count - 1 do
begin
if form1.ListView1.Items[i].SubItems[3]= inttostr(minvalue) then
begin
s := form1.ListView1.Items[i].SubItems[0];
zxhwnd:= findwindow(nil,'Element Client');
if zxhwnd<>0 then postmessage(zxhwnd,sendmsg.wm_idxuanguai,0,strtoint(s));
end;
end;
end;procedure useskill(skillid: Cardinal);
var
zxhwnd:hwnd;
begin
zxhwnd:=findwindow(nil,'Element Client');
if zxhwnd<>0 then postmessage(zxhwnd,sendmsg.WM_JinengGongJi,skillid,0);
end;procedure getskill(var skill:ATSkill);
var
i,skillnum:integer;
Gamehwnd:cardinal;
GameHandle:Cardinal;
myskilladdr,skillFirst:cardinal;
num:cardinal;
baseman:cardinal;
pid:cardinal;
begin
Gamehwnd:=findwindow(nil,'Element Client');
if Gamehwnd<>0 then
Begin
GetWindowThreadProcessId(Gamehwnd,@pid);  //获取PID;
GameHandle:=openprocess(process_all_access,false,pid); //最高权限打开游戏;
ReadProcessMemory(gamehandle,pointer(BASE),@BaseMan, 4, Num);//一级基址
ReadProcessMemory(gamehandle,pointer(baseman + $28), @BaseMan, 4, Num);//人物基址
readprocessmemory(gamehandle,pointer(baseman+$910),@skillnum,4,num);
readprocessmemory(gamehandle,pointer(baseman+$90c),@myskilladdr,4,num);
setlength(skill,skillNum);
for i:=0 to skillNum-1 do
  begin
  ReadProcessMemory(GameHandle,pointer(myskilladdr + i*$4), @SkillFirst, 4, Num);
  ReadProcessMemory(GameHandle,pointer(SkillFirst + $8), @skill[i].id, 4, Num);
  ReadProcessMemory(GameHandle,pointer(SkillFirst + $4), @SkillFirst, 4, Num);
  ReadProcessMemory(GameHandle,pointer(SkillFirst + $4), @SkillFirst, 4, Num);
  ReadProcessMemory(GameHandle,pointer(SkillFirst + $63), @SkillFirst, 4, Num);
  ReadProcessMemory(GameHandle,pointer(SkillFirst), @skill[i].name[0], 20, Num);
  SkillFirst:=0;
  end;
closehandle(GameHandle);
end;
end;procedure readmyleveexp;
var
myinifile:Tinifile;
path:pchar;
i:integer;
total:integer;
section:string;
begin
path:=pchar('.\data\level.ini');
section:='level';
myinifile:=Tinifile.Create(path);
total:=myinifile.ReadInteger(section,'total',0);
setlength(leaveArray,total);
for i:=0 to high(leaveArray) do
begin
  leaveArray[i]:=myinifile.ReadInteger(section,inttostr(i),0);
end;
myinifile.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
   readmyleveexp;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
try
if viewthread<>nil then terminatethread(viewthread.Handle,0);
if autoattack<>nil then terminatethread(autoattack.Handle,0);
if viewerhp<>nil then  terminatethread(viewerhp.Handle,0);
finallyend;
//unhook;
end;procedure TForm1.RzBitBtn1Click(Sender: TObject);
var
i:integer;
begin
RzComboBox1.Items.Clear;
RzComboBox2.Items.Clear;
RzComboBox3.Items.Clear;
RzComboBox4.Items.Clear;
RzComboBox5.Items.Clear;
getskill(skills);
for i:=0 to high(skills) do
  begin
  RzComboBox1.Items.Add(skills[i].name);
  RzComboBox2.Items.Add(skills[i].name);
  RzComboBox3.items.Add(skills[i].name);
  RzComboBox4.items.Add(skills[i].name);
  RzComboBox5.items.Add(skills[i].name);
  //self.ComboBox_skilladd.Items.Add(skills[i].name);
  end;
  if high(skills)>0 then
  begin
  RzComboBox1.ItemIndex:=0;
  RzComboBox2.ItemIndex:=0;
  RzComboBox3.ItemIndex:=0;
  RzComboBox4.ItemIndex:=0;
  RzComboBox5.ItemIndex:=0;
  end;
end;procedure TForm1.RzBitBtn2Click(Sender: TObject);
var
i:integer;
begin
RzListBox1.Items.Add(RzEdit1.text);
setlength(itemFilter,RzListBox1.Items.Count);
for i:=0 to high(itemFilter) do
begin
  itemFilter[i].name:=RzListBox1.Items.Strings[i];
end;
end;procedure TForm1.RzBitBtn3Click(Sender: TObject);
var
i:integer;
begin
for I := 0 to RzListBox1.Count - 1 do
begin
 if RzListBox1.Selected[i] then rzlistbox1.Items[i]:=rzedit1.Text;
end;
end;procedure TForm1.RzBitBtn4Click(Sender: TObject);
begin
RzListBox1.DeleteSelectedItems;
end;procedure TForm1.RzBitBtn5Click(Sender: TObject);
var
zxhandle:hwnd;
begin
zxhandle:=findwindow(nil,'Element Client');
sitdown:=false;
//form1.mypostmsg(sendmsg.WM_quxiaodazuo);
sethook(zxhandle);if viewthread<>nil then terminatethread(viewthread.Handle,0);
viewthread:=TviewMemory.Create(false);if autoattack<>nil then terminatethread(autoattack.Handle,0);
autoattack:=Tautoattack.create(false);if viewerhp<>nil then  terminatethread(viewerhp.Handle,0);
viewerhp:=Tviewerhp.Create(false);
if pdingdiandaguai<>nil then  terminatethread(pdingdiandaguai.Handle,0);
 pdingdiandaguai:=Tdingdiandaguai.Create(false);
end;procedure TForm1.RzBitBtn6Click(Sender: TObject);
begin
 if viewthread<>nil then terminatethread(viewthread.Handle,0);
if autoattack<>nil then terminatethread(autoattack.Handle,0);
if viewerhp<>nil then  terminatethread(viewerhp.Handle,0);
if pdingdiandaguai<>nil then  terminatethread(pdingdiandaguai.Handle,0);
end;procedure TForm1.RzBitBtn7Click(Sender: TObject);
begin
 RzListBox1.Clear;
end;procedure TForm1.RzCheckBox7Click(Sender: TObject);
begin
RzNumericEdit3.Enabled:= not RzCheckBox7.Checked;
RzNumericEdit4.Enabled:= not RzCheckBox7.Checked;
RzNumericEdit5.Enabled:= not RzCheckBox7.Checked;if RzCheckBox7.Checked then
begin
  pdingdiandaguai:=Tdingdiandaguai.Create(false);
end else if pdingdiandaguai<>nil then  terminatethread(pdingdiandaguai.Handle,0);end;procedure TForm1.RzListBox1Click(Sender: TObject);
begin
rzedit1.Text:=RzListBox1.SelectedItem;
end;

解决方案 »

  1.   

    写外挂重要的是找游戏相关参数的一级基址以及二级基址,知道这些后无非就是ReadProcessMemory、WriteProcessMemory。而外挂源代码就相对简单多了
      

  2.   

    完美公司的人来宣传了
    给部分的或不能用的
    都是宣传用的
    外部外部人很难做了现在
    还是以前传奇啊
    说得轻松想得轻松
    什么基址,CALL
    都用来糊小孩的
    内存修改的人家不认行不行呢
    过些时间让你掉线行不行呢
    给个图片你认证行不行呢
    别说别人没这个技术
    还停留在ReadProcessMemory、WriteProcessMemory
    封包都行不通了