[Frage]Cheat engine pointer scaner

08/17/2011 17:41 Lazeboy#1
Hey,
ich würde mal gernen wissen wie der pointer scaner von cheat engine funktioniert und möglicherweise so etwas in c++ nach schreiben. Also jeder der ne vermutung hat kann die ja hier rein schreiben würde mich sehr freuen.
mfg Lazeboy
08/17/2011 17:48 buFFy!#2
afaik ist cheat engine opensource
08/17/2011 20:08 Adroxxx#3
Sourcecode bekommst du auf der Webseite oder im CE Forum.
08/17/2011 22:43 Lazeboy#4
das weiß ich ja aber ich finde in dem source code niemals die stelle das ist viel zu viel code....
08/18/2011 14:46 Adroxxx#5
quark.
du schaust einfach welche funktion beim betätigen des buttons aufegrufen wird und dann hast du das schon
08/18/2011 14:54 kurrbis#6
[Only registered and activated users can see links. Click Here To Register...]
08/18/2011 19:05 Lazeboy#7
Quote:
Originally Posted by kurrbis View Post
[Only registered and activated users can see links. Click Here To Register...]
vielen dank ^^

Edit:
Vlt irre ich mich aber ist das nicht der source von öffnen einer gespeicherten pointer liste..., aber ich werde mir diese ganzen sources mal genauer angucken
08/18/2011 22:38 kurrbis#8
Quote:
Originally Posted by Lazeboy View Post
vielen dank ^^

Edit:
Vlt irre ich mich aber ist das nicht der source von öffnen einer gespeicherten pointer liste..., aber ich werde mir diese ganzen sources mal genauer angucken
ja kann sein, habe das nur mal schnell rausgesucht^^
aber da in der nähe müssteste schnell fündig werden
08/19/2011 13:34 Lazeboy#9
[Only registered and activated users can see links. Click Here To Register...]

soweit ich das sehe wird bei Button1Click alles von der PointerScan options form in variablen geladen, aber wo wird jetzt die funktion zum scanen aufgerufen?

also ich habe jetzt das gefunden

Code:
procedure TMainForm.Pointerscanforthisaddress1Click(Sender: TObject);
var address: ptrUint;
    count: dword;
    j: integer;
    check: boolean;
    i: integer;
    findpointeroffsets: boolean;

    frmPointerScanner: TfrmPointerScanner;
    memrec: TMemoryRecord;
begin
  if addresslist.selectedRecord <> nil then
  begin
    memrec:=addresslist.selectedRecord;
    findpointeroffsets:=false;


    address:=memrec.GetRealAddress;

    begin
      //default
      frmPointerScanner:=tfrmpointerscanner.create(self);
      frmPointerScanner.show;

      if frmpointerscannersettings=nil then //used over and over
        frmpointerscannersettings:=tfrmpointerscannersettings.create(self);

      frmpointerscannersettings.edtAddress.text:=inttohex(address,8);

      if findpointeroffsets then
      begin
        //create and fill in the offset list

        frmpointerscannersettings.cbMustEndWithSpecificOffset.checked:=true;
        TOffsetEntry(frmpointerscannersettings.offsetlist[0]).offset:=memrec.pointeroffsets[0];

        for i:=1 to length(memrec.pointeroffsets)-1 do
        begin
          frmpointerscannersettings.btnAddOffset.Click;
          TOffsetEntry(frmpointerscannersettings.offsetlist[i]).offset:=memrec.pointeroffsets[i];
        end;
      end;

      frmPointerScanner.Method3Fastspeedandaveragememoryusage1.Click;
    end;


  end;
end;

und darauf hin dann das

Code:
procedure Tfrmpointerscanner.Method3Fastspeedandaveragememoryusage1Click(
  Sender: TObject);
var
    i: integer;
