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

Лидеры

  1. keng

    keng

    Ветераны


    • Баллы

      1

    • Постов

      1 635


  2. ARM4ND0

    ARM4ND0

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


    • Баллы

      1

    • Постов

      431


  3. 24K

    24K

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


    • Баллы

      1

    • Постов

      130


Популярный контент

Показан контент с высокой репутацией 14.03.2015 во всех областях

  1. В этом учебнике я собираюсь обрисовать основной 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;
    1 балл
  2. Привет! Сигнатура ищется через Cheat Engine или, например, через OllyDbg (есть для него плагин), при этом важно понять, как они работают. Насколько ты знаешь, скомпилированный ассемблерный код состоит из опкодов команд, адресов и смещений. Допустим, есть такой код: MOV EAX,EBX JMP 0x10 Перед тем, как просто копировать опкоды и использовать их в качестве сигнатуры, стоит немного осмотреть код и разобраться в нем. Первая команда поменяется только в каком-нибудь исключительном случае (скажем, очень большом патче для игры), а вот вторая может поменяться и при небольшом. Представим, что опкоды для второй команды выглядят примерно так: E900000010 E9 - опкод JMP, следующие четыре байта - адрес для прыжка. Эти четыре байта могут поменяться просто запросто - достаточно хотя бы один байт выше или ниже по коду добавить, потому что прыжок относительный (т.е. на некоторое количество байт вверх или вниз от текущего адреса). Такие вот вещи, которые могут легко и часто меняться (адреса и смещения в первую очередь) лучше загонять в wildcard, то есть сигнатура будет выглядеть так: E9???? Но в примере еще была команда MOV, опкоды которой можно взять целиком, я их сейчас придумаю из головы и получится как-то так: ABFFD9E3E9???? Вот и готово. Прежде всего такие сканеры должны искать определенную последовательность команд. В нашем случае это "MOV JMP", потом учитывать операнды, а только потом - адреса переходов и смещения в операндах. PS: Если ты не до конца понимаешь, как работает чей-то код, скрипт или любая методика взлома - лучше сидеть и задавать вопросы, пока тебе внятно не объяснят. Плох тот автор, который выкладывает готовое решение и не поясняет, как оно работает, или же не поясняет достаточно хорошо. Сначала разберись - потом используй сам и объясняй тем, кто еще не разобрался.
    1 балл
  3. Если ты хочешь читать нужное значение, то попробуй так и добавь указатель с адресом pMoney и оффсет 5578. [ENABLE]alloc(newmem,256)label(returnhere)label(originalcode)aobscan(addmoneyaob, 01 88 ?? ?? ?? ?? 8B 88 ?? ?? ?? ?? 83 EC 0C 81 F9) //0041E6E0label(_addmoney)registersymbol(_addmoney)globalalloc(pMoney,8)newmem:mov [pMoney],eaxoriginalcode:add [eax+00005578],ecxjmp returnherepMoney:dd 0addmoneyaob:_addmoney:jmp newmemnopreturnhere:[DISABLE]_addmoney:add [eax+00005578],ecxdealloc(newmem)dealloc(pMoney)unregistersymbol(_addmoney)//Alt: db 48 8D 64 24 D8
    1 балл
×
×
  • Создать...

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

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