Перейти к содержанию

24K

Пользователи+
  • Постов

    130
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Сообщения, опубликованные 24K

  1. Список не окончателен, может подвергнуться редактированию (кроме количества пунктов). Далее, по поводу активности тоже будем думать. Но ее тоже надо подстегивать, дабы участники не "почивали на лаврах". Вообще, по идее, уменьшение репы не смертельно, ведь у нас уже есть награда за попадание в топ по рейтингу, и эта медаль отниматься не будет, даже если участник этот самый топ теряет. ЗЫ. Небольшой оффтоп под спойлером. У меня была истерика, когда читал:

    с изменением званий не стану спорить, но отнимать 32 пункта репутации это очень серьёзно я бы ещё понял если бы отнималось 5 - 10 пунктов вот это справедливо а 32 пункта не справедливо я считаю, по сообщениям кто то на лето обещал покинуть форум, но не покинуть а по делам уйти а 3 месяца это = 96 O_о

  2. а чего ce станет платной?

    Ea games тоже решили подшутить чтоли?

    iTXE2kRJ.jpg

    установил с диска лицензию (Покупал 2 года назад, такого не было никогда) и просит ввести код, а кнопка далее где? и с чего он за 2 года попросил заново ввести ключ?

    и когда вводиш клю (Я их штук 20 ввёл) они ошибку на все выдают

  3. Вашему вниманию предоставляется вторая часть учебника о написании небольших трейнеров на 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 - это мусорогенеротор".

  4. Итак, в данном учебнике я попробую обьяснить и рассказать, как в 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

  5. если сделать вот так,то игра вылетит

    [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)

  6. >таймер 4 байта

    4 байта целое или float?

    Таймер 4 байта, не float, адрес времени не изменяется но скрипт написать требуется для того чтобы время было бесконечное везде в миссиях, подмиссиях и дополнительных заданиях

  7. Я спецально сделал трейнер для версии от 1C http://forum.gamehac...ta-san-andreas/ ... пользуйся не трать силы на поиски ..... ну если хочешь сам найти адрес таймера то садись в коповскую тачку, запускай CE, поиск неизвестного значение, и когда время будет уменьшаться в CE, decreased value, убиваешь приступника, время прибавляется в CE, Increased value и так далее.... сделаешь скрипт, и он будет работать в миссиях и доп миссиях. т.е бесконечное время будет везде где есть задания на время .... таймер 4 байта..

  8. Собрал самую лучшую музыку для трейнеров в формате .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

  9. Тут сложного ничего нету, заходишь в 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)

  10. Достаточно найти инструкцию, работающую с этим динамическим адресом, адрес этой интрукции будет статичным.

    Для того чтобы адрес который вы нашли при перезагрузки игры не менялся нужно написать скрипт

    ээ, для этого надо найти указатели, а скрипт пишется для изменения инструкции, работающей с этим адресом.

    я рассказал в краце для тех кто вообще этого не знал

  11. В этом учебнике я собираюсь обрисовать основной 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
  12. В этом теме я расскажу подробнее об 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
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.