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

📄 memorytrainerunit.pas.svn-base

📁 这是一段游戏修改工具的源代码.ring3功能由dephi开发,驱动是C开发.希望对大家有帮助
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
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 + -