📄 mainunit.pas.svn-base
字号:
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 + -