📄 memorytrainerunit.pas.svn-base
字号:
userdefinedform.cheatlist[k].Items[i].activated:=true;
for k:=0 to length(userdefinedform.cheat)-1 do
if (userdefinedform.cheat[k].cheatnr=i) then
userdefinedform.cheat[k].activated:=true;
end
else clist.Items[i].activated:=true;
end;
end;
end else if autolaunch then btnlaunch.Click;
end;
procedure TfrmMemoryTrainer.Timer1Timer(Sender: TObject);
begin
CheckForProcess;
timer1.Enabled:=false;
timer1.interval:=15000;
timer1.enabled:=true;
end;
procedure TfrmMemoryTrainer.btnLaunchClick(Sender: TObject);
begin
if fileexists(filename) then
begin
shellexecute(0,'open',pchar(filename),'','',sw_show);
btnlaunch.Enabled:=false;
timer1.Enabled:=false;
timer1.interval:=10000;
timer1.enabled:=true;
end
else
if fileexists(extractfilename(filename)) then
begin
shellexecute(0,'open',pchar(extractfilename(filename)),'','',sw_show);
btnlaunch.Enabled:=false;
timer1.Enabled:=false;
timer1.interval:=10000;
timer1.enabled:=true;
end
else
begin
opendialog1.FileName:=extractfilename(filename);
if opendialog1.Execute then
begin
btnlaunch.Enabled:=false;
timer1.Enabled:=false;
timer1.interval:=10000;
timer1.enabled:=true;
filename:=opendialog1.filename;
shellexecute(0,'open',pchar(filename),'','',sw_show);
end;
end;
end;
procedure TfrmMemoryTrainer.FreezerTimer(Sender: TObject);
var i,j,k,l,m: integer;
newvalue1: byte;
newvalue2: word;
newvalue3: dword;
newvalue4: single;
newvalue5: double;
newvalue6: int64;
oldvalue1: byte;
oldvalue2: word;
oldvalue3: dword;
oldvalue4: single;
oldvalue5: double;
oldvalue6: int64;
bl: integer;
newbytes: array of byte;
bytes: dword;
realaddress,realaddress2,count:dword;
original:dword;
begin
for i:=0 to length(trainerdata)-1 do
begin
if trainerdata[i].active then
begin
for j:=0 to length(trainerdata[i].addressentrys)-1 do
begin
if trainerdata[i].addressentrys[j].frozen then
begin
if trainerdata[i].addressentrys[j].IsPointer then
begin
//find the real address
realaddress2:=trainerdata[i].addressentrys[j].pointers[length(trainerdata[i].addressentrys[j].pointers)-1].Address;
for k:=length(trainerdata[i].addressentrys[j].pointers)-1 downto 0 do
begin
readprocessmemory(processhandle,pointer(realaddress2),@realaddress,4,count);
if count=4 then
realaddress2:=realaddress+trainerdata[i].addressentrys[j].pointers[k].offset
else
begin
realaddress2:=0;
break;
end;
end;
if realaddress2=0 then continue;
realaddress:=realaddress2;
end else realaddress:=trainerdata[i].addressentrys[j].Address;
VirtualProtectEx(processhandle, pointer(realaddress),1,PAGE_EXECUTE_READWRITE,original);
//set value
case trainerdata[i].addressentrys[j].memtyp of
0 : begin //byte
if trainerdata[i].addressentrys[j].frozendirection=0 then
begin
newvalue1:=byte(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
end
else
begin
readprocessmemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
if trainerdata[i].addressentrys[j].Frozendirection=1 then
begin
//allow decreased values
if newvalue1<byte(trainerdata[i].addressentrys[j].valuei) then trainerdata[i].addressentrys[j].valuei:=newvalue1
else
begin
newvalue1:=byte(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
end;
end
else
begin
//allow increased values
if newvalue1>byte(trainerdata[i].addressentrys[j].valuei) then trainerdata[i].addressentrys[j].valuei:=newvalue1
else
begin
newvalue1:=byte(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
end;
end;
end;
end;
1 : begin //word
newvalue2:=word(trainerdata[i].addressentrys[j].valuei);
if trainerdata[i].addressentrys[j].frozendirection=0 then WriteProcessMemory(processhandle,pointer(realaddress),@newvalue2,2,bytes)
else
begin
ReadProcessMemory(processhandle,pointer(realaddress),@oldvalue2,2,bytes);
if trainerdata[i].addressentrys[j].frozendirection=1 then
begin
//allow decrease
if oldvalue2<newvalue2 then
trainerdata[i].addressentrys[j].valuei:=oldvalue2
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue2,2,bytes);
end
else
begin
//allow inc
if oldvalue2>newvalue2 then
trainerdata[i].addressentrys[j].valuei:=oldvalue2
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue2,2,bytes);
end;
end;
end;
2 : begin //dword
newvalue3:=dword(trainerdata[i].addressentrys[j].valuei);
if trainerdata[i].addressentrys[j].frozendirection=0 then WriteProcessMemory(processhandle,pointer(realaddress),@newvalue3,4,bytes)
else
begin
ReadProcessMemory(processhandle,pointer(realaddress),@oldvalue3,4,bytes);
if trainerdata[i].addressentrys[j].frozendirection=1 then
begin
//allow decrease
if oldvalue3<newvalue3 then
trainerdata[i].addressentrys[j].valuei:=oldvalue3
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue3,4,bytes)
end
else
begin
if oldvalue3>newvalue3 then
trainerdata[i].addressentrys[j].valuei:=oldvalue3
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue3,4,bytes)
end;
end;
end;
3 : begin //single
newvalue4:=trainerdata[i].addressentrys[j].valuef;
if trainerdata[i].addressentrys[j].frozendirection=0 then WriteProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes)
else
begin
ReadProcessMemory(processhandle,pointer(realaddress),@oldvalue4,4,bytes);
if (not isnan(oldvalue4)) and (not isinfinite(oldvalue4)) then
begin
if trainerdata[i].addressentrys[j].frozendirection=1 then
begin
//allow decrease
if oldvalue4<newvalue4 then
trainerdata[i].addressentrys[j].valuef:=oldvalue4
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes)
end
else
begin
if oldvalue4>newvalue4 then
trainerdata[i].addressentrys[j].valuef:=oldvalue4
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes);
end;
end else WriteProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes);
end;
end;
4 : begin //double
newvalue5:=double(trainerdata[i].addressentrys[j].valuef);
if trainerdata[i].addressentrys[j].frozendirection=0 then WriteProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes)
else
begin
ReadProcessMemory(processhandle,pointer(realaddress),@oldvalue5,8,bytes);
if (not isnan(oldvalue5)) and (not isinfinite(oldvalue5)) then
begin
if trainerdata[i].addressentrys[j].frozendirection=1 then
begin
//allow decrease
if oldvalue5<newvalue5 then
trainerdata[i].addressentrys[j].valuef:=oldvalue5
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes)
end
else
begin
if oldvalue5>newvalue5 then
trainerdata[i].addressentrys[j].valuef:=oldvalue5
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes)
end;
end else WriteProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes)
end;
end;
5 : begin //binary
bl:=1+((length(trainerdata[i].addressentrys[j].value)-1) div 8);
setlength(newbytes,bl);
ReadProcessMemory(processhandle,pointer(realaddress),@newbytes[0],bl,bytes);
l:=trainerdata[i].addressentrys[j].bit;
k:=0;
for m:=length(trainerdata[i].addressentrys[j].value) downto 1 do
begin
case trainerdata[i].addressentrys[j].value[m] of
'0' : setbit(l,newbytes[k],0);
'1' : setbit(l,newbytes[k],1);
'*','?','x': ;
end;
inc(l);
if l>=8 then
begin
inc(k);
l:=0;
end;
end;
writeprocessmemory(processhandle,pointer(realaddress),@newbytes[0],bl,bytes);
setlength(newbytes,0);
end;
6 : begin //int64
newvalue6:=dword(trainerdata[i].addressentrys[j].valuei);
if trainerdata[i].addressentrys[j].frozendirection=0 then WriteProcessMemory(processhandle,pointer(realaddress),@newvalue6,8,bytes)
else
begin
ReadProcessMemory(processhandle,pointer(realaddress),@oldvalue6,8,bytes);
if trainerdata[i].addressentrys[j].frozendirection=1 then
begin
//allow decrease
if oldvalue6<newvalue6 then
trainerdata[i].addressentrys[j].valuei:=oldvalue6
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue6,8,bytes)
end
else
begin
if oldvalue6>newvalue6 then
trainerdata[i].addressentrys[j].valuei:=oldvalue6
else
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue6,8,bytes)
end;
end;
end;
7,8: begin //array of bytes , or array of char
writeprocessmemory(processhandle,pointer(realaddress),@trainerdata[i].addressentrys[j].valuea[0],trainerdata[i].addressentrys[j].valuelength,bytes);
end;
end;
VirtualProtectEx(processhandle, pointer(realaddress),1,original,original);
end;
end;
end;
end;
end;
procedure TfrmMemoryTrainer.Button1Click(Sender: TObject);
begin
close;
end;
procedure TfrmMemoryTrainer.Button2Click(Sender: TObject);
begin
showmessage(aboutboxtext);
end;
procedure TfrmMemoryTrainer.Button3Click(Sender: TObject);
begin
if (sender is Tlabel2) then shellexecute(0,'open',pchar(tlabel2(sender).command),'','',sw_show);
if (sender is TImage2) then shellexecute(0,'open',pchar(timage2(sender).command),'','',sw_show);
if (sender is TButton2) then shellexecute(0,'open',pchar(tbutton2(sender).command),'','',sw_show);
end;
procedure TfrmMemoryTrainer.Timer2Timer(Sender: TObject);
begin
if reinitializedesired and (processhandle<>0) then
begin
//last time not all addresses got loaded successfull
reinterpretaddresses;
if reinitializedesired and symhandler.isloaded then symhandler.reinitialize;
end;
end;
procedure TfrmMemoryTrainer.Timer3Timer(Sender: TObject);
begin
//every 30 seconds reinterpret anyhow. (not really needed since dlls usually dont change address, but lets do it anyhow)
reinterpretaddresses;
end;
procedure TfrmMemoryTrainer.CheatClick(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var t: tcheat;
m: twmhotkey;
begin
//sender is of type tcheat
t:=tcheat(sender);
//fake a hotkeypress
m.hotkey:=t.cheatnr;
hotkeyhandler(m);
end;
procedure TfrmMemoryTrainer.executecheat(sender: tobject);
var cheatnr: integer;
m: twmhotkey;
begin
if (sender is tbutton) then
cheatnr:=tbutton(sender).Tag;
if (sender is tlabel) then
cheatnr:=tlabel(sender).tag;
if (sender is timage) then
cheatnr:=tlabel(sender).tag;
cheatnr:=cheatnr-5;
m.HotKey:=cheatnr;
hotkeyhandler(m);
end; //onclick event
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -