Я написал трейнера что бы он изменял сигнатуру по адресу как сделать так что бы он изменял по сигнатуре тоисть что бы её находил и изменял Вот код трейнера : Code: unit Unit3; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, StdCtrls, ExtCtrls, TLhelp32, sButton, sSkinManager, sComboBox, sListBox; type TForm3 = class(TForm) sButton1: TsButton; sSkinManager1: TsSkinManager; procedure sButton1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var hProcess: THandle; Form3: TForm3; PidHandle: integer; PidID : integer; byteArr : Array of byte; lpNumberOfBytesWritten: SIZE_T; lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: SIZE_T; Const ProgramName = 'opera.exe'; implementation {$R *.dfm} function GetProcessID(Const ExeFileName: string; var ProcessId: integer): boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin result := false; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := Sizeof(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while integer(ContinueLoop) <> 0 do begin if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)), PChar(ExeFileName)) = 0) or (StrIComp(FProcessEntry32.szExeFile, PChar(ExeFileName)) = 0) then begin ProcessId:= FProcessEntry32.th32ProcessID; result := true; break; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; procedure pokeX(Address: Cardinal; Data: Array of Byte); var Written: Cardinal; begin WriteProcessMemory(PidHandle, Pointer(Address), @Data, SizeOf(Data), lpNumberOfBytesWritten); end; procedure TForm3.sButton1Click(Sender: TObject); var byteArr : Array of byte; begin if GetProcessID(ProgramName, PidId) then begin PidHandle := OpenProcess(PROCESS_ALL_ACCESS,False,PidId); SetLength(byteArr, 4); byteArr[0] := $90; byteArr[1] := $90; byteArr[2] := $90; byteArr[3] := $8B; pokeX($0F49722E, byteArr); //наш адрес SetLength(byteArr, 0); closehandle(PidHandle); SHOWMESSAGE('Изменения внесены, для их применения необходимо перезапустить игру на текущем уровне сложности'); end else begin MessageDlg('Сначала запустите Сапёр!', mtwarning, [mbOK],0); end; end; end. Трейнер делаю для онлайн флеш игры где адрес меняется после перезагрузки