-
Постов
130 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные 24K
-
-
И да, кстати, отсутствие какой-либо активности на форуме в течение месяца автоматически будет понижать текущий уровень репутации на 32 пункта.
жестоко очень
-
так я их с инета взял мне не жалко)))
-
а чего ce станет платной?
Ea games тоже решили подшутить чтоли?
установил с диска лицензию (Покупал 2 года назад, такого не было никогда) и просит ввести код, а кнопка далее где? и с чего он за 2 года попросил заново ввести ключ?
и когда вводиш клю (Я их штук 20 ввёл) они ошибку на все выдают
-
Я сразу понял что это какой то прикол. так как Cheat engine в жизни не станет платной тем более $1800
-
-
а по моем нет
-
Неудачная шутка
-
Вашему вниманию предоставляется вторая часть учебника о написании небольших трейнеров на Delphi c использованием WinAPI.Данная статья поможет тем,кто по каким-то причинам не разобрался или не понял,как пишутся маленькие по размеру трейнера из предыдущей части данного учебника.На сей раз мы будем писать наш трейнер на WinAPI с использованием ресурсов.Данный способ намного проше,чем первый,а так же я приведу пример как блокировать программы,которые шпионят за нашим трейнером.Опять-таки приведу аргументы в пользу данного метода написания трейнеров:
" Писать нам наш трейнер будет легче,так как работаем мы с ресурсами.Для этого нам нужен хороший редактор ресурсов (Restorator или ResHaker),я предпочитаю 2-ой. " По идеи данный способ позволит нам скостить ~ 1-1,5 кб.
В крайности я вдаваться не буду,так что приступим.
Кодинг
Для начала нам придётся создать в блокноте файл trainer.rc,который будет содержать следующие строки:
======================trainer.rc============================
100 DIALOG 0, 0, 173, 69
STYLE DS_SETFONT | DS_CENTER | WS_CAPTION | WS_SYSMENU
CAPTION "[FlatOut] Trainer +1"
FONT 8, "Terminal"
{
PUSHBUTTON "About", 102, 2, 52, 36, 15, BS_FLAT
PUSHBUTTON "Close", 101, 132, 52, 38, 15, BS_FLAT
GROUPBOX "Trainer options: ", -1, 1, -1, 172, 51
LTEXT "[C0DED] <--::--> bY g-l-u-k [TeaM - X]", -1, 7, 36, 164, 12, WS_DISABLED
LTEXT "[F1] :.......: More Money", -1, 7, 9, 126, 12, WS_DISABLED
}======================trainer.rc============================
После создания этого файла перетащите его на brcc32.exe,который лежит в папке "Program Files\Borland\Delphi7\Lib".После этого получам trainer.res,который подлинкуем к нашему трейнеру.
program FlatOut; //Опять будем ломать FlatOut
uses
windows, messages
; //Именно по этому наш трейнер должен весить
//меньше,если помните то в прошлой части учебника мы использовали //ещё и commctrl.
const
ID_ABOUT = 102; //Номера контролов нашего ресурса
ID_EXIT = 101;
Elapse = 10; //Нужен для таймера
aboutcap = 'About'; //Наш About Dialog
aboutmsg = ' [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+
' copyright (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 ';WindowTitle = 'Flat-Out'; //Название окна игры
Address = $01B40C64;//Адресс нашего значения
PokeValue = $FFFFFFFF;//наше значение
NumberOfBytes = 4;//Кол-во байтvar
Msg : TMSG;
Win : HWND;
WindowName : Integer;
ProcessId : Integer;
ThreadId : Integer;
hInst : Dword;
Buf : PChar;
HandleWindow : Integer;
Write : Cardinal;{$R trainer.res} //Наш ресурс в котором хранится окно трейнера
//Вот самая интересная часть нашего трейнера,процедура роверки.
//Если TrainerSPY активен,то мы обломим следящего за нашим //трейнером.
function IsTrainerSpyActive:bool;
var
hProcess,hKernel:dword;
addr:pointer;
b:byte;
dummy:cardinal;
proc:pchar;
begin
result:=false;
proc:='WriteProcessMemory';
if FindWindowExA(0,0,nil,'Trainer Spy')<>0 then
begin
result:=true;
exit;
end;hProcess:=GetCurrentProcess;
hKernel:=LoadLibrary('kernel32.dll');
if hKernel<>0 then
begin
addr:=GetProcAddress(hKernel,proc);
ReadProcessMemory(hProcess,addr,@b,1,dummy);
FreeLibrary(hKernel);
if b=204 then result:=true;
end;
end;//Процедура взлома игры,описывать полностью не буду,опишу только //самое главное.
procedure Cheating;
begin
if IsTrainerSpyActive then //если TrainerSpy запушен, то вырубаемся
begin
MessageBox(0,'Выруби шпион.','Ошибка зашиты',MB_OK or MB_ICONERROR);
exit;
end;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 Quit; //процедура выхода из программы
begin
EndDialog(win,0);
Halt;
end;[/code
[code]procedure DoTimer; //Дополнительна зашита от шпионов
begin
CreateFileA('C:\logwmemory.bin',$40000000,1,nil,2,1,0);
hInst:= GetModuleHandle(nil);
SetTimer(hInst,1,Elapse,@DoTimer);
end;//Обработчик событий нашего окна
function SettingsDlgProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
begin
case Msg of
wm_InitDialog : begin
end;wm_Close : DestroyWindow(Win);
wm_Destroy : PostQuitMessage(0);
end;Result := 0;
case Msg of
WM_COMMAND : begin
if wParam = ID_EXIT then Quit; //Ели нажата кнопка выхода,выходим
if wParam = ID_ABOUT then MessageBox(Win,aboutmsg,aboutcap,MB_OK or MB_ICONINFORMATION);//А это наш //about
end;
end;
end;//Процедура создания главного окна
Procedure RunSettings;
begin
Win := CreateDialog(hInstance,PCHar(100),0,@SettingsDlgProc);
Showwindow(Win,SW_SHOW);
Updatewindow(Win);
end;
begin
RunSettings;
while GetMessage(Msg,0,0,0) do
begin
//Цикл сбора сообщений
TranslateMessage(Msg);
if (GetAsyncKeyState(VK_F1) <> 0) then Cheating;//Горячая клавиша
DispatchMessage(Msg);
end;end.
В заключении данного учебника я ещё раз повторюсь, что писать трейнера на Delphi не только можно но и нужно. У меня трейнер получился ~19 кб. После сжатия FSG 2.0 вышло ~11 кб, ну это уже по божески. От себя я добавлю следующее, "Delphi самый простой в изучении язык программирования. "Надеюсь, что данным учебником я сумел опровергнуть следующее мнение, что "Delphi - это мусорогенеротор".
-
Итак, в данном учебнике я попробую обьяснить и рассказать, как в Delphi пишутся трейнеры. Вы наверное сразу же подумаете, что писать трейнеры на Delphi убого,т.к. одна пустая форма в скомпилированном состоянии весит аж 300 Кб. Но я постараюсь разрушить этот миф. Писать наш трейнер мы будем без VCL. Но как же так, скажете вы? - Наш будуший трейнер будет написан на чистом WinAPI.
Приведу в свою защиту несколько фактов:
При написании программ на чистом WinAPI,скомпиленный *.exe будет весить ~15 кб (какие перспективы открываются перед нами).
Наше приложение будет работать в несколько раз быстрее.
Один, но существенный минус - нам придётся описывать всё вручную. Но мы с вами живём в век высоких технологий (хе-хе). В решении нашей задачи нам поможет программа под названием APIx. При помощи данной программы мы сможем спроектировать своё приложение как и в Delphi, но на чистом WinAPI.
Как говорится, "меньше слов, ближе к делу".
Кодинг
Я постараюсь как можно подробнее описать весь код нашего будущего трейнера. Поехали !
//Немного оптимизации
{$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.
Как вы видите писать трейнеры в Delphi на чистом WinAPI не так уж и сложно. У меня размер EXE файла получился ~19 кб (Попробуйте меньше). В следующей статье я раскажу вам второй способ написания трейнера на WinAPI
-
я сейчас проверить не могу, я игру взломал а таблицу не сохранил
-
Нет, я говорю это один из вариантов
-
А почему нельзя вместо:
mov [eax+000000b4],(float)1
mov ecx,[eax+000000b4]Сделать:
mov ecx,(float)1
?
тоже вариант
-
если сделать вот так,то игра вылетит
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
007B1020:
jmp newmem
nop
returnhere:
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov [eax+000000b4],(float)1
originalcode:
mov ecx,[eax+000000b4] <----- инструкция денег
exit:
jmp returnhere
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
007B1020:
mov ecx,[eax+000000b4]
//Alt: db 8B 88 B4 00 00 00
dealloc(newmem) -
>таймер 4 байта
4 байта целое или float?
Таймер 4 байта, не float, адрес времени не изменяется но скрипт написать требуется для того чтобы время было бесконечное везде в миссиях, подмиссиях и дополнительных заданиях
-
Я спецально сделал трейнер для версии от 1C http://forum.gamehac...ta-san-andreas/ ... пользуйся не трать силы на поиски ..... ну если хочешь сам найти адрес таймера то садись в коповскую тачку, запускай CE, поиск неизвестного значение, и когда время будет уменьшаться в CE, decreased value, убиваешь приступника, время прибавляется в CE, Increased value и так далее.... сделаешь скрипт, и он будет работать в миссиях и доп миссиях. т.е бесконечное время будет везде где есть задания на время .... таймер 4 байта..
-
Уважайте тужой труд, я сам из трейнером музыки вытаскивал, я делаю это для себя.....
-
мусика не от тебя а скачена с KGM
а ты всал от h4x0r треиннер
Тема подправлена
-
Собрал самую лучшую музыку для трейнеров в формате .xm (Взято с трейнеров h4x0r'а)
Список музыки:
- Borderlands Music Trainer
- Crash Time 4 - The Syndicate Music Trainer
- Dead Rising 2 Music Trainer
- Dead Space 2 Music Trainer
- Far Cry 2 Music Trainer
- Grand Theft Auto 4 Music Trainer
- Left Behind Rise of the Antichrist Music Trainer
- Mafia 2 Music Trainer
- Plants vs. Zombies Music Trainer
- Saints Row 2 Music Trainer
- Serious Sam HD The First Enconunter Music Trainer
- Supreme Commander 2 Music Trainer
- The Precursors Music Trainer
- Trapped Dead Music Trainer
- Velvet Assassin Music Trainer
- Stalker Call Of Pripyat Music Trainer
- Alan Wake Music Trainer
- Alice Madness Returns Music Trainer
- Batman Arkham City Music Trainer
- Company Of Heroes. Tales Of Valor Music Trainer
- Dead Block Trainer Music
- Dead Rising 2 Off The Record Music Trainer
- Dirt 3 Music Trainer
- Fable 3 Music Trainer
- Fallout 3 Music Trainer
- L.A. Noire Music Trainer
- Napoleon Total War Music Trainer
- Prototype Music Trainer
- Resident Evil 5 Music Trainer
- Rock of Ages Music Trainer
- Terraria Music Trainer
- Tropico 4 Music Trainer
- Zeit 2 Music Trainer
Скачать можно перейдя по ссылке: http://narod.ru/disk...rainer.zip.html
-
Тут сложного ничего нету, заходишь в cheat engune, выбиваешь процесс, выбираешь поиск неизвесого значения, и отсеиваешь после "Точная на доступ" отсеиваеишь ещё раз, выбираешь инструкцию, зоходишь в ассембер, вставление секций "Активировать" и "Деактвировать" здоровье там float значение, так что из оригинального года берём интсруцию и примермно так получиться
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
00626B9E:
jmp newmem
nop
returnhere:
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov [ecx+00000540],(float)999
originalcode:
fld dword ptr [ecx+00000540]
exit:
jmp returnhere
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
00626B9E:
fld dword ptr [ecx+00000540]
//Alt: db D9 81 40 05 00 00
dealloc(newmem) -
Хочу выразить благодарсно Grom-Skynet'у за то что когда я был ещё новичком на форуме помогал объясть как правельно писать скрипты (В лс), и за его полезные статьи
-
трейнер от aliast GTA VICE CITY и Metro 2033 тоже не скачиваются
-
Достаточно найти инструкцию, работающую с этим динамическим адресом, адрес этой интрукции будет статичным.
Для того чтобы адрес который вы нашли при перезагрузки игры не менялся нужно написать скрипт
ээ, для этого надо найти указатели, а скрипт пишется для изменения инструкции, работающей с этим адресом.
я рассказал в краце для тех кто вообще этого не знал
-
В этом учебнике я собираюсь обрисовать основной API, необходимый для создания трейнера в Дельфи. Основы знания Дельфи предпочтительны, но Дельфи итак довольно прост в освоении.
Концепция.
Хорошо, вот что мы хотим от трейнера. Мы запускаем игру. После этого ALT+TAB в Windows. Мы запускаем трейнер, и жмем кнопку. Это действие запишет некие значения в некоторые адреса в игре. Так, например, если мы знаем адрес денег в памяти игры, мы сможем хакать деньги, используя этот трейнер.
Вот что нам надо для этого:
Название окна игры
Запускаем игру, потом переходим в Windows по Alt+Tab. Ищем в панели задач нашу игру и записываем е_ точный заголовок. (К примеру, запустив Red Alert 2, в панели задач Вы увидите кнопку с ее названием - Red Alert 2. Это и есть заголовок главного окна программы. Кстати, Red Alert 2 взломать способом, описанным здесь, не удастся - это DMA игра. Читайте пару документов здесь, посвященных именно A.G.T. и борьбе с DMA)
Адреса в памяти игры (в шестнадцатеричном виде)
Используем программу, подобную GameHack или MTC (Magic Trainer Creator), мы можем найти любое значение в игре и соответствующий ему адрес в памяти. К примеру, адрес в шестнадцатеричном виде 41D090. Запишем и это тоже.
Значение, которое мы хотим записать (в шестнадцатеричном виде):
Так, у нас есть адрес в памяти. Что мы хотим в него записать? Скажем, я хочу 50 единиц золота. То есть первым делом мне надо перевести 50 в шестнадцатеричную форму, используя соответствующий конвертер (подойдет и Калькулятор из Стандартных программ Windows - не забудьте включить инженерное представление - прим.пер.) Конвертер скажет 32. Так что запишите и это значение также.
Число байт, которое мы хотим писать
В том значении, которое мы получили выше, мы должны знать также сколько байт это займет в памяти. К примеру, число 32 займет только 1 байт, но FF07 займет уже два байта. В общем случае, две цифры будут занимать один байт.
Начнем кодить
Мы собираемся использовать Win32 API чтобы записывать значения в память другого процесса. Вот те функции, которые мы будем использовать. По порядку:
FindWindow
GetWindowThreadProcessID
OpenProcess
ReadProcessMemory
WriteProcessMemory
CloseHandle(Прочтите описания этих функций в файле Win32.hlp (или MSDN - прим.пер.) для полного описания. )
Я буду показывать только основы, так что начинающие могут просто копировать код из этого документа и вставлять его в свой проект.)
Итак, начало. Во-первых, мы объявляем наши переменные. Скопируйте и вставьте это в свой проект:
Var WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf : PChar;
HandleWindow : Integer;
written : cardinal;Теперь надо объявить следующие константы. Скопируйте и этот раздел. Эти константы устанавливаются в соответствии с тем, что вы записали выше.
Const WindowTitle = 'prog test';
Address = $41D090;
PokeValue = $32;
NumberOfBytes = 1;Теперь, чтобы записать значения, вы должны получить хэндл памяти игры. Невозможно сделать это в одно действие, поэтому мы сделаем следующее.
Получаем хэндл главного окна
С этим хендлом мы получаем идентификатор процесса (process identifier - pID)
С этим pID, мы получаем хэндл области памяти.
С этим хэндлом мы можем начинать хакать.
Во-первых, нам надо получить хэндл главного окна. Используем функцию FindWindow
WindowName := FindWindow(nil,WindowTitle);
If WindowName = 0 then
begin
MessageDlg('Игра должна быть запущена до трейнера.
Запустите ее, потом трейнер', mtwarning,[mbOK],0);
end;Заметим, что код проверяет, равен ли нулю хэндл этого окна. Если оно равно, это значит, что игра не запущена, так что мы предупреждаем пользователя и говорим ему о том, чтобы он запустил игру.
Теперь нам нужен pID. Мы используем функцию GetWindowThreadProcessId. После этого мы получаем хэндл области памяти через OpenProcess. Скопируйте код, приведенный ниже.
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);Вот оно. Теперь нам надо использовать WriteProcessMemory чтобы писать что-то внутри этого хэндла. Как только мы это сделаем, мы закрываем хэндл. Так принято. Так безопасно. Скопируйте код, приведенный ниже:
GetMem(buf,1);
buf^ := Chr(PokeValue);
WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
FreeMem(buf);
CloseHandle(HandleWindow);Вот исходный код для всего трейнера. Для начинающих программистов, чтобы быстро сделать трейнер, требуется только поменять константы, объявленные в начале программы.
Var WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf : PChar;
HandleWindow : Integer;
write : cardinal;
Const WindowTitle = 'prog test';
Address = $41D090;
PokeValue = $32;
NumberOfBytes = 1;
###########################################################
# (Вставьте следующий код в обработчик OnClick кнопки )#
###########################################################
begin
WindowName := FindWindow(nil,WindowTitle);
If WindowName = 0 then
begin
MessageDlg('Игра должна быть запущена до трейнера.
Запустите ее, потом трейнер', mtwarning,[mbOK],0);
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;- 3
-
В этом теме я расскажу подробнее об DMA адресе (Значит динамический)
DMA адрес это плохо, потому что если вы например нашли адрес денег или жизней то,адрес при перезагрузки игры измениться и нужно будет искать по новой
DMA адресом может быть любое значение жизни, деньги,таймер в миссиях т.д
Для того чтобы адрес который вы нашли при перезагрузки игры не менялся нужно написать скрипт, но для начало нужно найти адрес
Нахождение адреса:
1. Для начало нужно выбрать игру (любая)
2. Начинаем поиск, если в игре значение написано цифрами вам повезло будет легко найти адрес, а если полоской то придёться потрудиться
а)"Адрес в стиле цифр" если адрес у вас в игре записан в цифрах будет лёгко, просто в поиске пишите число в игре, уменьшаете или прибавляете (Процесс отсеивания) после того как нашли адрес выводите его в главную панель, и значения этого адреса можно изменить на любое желаемое вам число и заморозить (При замораживании число которые у вас в игре не уменьшается)
б)"Адрес в стиле полосы или на подобии этого" если адрес у вас в игре записал в полоске или на подобии этого то будет очень сложно (сложность в том что придёться много времени отсеивать),для того чтобы найти такой адрес надо выбрать "Поиск неизвестно значения", уменьшать и прибавлять (Процесс отсеивания) после того как осталось немного адресов а отсеивание не даёт результатом просто выводите все адрес на главную панель и каждый по очереди замораживаете и если число в игре не умешается то это ваш адрес. Если у вас Cheat Engine то написание скрипта будет легче, жмём правой кнопкой мышки по адресе и ннаходим там "Точка остановка на доступ" нажимаем её, и возвращаемся опять в игру и отсеиваем (уменьшаем или прибавляем) возвращаемся к Cheat engine и видим появились инструкции, нажимаете первую инструкцию и справа нажимаем "Отладчик", после этого появился отладчик, нажимаем вверху "Инструменты" и Автоассембел, теперь начинается самое интересное написание скрипта.
в) Бывает и такое что когда в игре цифры и вы используте "Точное значение" поиска, адрес не находиться, но адрес можно найти тоже с помощью поиска "Неизвестного значения"
Написание скрипта:
Нажимате "Шаблон", "Вставление секций ENABLE и DISABLE",после этого "Внедрение кода" и вот вам придстоит написать скрипт, вы напишите его сами, на форeме можно найти много примеров написание скриптов на разный языках програмированния включая Cheat Engine
Примеры скриптов:
Здоровие (Float значение)
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov dword ptr [ecx+00000540],(float)999
originalcode:
fld dword ptr [ecx+00000540]
exit:
jmp returnhere
"gta_sa.exe"+226B9E:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gta_sa.exe"+226B9E:
fld dword ptr [ecx+00000540]
//Alt: db D9 81 40 05 00 00Деньги (обычный DMA адрес)
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov dword [esi+000000B8],#10000000
originalcode:
mov eax,[esi+000000B8]
exit:
jmp returnhere
"gta_sa.exe"+17059B:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gta_sa.exe"+17059B:
mov eax,[esi+000000B8]
//Alt: db 8B 86 B8 00 00 00Вот и все, желаю удачи будущим взломщикам
- 2
Обсуждение работы сайта и форума
in О работе сайта и форума
Опубликовано
с изменением званий не стану спорить, но отнимать 32 пункта репутации это очень серьёзно я бы ещё понял если бы отнималось 5 - 10 пунктов вот это справедливо а 32 пункта не справедливо я считаю, по сообщениям кто то на лето обещал покинуть форум, но не покинуть а по делам уйти а 3 месяца это = 96 O_о