📄 memorytrainerunit.pas.svn-base
字号:
end;
procedure TFrmMemoryTrainer.hotkeyhandler(var Message: TWMHotKey);
var i,j,k,l,m,err: integer;
v: int64;
v2: double;
bytes: dword;
nops: array of byte;
original: dword;
newvalue1: byte;
newvalue2: word;
newvalue3: dword;
newvalue4: single;
newvalue5: double;
newvalue6: int64;
dontputback: boolean;
bl: integer;
newbytes: array of byte;
newinput: string;
realaddress,realaddress2,count:dword;
sl: tstringlist;
aa: tCEAllocArray;
begin
checkforprocess;
//handle the hotkeys
i:=message.HotKey;
if i=$bfff then //pop-up
begin
application.Restore;
if userdefinedform<>nil then
begin
//show userdefined window
userdefinedform.Show;
userdefinedform.Position:=poScreenCenter;
end
else
begin
//show default window
frmmemorytrainer.Show;
frmmemorytrainer.Position:=poScreenCenter;
end;
application.BringToFront;
end;
if (i>=0) and (i<length(trainerdata)) then
begin
if processhandle=0 then exit;
if trainerdata[i].active then //is currenly active
begin
//deactivate (if needed)
for j:=0 to length(trainerdata[i].codeentrys)-1 do
begin
//find this codeentry in other trainerdatas
dontputback:=false;
for k:=0 to length(trainerdata)-1 do
begin
if (k<>i) and (trainerdata[k].active) then
begin
for l:=0 to length(trainerdata[k].codeentrys)-1 do
begin
//it has also code entrys
//check if it has a code entry that matches mine
if trainerdata[i].codeentrys[j].address=trainerdata[k].codeentrys[l].address then
begin
//CRAAAAAAAAAAAAAAAP! Cant people just use their brains ?
dontputback:=true;
end;
end;
end;
end;
if not dontputback then
begin
original:=0;
VirtualProtectEx(processhandle, pointer(trainerdata[i].codeentrys[j].address),length(nops),PAGE_EXECUTE_READWRITE,original);
writeprocessmemory(processhandle,pointer(trainerdata[i].codeentrys[j].address),@trainerdata[i].codeentrys[j].originalopcode[0],length(trainerdata[i].codeentrys[j].originalopcode),bytes);
//set old security back
VirtualProtectEx(processhandle,pointer(trainerdata[i].codeentrys[j].address),length(nops),original,original);
end;
end;
{$ifdef standalonetrainerwithassembler}
//see if it contains a auto assemble entry
for j:=0 to length(trainerdata[i].addressentrys)-1 do
begin
if trainerdata[i].addressentrys[j].memtyp=255 then
begin
//auto assemble script
//dissable it
sl:=tstringlist.Create;
sl.Text:=trainerdata[i].addressentrys[j].autoassemblescript;
try
try
if autoassemble(sl,false,false,false,false,trainerdata[i].addressentrys[j].allocs)=false then
begin
symhandler.reinitialize; //second chance, else death sentence
autoassemble(sl,false,false,false,false,trainerdata[i].addressentrys[j].allocs);
end;
reinterpretaddresses;
finally
sl.free;
end;
except
//failed
end;
end;
end;
{$endif}
trainerdata[i].active:=false; //also disables the freezer
end
else //not currently active
begin
//activate (if needed)
redefinecodeentries;
for j:=0 to length(trainerdata[i].codeentrys)-1 do
begin
setlength(nops,length(trainerdata[i].codeentrys[j].originalopcode));
readprocessmemory(processhandle,pointer(trainerdata[i].codeentrys[j].address),@nops[0],length(trainerdata[i].codeentrys[j].originalopcode),bytes);
if not comparemem(@trainerdata[i].codeentrys[j].originalopcode[0],@nops[0],length(trainerdata[i].codeentrys[j].originalopcode)) then
begin
//it not as expected
//check if it got nopped
for k:=0 to length(nops)-1 do
begin
if nops[k]<>$90 then
begin
messagedlg('Incorrect version, or the process got messed up!',mterror,[mbok],0);
application.Terminate;
exit;
end;
end;
end;
for k:=0 to length(nops)-1 do
nops[k]:=$90;
original:=0;
VirtualProtectEx(processhandle, pointer(trainerdata[i].codeentrys[j].address),length(nops),PAGE_EXECUTE_READWRITE,original);
writeprocessmemory(processhandle,pointer(trainerdata[i].codeentrys[j].address),@nops[0],length(nops),bytes);
//set old security back
VirtualProtectEx(processhandle,pointer(trainerdata[i].codeentrys[j].address),length(nops),original,original);
trainerdata[i].active:=true;
end;
//enable auto assemble scripts
for j:=0 to length(trainerdata[i].addressentrys)-1 do
begin
if trainerdata[i].addressentrys[j].memtyp=255 then
begin
//auto assemble script
//dissable it
sl:=tstringlist.Create;
sl.Text:=trainerdata[i].addressentrys[j].autoassemblescript;
try
try
setlength(trainerdata[i].addressentrys[j].allocs,1);
if autoassemble(sl,false,true,false,false,trainerdata[i].addressentrys[j].allocs) = false then
begin
//failure to inject script, try again but not reload the symbols
symhandler.reinitialize;
autoassemble(sl,false,true,false,false,trainerdata[i].addressentrys[j].allocs);
end;
reinterpretaddresses;
finally
sl.free;
end;
except
//failed
end;
end;
end;
for j:=0 to length(trainerdata[i].addressentrys)-1 do
begin
//set value
if trainerdata[i].addressentrys[j].ispointer then
begin
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;
if trainerdata[i].addressentrys[j].setvalue then
begin
if trainerdata[i].addressentrys[j].userinput then
begin
//find a new value
newinput:=clist.Items[i].Editvalue; //default
if userdefinedform<>nil then
if length(userdefinedform.cheatlist)>0 then
newinput:=userdefinedform.cheatlist[0].Items[i].Editvalue
else
begin
//no cheatlist!!!!
//try to find a tcheatlist
for k:=0 to length(userdefinedform.cheat)-1 do
if userdefinedform.cheat[k].cheatnr=i then
begin
newinput:=userdefinedform.cheat[k].Editvalue;
break;
end;
end;
val(newinput,v,err);
if err=0 then trainerdata[i].addressentrys[j].valuei:=v;
val(newinput,v2,err);
if err=0 then trainerdata[i].addressentrys[j].valuef:=v2;
end;
VirtualProtectEx(processhandle, pointer(realaddress),1,PAGE_EXECUTE_READWRITE,original);
case trainerdata[i].addressentrys[j].memtyp of
0 : begin //byte
newvalue1:=byte(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
end;
1 : begin //word
newvalue2:=word(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue2,2,bytes);
end;
2 : begin //dword
newvalue3:=dword(trainerdata[i].addressentrys[j].valuei);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue3,4,bytes);
end;
3 : begin //single
newvalue4:=trainerdata[i].addressentrys[j].valuef;
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes);
end;
4 : begin //single
newvalue5:=trainerdata[i].addressentrys[j].valuef;
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes);
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[i] 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);
WriteProcessMemory(processhandle,pointer(realaddress),@newvalue6,8,bytes);
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;
//freeze
if trainerdata[i].addressentrys[j].frozen then
begin
//get the current value of the address and set that as the freeze address
if not trainerdata[i].addressentrys[j].setvalue then
case trainerdata[i].addressentrys[j].memtyp of
0 : begin //byte
readprocessmemory(processhandle,pointer(realaddress),@newvalue1,1,bytes);
trainerdata[i].addressentrys[j].valuei:=newvalue1;
end;
1 : begin //word
readprocessmemory(processhandle,pointer(realaddress),@newvalue2,2,bytes);
trainerdata[i].addressentrys[j].valuei:=newvalue2;
end;
2 : begin //dword
readprocessmemory(processhandle,pointer(realaddress),@newvalue3,4,bytes);
trainerdata[i].addressentrys[j].valuei:=newvalue3;
end;
3 : begin //single
ReadProcessMemory(processhandle,pointer(realaddress),@newvalue4,4,bytes);
trainerdata[i].addressentrys[j].valuef:=newvalue4;
end;
4 : begin //single
ReadProcessMemory(processhandle,pointer(realaddress),@newvalue5,8,bytes);
trainerdata[i].addressentrys[j].valuef:=newvalue5;
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
trainerdata[i].addressentrys[j].value[m]:=IntToStr(getbit(l,newbytes[k]))[1];
inc(l);
if l>=8 then
begin
inc(k);
l:=0;
end;
end;
setlength(newbytes,0);
end;
6 : begin //int64
ReadProcessMemory(processhandle,pointer(realaddress),@newvalue6,8,bytes);
newvalue6:=dword(trainerdata[i].addressentrys[j].valuei);
end;
7,8: begin //array of bytes , or array of char
readprocessmemory(processhandle,pointer(realaddress),@trainerdata[i].addressentrys[j].valuea[0],trainerdata[i].addressentrys[j].valuelength,bytes);
end;
end;
trainerdata[i].active:=true;
end;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -