1

Тема: AHK: изменение скорости процесса игры

В общем, все знают что в CE есть функця "speed hack" хотелосьбы узнать как можно аналогично данной функции изменить скорость процесса игры.
Чем проще примерчик тем лучше:)

2

Re: AHK: изменение скорости процесса игры

winstan пишет:

В общем, все знают что в CE есть функця "speed hack"

Я не знал.

winstan пишет:

хотелосьбы узнать как можно аналогично данной функции изменить скорость процесса игры.

Интервал между фреймами в играх под Windows обычно замеряют функцией timeGetTime. Поэтому нужно перехватывать эту функцию и править возвращаемое значение. Это задача не для AHK, без dll тут придётся много ассемблерного кода написать.

3 (изменено: winstan, 2011-07-12 22:47:18)

Re: AHK: изменение скорости процесса игры

на сайте СЕ в исходниках нашёл это , вроде как это должно отвечать за спид хак в связки с DLL

unit speedhack2;

{$MODE Delphi}

interface

uses Classes,LCLIntf, SysUtils, NewKernelHandler,CEFuncProc, symbolhandler,
     autoassembler, dialogs,Clipbrd;

type TSpeedhack=class
  private
    processid: dword;
    initaddress: ptrUint;
  public
    procedure setSpeed(speed: single);
    constructor create;
    destructor destroy; override;
  end;

var speedhack: TSpeedhack;

implementation

uses frmAutoInjectUnit;

constructor TSpeedhack.create;
var i: integer;
    script: tstringlist;
    AllocArray: TCEAllocArray;
    x,y: dword;
    a,b: ptrUint;
begin
  initaddress:=0;


  try
    if processhandler.is64bit then
      injectdll(CheatEngineDir+'speedhack-x86_64.dll','')
    else
      injectdll(CheatEngineDir+'speedhack-i386.dll','');
    symhandler.reinitialize;
    symhandler.waitforsymbolsloaded;
  except
    raise exception.Create('Failure enabling speedhack. (DLL injection failed)');
  end;

       
  script:=tstringlist.Create;
  try
    script.Add('alloc(init,512)');
    //check if it already has a a speedhack script running

    a:=symhandler.getAddressFromName('realgettickcount') ;
    b:=0;
    readprocessmemory(processhandle,pointer(a),@b,processhandler.pointersize,x);
    if b<>0 then //already configured
      generateAPIHookScript(script, 'GetTickCount', 'speedhackversion_GetTickCount')
    else
      generateAPIHookScript(script, 'GetTickCount', 'speedhackversion_GetTickCount', 'realgettickcount');



    try
      setlength(AllocArray,0);

      autoassemble(script,false,true,false,false,AllocArray);

      //fill in the address for the init region
      for i:=0 to length(AllocArray)-1 do
        if AllocArray[i].varname='init' then
        begin
          initaddress:=AllocArray[i].address;
          break;
        end;


    except
      raise exception.Create('Failure configuring speedhack part 1');
    end;


    //timegettime
    script.Clear;
    script.Add('timeGetTime:');
    script.Add('jmp speedhackversion_GetTickCount');
    try
      autoassemble(script,false);
    except //don't mind
    end;


    script.clear;
    a:=symhandler.getAddressFromName('realQueryPerformanceCounter') ;
    b:=0;
    readprocessmemory(processhandle,pointer(a),@b,processhandler.pointersize,x);
    if b<>0 then //already configured
      generateAPIHookScript(script, 'QueryPerformanceCounter', 'speedhackversion_QueryPerformanceCounter')
    else
      generateAPIHookScript(script, 'QueryPerformanceCounter', 'speedhackversion_QueryPerformanceCounter', 'realQueryPerformanceCounter');

    try
      autoassemble(script,false);
    except //do mind
      raise exception.Create('Failure configuring speedhack part 2');
    end;

  finally
    script.free;
  end;

  setspeed(1);
  processid:=cefuncproc.processid;
end;

destructor TSpeedhack.destroy;
var script: tstringlist;
    i: integer;
    x: dword;
begin
  if processid=cefuncproc.ProcessID then
  begin

    try
      setSpeed(1);
    except
    end;
  end;

  //do not undo the speedhack script (not all games handle a counter that goes back)
 
end;

procedure TSpeedhack.setSpeed(speed: single);
var x: single;
    script: Tstringlist;

begin
  x:=speed;
  script:=tstringlist.Create;
  try
    script.add('CreateThread('+inttohex(initaddress,8)+')');
    script.add('label(newspeed)');
    script.add(inttohex(initaddress,8)+':');
    if processhandler.is64Bit then
    begin
      script.add('sub rsp,#32');
      script.add('movss xmm0,[newspeed]');
      script.add('push rcx');
    end
    else
      script.add('push [newspeed]');

    script.add('call InitializeSpeedhack');

    if processhandler.is64Bit then
      script.add('add rsp,#40');

    script.add('ret');

    script.add('newspeed:');
    script.add('dd '+inttohex(pdword(@x)^,8));

    try

//      showmessage(script.Text);
      Clipboard.AsText:=script.text;
      autoassemble(script,false);
    except
      raise exception.Create('Failure setting speed');
    end;
  finally
    script.free;
  end;

end;


end.

может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать
(dll-библиотеки чучуть попоже залью)

gopnik.nextmail.ru/speedhack-dll.rar

4

Re: AHK: изменение скорости процесса игры

winstan пишет:

может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать

Это не весь исходник. Сначала там идёт инжект другой dll, в зависимости от разрядности системы, потом перехват функций GetTickCount, timeGetTime и QueryPerformanceCounter. Заканчивается листинг функцией установки коэффициента ускорения.
Я бы на вашем месте не стал ковырять этот код, а просто переписал бы его на хорошо знакомом языке программирования. Для перехвата функций microsoft предлагает готовую библиотеку Detours.

5

Re: AHK: изменение скорости процесса игры

Александр_ пишет:
winstan пишет:

может кто понимает что тут написано я на Delphi ещё не разу не пробовал работать

Это не весь исходник. Сначала там идёт инжект другой dll, в зависимости от разрядности системы, потом перехват функций GetTickCount, timeGetTime и QueryPerformanceCounter. Заканчивается листинг функцией установки коэффициента ускорения.
Я бы на вашем месте не стал ковырять этот код, а просто переписал бы его на хорошо знакомом языке программирования. Для перехвата функций microsoft предлагает готовую библиотеку Detours.

в общемто хочется чтобы всё делать обной программной.

Сейчас в нужные моменты я ускаряю игру через скрип (он узнает по некоторым усолвиям когда над ускорить процес) и СЕ в которую по горячим клавишам посылаеются команды от скрипта