![]() |
|
#1
|
||||
|
||||
![]() Вообщем делал трейнер без юнита вот весь код (взял с чимакса.ру):
Код:
//Немного оптимизации {$R-} {проверка диапазона} {$S-} {проверка стека} {$A+} {"выравнивание слов"} program FlatOut; uses windows, messages, commctrl; //Используемые модули,только самое нужное! var WinClass : TWndClass; //переменная класса TWndClass для создания главного окна hInst : HWND; //Хендл приложения Handle : HWND; //локальный хендл Com1 : HWND; //TGroupBox Com2 : HWND; //TButton Com3 : HWND; //TButton Com4 : HWND; //TStaticText Com5 : HWND; //TStaticText Com6 : HWND; //TStaticText Msg : TMSG; //сообщения hFont : HWND; //хендл шрифта win : hwnd; //хендл данного окна var WindowName : integer; //имя окна ProcessId : integer; //ID процесса ThreadId : integer; //Поток buf : PChar; HandleWindow : Integer; //хендл окна игры write : cardinal; const //id наших контролов id_1 = 1; //TGroupBox id_2 = 2; //TButton id_3 = 3; //TButton id_4 = 4; //TStaticText id_5 = 5; //TStaticText id_6 = 6; //TStaticText const WindowTitle = 'Flat-Out'; //конец формы, начало формы, точный заголовок игры Address = $01B40C64; //адрес нашего значения в памяти игры PokeValue = $FFFFFFFF; //значение на которое мы будем менять NumberOfBytes = 4; //кол-во байт {$R XPMan.res} //Здесь у меня лежит иконка моего трейнера и манифес, //это для того что бы все контролы были в стиле XP procedure Cheating; //Собственно сама процедура изменения значения begin WindowName := FindWindow(nil,WindowTitle); //находим окно игры If WindowName = 0 then //или,обьясняем пользователю чтобы begin //он запустил игру MessageBox(win,'Вначале игра,а потом трейнер.','Ошибка',MB_OK or MB_ICONINFORMATION); end; ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); GetMem(buf,1); buf^ := Chr(PokeValue); WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);//пишем в наш адресс наше значение FreeMem(buf); CloseHandle(HandleWindow);//конец формы, началоформы, закрываем хэндл, чтобы не вылететь с ошибкой end; procedure ShutDown; //процедура выхода из программы begin DeleteObject(hFont); //удаляем шрифт UnRegisterClass('Sample Class', hInst); //удаляем окно ExitProcess(hInst); //закрываем окно Halt; //на всякий случай :) end; procedure About; //наше окно о программе begin MessageBox(win, ' [C0DED]: bY g-l-u-k [TeaM - X] ' +#13#10+ ' ' +#13#10+ ' GreatZzz....: ' +#13#10+ ' ' +#13#10+ ' Baron_Gede,6aHguT,AllexY ' +#13#10+ ' And all TeaM - X Members ! ' +#13#10+ ' ' +#13#10+ ' Write on pure Delphi (WinAPI) ' +#13#10+ ' Сopyright (g-l-u-k)R 2004-2005 ' +#13#10+ ' ' +#13#10+ ' http://www.team-x.ru ' +#13#10+ ' e-mail : g-l-u-k@rambler.ru ' +#13#10+ ' ' +#13#10+ ' GEngine v0.1 ' +#13#10+ ' All Right Reserved ', 'About',MB_OK or MB_ICONINFORMATION); end; function WindowProc(hwnd, msg, wparam, lparam: longint): longint; stdcall; //обработчик сообщений begin Result := DefWindowProc(hwnd, msg, wparam, lparam); case Msg of WM_COMMAND: case LoWord(wParam) of id_2 : if HiWord(wParam) = bn_Clicked then About; //если пользователь нажимает на кнопку "About",получат свой About id_3 : if HiWord(wParam) = bn_Clicked then ShutDown; //если выход то...... end; WM_DESTROY: ShutDown; end; end; begin hInst := GetModuleHandle(nil); with WinClass do begin Style := CS_PARENTDC; //стиль класса главного окна hIcon := LoadIcon(hInstance, IDI_APPLICATION); //иконка программы lpfnWndProc := @WindowProc; //назначение обработчика сообщений hInstance := hInst; hbrBackground := COLOR_BTNFACE + 1; //цвет окна lpszClassName := 'Sample Class'; //класс окна hCursor := LoadCursor(0, IDC_ARROW); //активный курсор end; InitCommonControls; RegisterClass(WinClass); //регистрация класса в сис-ме {Создание главного окна программы} Handle := CreateWindowEx(0, 'Sample Class', '[FlatOut] Trainer +1', WS_OVERLAPPED or WS_SYSMENU or WS_VISIBLE, 503, 345, 234, 222, 0, 0, hInst, nil); {Создание шрифта} hFont := CreateFont( -12, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'Terminal'); Com1:=CreateWindow( 'Button', 'Trainer Options:' , WS_CHILD or BS_GROUPBOX or WS_VISIBLE, 2,2,222,165, Handle, id_1, hInst,nil); SendMessage(Com1,WM_SETFONT,hFont,0); Com2 := CreateWindow( 'Button', 'About', WS_CHILD or BS_TEXT or WS_VISIBLE, 3, 171, 74, 20,Handle, id_2, hInst, nil); SendMessage(Com2,WM_SETFONT,hFont,0); Com3 := CreateWindow( 'Button', 'Quit', WS_CHILD or BS_TEXT or WS_VISIBLE, 148, 171, 74, 20,Handle, id_3, hInst, nil); SendMessage(Com3,WM_SETFONT,hFont,0); Com4 :=CreateWindow( 'Static', '[F1] :...: More Money' , WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE, 51,25,117,17,Handle, id_4, hInst,nil); SendMessage(Com4,WM_SETFONT,hFont,0); Com5:=CreateWindow( 'Static', '[C0DED] :...: g-l-u-k [TeaM - X]' , WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE or WS_DISABLED, 32,145,180,17,Handle, id_5, hInst,nil); SendMessage(Com5,WM_SETFONT,hFont,0); Com6:=CreateWindow( 'Static', '[R.Mouse] :...: About Box ' , WS_CHILD or SS_LEFT or SS_NOTIFY or WS_VISIBLE, 26,50,190,17,Handle, id_6, hInst,nil); SendMessage(Com6,WM_SETFONT,hFont,0); //Цикл сбора сообщений while(GetMessage(Msg, Handle, 0, 0)) do begin TranslateMessage(Msg); //приём сообщений if (GetAsyncKeyState(vk_f1 ) <> 0) then Cheating; //если нажата клавиша F1,читим игру if (GetAsyncKeyState(vk_RButton) <> 0) then About; //если нажата правая кнопка мыши,то показываем About if (GetAsyncKeyState(vk_Escape ) <> 0) then ShutDown; DispatchMessage(Msg); //удаление сообщений из очереди end; end. Вообщем вот код который нужен: Код:
WindowTitle = 'GTA:SA:MP'; //Сдесь подставил точное имя своей игры Address = $0C126JG2; //подставил свой PokeValue = $FFFFFFFF; // ... NumberOfBytes = 4; //... А вот на последних 2-х строк завис. Вообщем открыл станд. калькулятор (Пуск=>Все программы=>Стандартные=>Калькулятор), выбираю Dec, ввожу 100 000 и потом нажимаю на Hex, пишет "186A0" и я после $ подставил это число. Ну вообщем там рядом стояло 8 байт ну я и ввел: Код:
WindowTitle = 'GTA:SA:MP'; //Сдесь подставил точное имя своей игры Address = $0C126JG2; //подставил свой PokeValue = $186A0; //адресс найденный в калькуляторе NumberOfBytes = 8; //там рядом выбрано 8 байт Вообщем дает не 100 000, а 25 (Хотя трейнер работает, он изменяет значение но не на то что нужно) . Помогите исправить. Начинающий Delphi Помогаю за Спасибо! ![]() |
#2
|
||||
|
||||
![]() Попробуй где NumberOfBytes поставить 4. А то для игры переменная в 8 байт - это как-то слишком...
И еще - она точно целочисленная? jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
||||
|
||||
![]() Цитата:
Насчет целочисленности я не знаю... Начинающий Delphi Помогаю за Спасибо! ![]() |