begin

  start:=now;
  if frmpointerscannersettings=nil then
    frmpointerscannersettings:=tfrmpointerscannersettings.create(nil);

  if frmpointerscannersettings.Visible then exit; //already open, so no need to make again

  if vm<>nil then
    frmpointerscannersettings.cbreuse.Caption:='Reuse memory copy from previous scan';

  if frmpointerscannersettings.Showmodal=mrok then
  begin
    new1.click;
    
    tvResults.Visible:=false;

    pgcPScandata.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;

    //initialize array's
    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


    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
   
    //default scan
    staticscanner:=TStaticscanner.Create(true);

    try

      staticscanner.reverse:=frmpointerscannersettings.rbreverse.checked;

      staticscanner.start:=frmpointerscannersettings.start;
      staticscanner.stop:=frmpointerscannersettings.Stop;
      staticscanner.filterstart:=frmpointerscannersettings.FilterStart;
      staticscanner.filterstop:=frmpointerscannersettings.FilterStop;
      if staticscanner.reverse then
      begin
        staticscanner.unalligned:=not frmpointerscannersettings.CbAlligned.checked;
        pgcPScandata.ActivePage:=tsPSReverse;
        tvRSThreads.Items.Clear;
      end
      else
      begin
        staticscanner.unalligned:=frmpointerscannersettings.unalligned;
        pgcPScandata.ActivePage:=tsPSDefault;
      end;

      staticscanner.codescan:=frmpointerscannersettings.codescan;
      staticscanner.staticonly:=frmpointerscannersettings.cbStaticOnly.checked;

      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.reuse:=frmpointerscannersettings.cbreuse.checked;

      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;

      if staticscanner.reverse then
      begin
        label10.visible:=false;
        label3.Visible:=false;
        label4.Visible:=false;
        label12.Visible:=false;
        label7.Visible:=false;
        label9.Visible:=false;
        label14.Visible:=false;
        label15.Visible:=false;
      end
      else
      begin
        label10.visible:=true;
        label3.Visible:=true;
        label4.Visible:=true;
        label12.Visible:=true;
        label7.Visible:=true;
        label8.Visible:=true;
        label14.Visible:=true;
        label15.Visible:=true;
      end;

      pgcPScandata.Visible:=true;
    except
      staticscanner.Free;
      staticscanner:=nil;
    end;

  end;
end;
Danke für die hilfe
08/19/2011 13:50 kurrbis#10
Code:
procedure TfrmPointerScannerSettings.Button1Click(Sender: TObject);
begin
  start:=StrToQWordEx('$'+edtReverseStart.text);
  stop:=StrToQWordEx('$'+edtReverseStop.text);

  automaticaddress:=symhandler.getAddressFromName(edtAddress.text);

  unalligned:=not cballigned.checked;

  structsize:=strtoint(editstructsize.text);
  level0structsize:=4;
  maxlevel:=strtoint(editMaxLevel.text)+1;

  codescan:=false;

  threadcount:=strtoint(edtthreadcount.text);
  case combobox1.itemindex of
    0: scannerpriority:=tpIdle;
    1: scannerpriority:=tpLowest;
    2: scannerpriority:=tpLower;
    3: scannerpriority:=tpNormal;
    4: scannerpriority:=tpHigher;
    5: scannerpriority:=tpHighest;
    6: scannerpriority:=tpTimeCritical;
  end;

  modalresult:=mrok;
end;
das müsstes sein, da das der button ist, der den pointerscan startet. die variablennamen passen ja auch, nur es fehtl anscheinend wirklich die methode die den eigentlichen scan macht :D
08/19/2011 13:58 Lazeboy#11
Quote:
Originally Posted by kurrbis View Post
Code:
procedure TfrmPointerScannerSettings.Button1Click(Sender: TObject);
begin
  start:=StrToQWordEx('$'+edtReverseStart.text);
  stop:=StrToQWordEx('$'+edtReverseStop.text);

  automaticaddress:=symhandler.getAddressFromName(edtAddress.text);

  unalligned:=not cballigned.checked;

  structsize:=strtoint(editstructsize.text);
  level0structsize:=4;
  maxlevel:=strtoint(editMaxLevel.text)+1;

  codescan:=false;

  threadcount:=strtoint(edtthreadcount.text);
  case combobox1.itemindex of
    0: scannerpriority:=tpIdle;
    1: scannerpriority:=tpLowest;
    2: scannerpriority:=tpLower;
    3: scannerpriority:=tpNormal;
    4: scannerpriority:=tpHigher;
    5: scannerpriority:=tpHighest;
    6: scannerpriority:=tpTimeCritical;
  end;

  modalresult:=mrok;
end;
das müsstes sein, da das der button ist, der den pointerscan startet. die variablennamen passen ja auch, nur es fehtl anscheinend wirklich die methode die den eigentlichen scan macht :D
ja und dann wird diese komische StaticScan nacher aufgerufen und läd alles rein aber auch da startet der scan irgendwie nicht...


Edit:
Irgendwie finde ich diese funktion nicht XD scheiß verschachtelungen.....