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

📄 mainunit.pas.svn-base

📁 这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望对大家有帮助
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
  Sender: TObject);var    i: integer;begin  start:=now;  if frmpointerscannersettings=nil then    frmpointerscannersettings:=tfrmpointerscannersettings.create(self);  if frmpointerscannersettings.Visible then exit;    if frmpointerscannersettings.Showmodal=mrok then    begin      treeview2.Visible:=false;      panel2.Visible:=false;      open1.Enabled:=false;      new1.enabled:=false;      save1.Enabled:=false;      rescanmemory1.Enabled:=false;            incorrectresult:=0;      continued:=0;      pointersfound:=0;      label1.Caption:='Matches found:';      label2.Left:=label1.Left+label1.Width+5;      timer2.Enabled:=true;      treenodeswithchildrenpos:=0;      matchednodespos:=0;      //free the old critical section      for i:=0 to length(dissectedpointersLevelMREWS)-1 do        dissectedpointersLevelMREWS[i].Free;      setlength(dissectedpointersLevelpos,frmpointerscannersettings.maxlevel+1);      setlength(dissectedpointersLevel,frmpointerscannersettings.maxlevel+1);      setlength(dissectedpointersLevelMREWS,frmpointerscannersettings.maxlevel+1);      for i:=0 to length(dissectedpointersLevelpos)-1 do        dissectedpointersLevelpos[i]:=0;      for i:=0 to length(dissectedpointersLevelMREWS)-1 do        dissectedpointersLevelMREWS[i]:=TMultiReadExclusiveWriteSynchronizer.create;      for i:=0 to length(dissectedpointerslevel)-1 do        setlength(dissectedpointerslevel[i],1024*1024); //1mb default      //possible paths cleaning and reinitialize      for i:=0 to length(possiblepathslevelMREWS)-1 do        possiblepathslevelMREWS[i].Free;      setlength(possiblepathslevelpos,frmpointerscannersettings.maxlevel+1);      setlength(possiblepathslevel,frmpointerscannersettings.maxlevel+1);      setlength(possiblepathslevelMREWS,frmpointerscannersettings.maxlevel+1);      for i:=0 to length(possiblepathslevelpos)-1 do        possiblepathslevelpos[i]:=0;      for i:=0 to length(possiblepathslevelMREWS)-1 do        possiblepathslevelMREWS[i]:=TMultiReadExclusiveWriteSynchronizer.create;      for i:=0 to length(possiblepathslevel)-1 do        setlength(possiblepathslevel[i],1024*1024); //1mb default      if staticscanner<>nil then staticscanner.free;      staticscanner:=TStaticscanner.Create(true);      try        staticscanner.start:=frmpointerscannersettings.start;        staticscanner.stop:=frmpointerscannersettings.Stop;        staticscanner.filterstart:=frmpointerscannersettings.FilterStart;        staticscanner.filterstop:=frmpointerscannersettings.FilterStop;        staticscanner.unalligned:=frmpointerscannersettings.unalligned;        staticscanner.codescan:=frmpointerscannersettings.codescan;        staticscanner.automatic:=true;        staticscanner.automaticaddress:=frmpointerscannersettings.automaticaddress;        staticscanner.sz:=frmpointerscannersettings.structsize;        staticscanner.sz0:=frmpointerscannersettings.level0structsize;        staticscanner.maxlevel:=frmpointerscannersettings.maxlevel;        staticscanner.method2:=true;        staticscanner.method3:=true;        staticscanner.fast:=frmpointerscannersettings.CheckBox1.Checked;        staticscanner.psychotic:=frmpointerscannersettings.psychotic;        staticscanner.writableonly:=frmpointerscannersettings.writableonly;        staticscanner.unallignedbase:=frmpointerscannersettings.unallignedbase;        staticscanner.progressbar:=progressbar1;        staticscanner.threadcount:=frmpointerscannersettings.threadcount;        staticscanner.scannerpriority:=frmpointerscannersettings.scannerpriority;        progressbar1.Max:=staticscanner.stop-staticscanner.start;        open1.Enabled:=false;        staticscanner.starttime:=gettickcount;        staticscanner.Resume;        panel2.Visible:=true;      except        staticscanner.Free;      end;    end;end;procedure Tfrmpointerscanner.Timer2Timer(Sender: TObject);var i,j,l: integer;    s: string;    a: string;    smallestaddress: dword;    todo: dword;    done: dword;    donetime,todotime: integer;    oneaddresstime: double;    _h,_m,_s: integer;begin  label8.Caption:=inttostr(continued);  label2.Caption:=inttostr(pointersfound);  label13.caption:=inttostr(skipped);  if staticscanner<>nil then  try    l:=length(staticscanner.method2scanners);    s:=inttostr(l);    a:='';    j:=0;    for i:=0 to l-1 do    begin      if staticscanner.method2scanners[i].isdone then inc(j);      if i=0 then smallestaddress:=staticscanner.method2scanners[i].address      else        if staticscanner.method2scanners[i].address<smallestaddress then smallestaddress:=staticscanner.method2scanners[i].address;      a:=a+'   '+inttostr(i)+':'+inttohex(staticscanner.method2scanners[i].address,8);    end;    label11.caption:=s+' ('+inttostr(j)+')'+a;    label15.Caption:=inttohex(smallestaddress,8);    if staticscanner.phase=2 then    begin      todo:=staticscanner.stop-dword(staticscanner.currentpos);      done:=dword(staticscanner.currentpos)-staticscanner.start;      donetime:=gettickcount-staticscanner.starttime; //time(in ms) it did about 'done' addresses      oneaddresstime:=donetime/done;      todotime:=trunc(todo*oneaddresstime);      _h:=todotime div 3600000;      todotime:=todotime mod 3600000;      _m:=todotime div 60000;      todotime:=todotime mod 60000;      _s:=todotime div 1000;      label19.Caption:=inttostr(_h)+':'+inttostr(_m)+':'+inttostr(_s);            label18.Caption:='Scanning';    end else label18.caption:='Copying memory';  except    label11.caption:='0 (0)';  end else label18.Caption:='Idle';  label4.Caption:=inttostr(scanaddresscount);  label5.caption:=inttostr(incorrectresult);end;procedure Tfrmpointerscanner.Showresults1Click(Sender: TObject);begin  panel1.caption:='There are '+inttostr(pointersfound)+' pointers in the list';    if pointersfound>15000 then    if messagedlg('This is a huge ammount of pointers. ('+inttostr(pointersfound)+') Are you sure you want to show them? (It''ll take a while to update the list)',mtconfirmation,[mbyes,mbno],0)<>mryes then exit;  drawtreeview;end;procedure Tfrmpointerscanner.Save1Click(Sender: TObject);var y: tfilestream;begin  if savedialog1.execute then  begin    y:=tfilestream.Create(savedialog1.FileName,fmcreate);    try      y.CopyFrom(pointerlist,0);    finally      y.free;    end;  end;end;procedure Tfrmpointerscanner.Open1Click(Sender: TObject);var x: tfilestream;    offset: dword;    offsetsize: dword;    offsetlist: array of dword;    stringlength: dword;    s: pchar;    ssize: dword;    st: string;begin  ssize:=0;  setlength(offsetlist,10);  if opendialog1.Execute then  begin    if staticscanner=nil then    begin      staticscanner:=tstaticscanner.Create(true);      staticscanner.Terminate;      staticscanner.Resume;    end;    setlength(staticscanner.filenames,1);    staticscanner.filenames[0]:=opendialog1.FileName;    pointersfound:=0;    x:=tfilestream.Create(opendialog1.FileName,fmopenread);    getmem(s,100);    ssize:=100;    try      while x.Position<x.Size do      begin        x.ReadBuffer(stringlength,sizeof(stringlength));        if ssize<=stringlength then        begin          freemem(s);          getmem(s,stringlength+1);          ssize:=stringlength+1;        end;        x.ReadBuffer(s^,stringlength);        s[stringlength]:=#0;        x.ReadBuffer(offset,sizeof(offset));        x.ReadBuffer(offsetsize,sizeof(offsetsize));        if length(offsetlist)<(offsetsize+1) then          setlength(offsetlist,offsetsize*2);        x.ReadBuffer(offsetlist[0],offsetsize*sizeof(offsetlist[0]));        inc(pointersfound);      end;    finally      x.free;      freemem(s);    end;    loadpointers;    doneui;    showresults1.Enabled:=true;    Rescanmemory1.Enabled:=true;    Save1.Enabled:=true;    new1.Enabled:=true;    showresults1.Click;  end;end;procedure TRescanpointers.execute;var offsetsize: dword;    offsetlist: array of dword;    x,br: dword;    i: integer;    mi: TModuleInfo;    stringlength: dword;    ssize: dword;    s: pchar;    offset: dword;    b: ^dword;begin  pointersfound:=0;  newpointerlist:=tmemorystream.Create;  oldpointerlist.Seek(0,sofrombeginning);  progressbar.Min:=0;  progressbar.Max:=oldpointerlist.Size;  getmem(s,100);  ssize:=100;  setlength(offsetlist,10);  while oldpointerlist.Position<oldpointerlist.Size do  begin    oldpointerlist.ReadBuffer(stringlength,sizeof(stringlength));    if ssize<=stringlength then    begin      freemem(s);      getmem(s,stringlength+1);      ssize:=stringlength+1;    end;    oldpointerlist.ReadBuffer(s^,stringlength);    s[stringlength]:=#0;    oldpointerlist.ReadBuffer(offset,sizeof(offset));    oldpointerlist.ReadBuffer(offsetsize,sizeof(offsetsize));    if length(offsetlist)<(offsetsize+1) then      setlength(offsetlist,offsetsize*2);    oldpointerlist.ReadBuffer(offsetlist[0],offsetsize*sizeof(offsetlist[0]));    //now check if it matches, and if so, save it back to the newpointerlist    try      x:=symhandler.getAddressFromName(s,true)+offset;      for i:=0 to offsetsize-1 do      begin        b:=pointer(x);        x:=b^;        inc(x,offsetlist[i]);      end;      if x=address then      begin        newpointerlist.WriteBuffer(stringlength,sizeof(stringlength));        newpointerlist.WriteBuffer(s^,stringlength);        newpointerlist.WriteBuffer(offset,sizeof(offset));        newpointerlist.WriteBuffer(offsetsize,sizeof(offsetsize));        newpointerlist.WriteBuffer(offsetlist[0],offsetsize*sizeof(offsetlist[0]));        inc(pointersfound);      end;    except      //not valid, so dont save    end;    progressbar.Position:=oldpointerlist.Position;  end;  postmessage(frmPointerScanner.Handle,rescan_done,0,0);end;procedure Tfrmpointerscanner.Rescanmemory1Click(Sender: TObject);var address: dword;    saddress: string;begin  saddress:='';  if inputquery('Rescan pointers','What is the current address?',saddress) then  begin    address:=strtoint('$'+saddress);    Rescanmemory1.Enabled:=false;    Save1.Enabled:=false;    new1.Enabled:=false;    showresults1.Enabled:=false;    //rescan the pointerlist    rescan:=trescanpointers.create(true);    rescan.progressbar:=progressbar1;    rescan.oldpointerlist:=pointerlist;    rescan.address:=address;    rescan.resume;  end;end;procedure tfrmpointerscanner.rescandone(var message: tmessage);begin  pointerlist.free;  pointerlist:=rescan.newpointerlist;  rescan.free;  doneui;      showresults1.Enabled:=true;  Rescanmemory1.Enabled:=true;  Save1.Enabled:=true;  new1.Enabled:=true;  showresults1.Click;  end;procedure Tfrmpointerscanner.Button1Click(Sender: TObject);begin  if staticscanner<>nil then  begin    staticscanner.Terminate;    staticscanner.WaitFor;  end;end;procedure Tfrmpointerscanner.FormClose(Sender: TObject;  var Action: TCloseAction);var i,j: integer;begin  if drawtreeviewthread<>nil then  begin    drawtreeviewthread.Terminate;    drawtreeviewthread.WaitFor;    drawtreeviewthread.free;    drawtreeviewthread:=nil;  end;  button1.click;  staticscanner.Free;  staticscanner:=nil;  setlength(staticlist,0);  setlength(dissectedpointersLevelpos,0);  setlength(dissectedpointersLevel,0);  for i:=0 to length(dissectedpointersLevelMREWS)-1 do    if dissectedpointersLevelMREWS[i]<>nil then      freeandnil(dissectedpointersLevelMREWS[i]);  setlength(dissectedpointersLevelMREWS,0);  for i:=0 to length(treenodeswithchildren)-1 do    freeandnil(treenodeswithchildren[i]);  setlength(treenodeswithchildren,0);  if matchednodescs<>nil then freeandnil(matchednodescs);  for i:=0 to length(matchednodes)-1 do    setlength(matchednodes[i],0);  setlength(matchednodes,0);  TreeView2.Items.Clear;  for i:=0 to length(PossiblepathsLevelMREWS)-1 do    freeandnil(PossiblepathsLevelMREWS[i]);  setlength(PossiblepathsLevelMREWS,0);  for i:=0 to length(possiblepathsLevel)-1 do    setlength(possiblepathsLevel[i],0);  setlength(possiblepathsLevel,0);  setlength(possiblepathsLevelpos,0);  if (method2semaphore<>nil) then    freeandnil(method2semaphore);   action:=cafree;  frmpointerscanner:=nil;end;procedure Tfrmpointerscanner.FormShow(Sender: TObject);begin  self.BringToFront;  self.SetFocus;  setforegroundwindow(self.handle);  label9.Left:=0;end;procedure Tfrmpointerscanner.openscanner(var message: tmessage);begin  if frmpointerscannersettings=nil then    frmpointerscannersettings:=tfrmpointerscannersettings.create(self);  frmpointerscannersettings.edtAddress.text:=inttohex(message.WParam,8);  Method3Fastspeedandaveragememoryusage1.Click;end;procedure Tfrmpointerscanner.TreeView2DblClick(Sender: TObject);var ms: tmemorystream;    x: dword;    t: ttreenode;    p: thandle;    targetbuffer: pointer;    CDS: COPYDATASTRUCT;begin  t:=treeview2.Selected;  if t=nil then exit;  if t.Level<>0 then exit;  ms:=tmemorystream.Create;  try    x:=length(treeview2.Selected.Text);    ms.WriteBuffer(x,sizeof(x));    ms.WriteBuffer(treeview2.Selected.Text[1],x);    t:=t.GetLastChild;    while t<>nil do    begin      x:=strtoint('$'+t.Text);      ms.WriteBuffer(x,4);      t:=t.getPrevSibling;    end;    cds.dwData:=$ce;    cds.cbData:=ms.Size;    cds.lpData:=ms.Memory;    sendmessage(scansettings.mainformHandle,WM_COPYDATA,handle,dword(@CDS));  finally    ms.free;  end;end;procedure Tfrmpointerscanner.New1Click(Sender: TObject);begin  button1.Click;  treeview2.Visible:=false;  panel2.Visible:=false;  panel1.Caption:='';  open1.Enabled:=true;  new1.enabled:=true;  save1.Enabled:=false;  rescanmemory1.Enabled:=false;  showresults1.enabled:=false;end;end.

⌨️ 快捷键说明

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