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

MasterGH

Ветераны
  • Постов

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

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

    129

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

  1. Часть1. Пробуем на вкус CE 6.1 Alpha (седьмая альфа от 28 марта)

    Читать только опытным.

    Модифицированная версия CE 5.6 RUS сгенерировала такой скрипт + я его изменил (код который генерит сигнатуру можно увидеть здесь)


    [ENABLE]
    aobscan(_faddress,d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b)
    alloc(_newmem,2048)
    label(_returnhere)

    _newmem:
    mov [ebp+7c],(float)125.0
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]
    jmp _returnhere

    _faddress: // 005AE415 = Manhunt2.exe+1AE415
    jmp _newmem
    nop
    nop
    nop
    _returnhere:

    [DISABLE]
    aobscan(_faddress,909090d8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b)

    _faddress-5:
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    dealloc(_newmem)
    //Alt: db D9 45 7C 56 D9 5C 24 10

    В этой игре как и в большинстве необязательно второй раз искать сигнатуру для отмены чит-кода (как правильно подметил Xipho). Надо исправить скрипт. Вопрос, как?! Потому что вряд ли это можно сделать на CE 5.6 версии - автоассемблер не позволяет создавать метки с изменяемыми смещениями во время выполнения скрипта. Также задача его переделать под паттерн "инициализация, активация и деактивация"+ создать интерфейс для трейнера под последнюю альфа версию CE 6.1. В ней появились новые фишки с переменными и сканированием сигнатур. Наконец, там появилось дизассемблириование в LUA позволяющее делать автоматическую инъекцию и генерацию сигнатур, но для этого нужно писать много мне до этого.

    Нужно помнить, что LUA скрипт выполняется один раз после чего вся его память очищается, поэтому придётся использовать память процесса игры (хотя может быть уже и нет, т.к. не внимательно читал последние изменения в реализах альфа версиях)

    План. Всё делаем на LUA+AA.

    1. Пользователь кликает дважды на файл трейнера.

    2. В нём расположен скрипт скрытия CE с последующей инициализацией.

    3. Инициализация включает в себя

    3.1 Поиск адреса внедрения по сигнатуре и его запоминание

    3.2 Создание скрипта включения/отмены по горячим клавишам

    Сделаем пока так в консоли


    print(healthInjected)
    healthInjected = AOBScan("d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b",+X-C-W)

    Не работает.

    Смотрим пример DB, а он пишет, что работает так:


    function _memrec_myCheat_activating(mr)
    results = AOBScan("d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b","+X-C-W")
    if (results ~= nil) then
    count = stringlist_getCount(results)
    if (count > 1) then
    address=stringlist_getString(results, 1)
    script=[[
    label(aobresult_myCheat)
    registersymbol(aobresult_myCheat)
    ]]..address..[[:
    aobresult_myCheat:
    ]]
    autoAssemble(script);
    end
    object_destroy(results)
    results=nil
    end
    end

    Исправляем и запускаем в консоли.


    results = AOBScan("d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b", "+X-C-W")

    if (results == nil) then
    return
    end

    count = stringlist_getCount(results)
    if (count >= 1) then
    address=stringlist_getString(results, 0)
    end

    object_destroy(results)
    results=nil
    print(address)

    Ага заработало. Показывает верный адрес 005AE415

    Вспомним, что DB писал про новую поддержку переменных в LUA и AA:

    e.g in the lua script you have "bla=123"

    you can then do "mov [eax],$bla"

    same for addresses, but remember that ce uses hexadecimal strings

    so:

    lua: address="00400500"

    aa: mov eax,[$address]

    Это информация поможет составить скрипт, где найденный адрес будет встроен в автоассеблерный текст.

    Стоп, стоп... Всё это было исследование ключевых моментов. Не стоит углубляться в него слишком сильно. Иначе мы получим множество осколков программы, которые будет сложно соединить.

    Вернёмся к началу что должно быть, но теперь уже яснее.

    Графического интерфейса трейнера пока не будет.

    Инициализация чит-кода не должна быть видна пользователю, в таблице CE должен появиться чит-код когда процесс игры найден и было подключение к нему. Всё вместе выглядит так:

    1. Написать скрипт LUA:

    1.1) Инициализация

    - поиск и подключение к процессу

    - поиск сигнатуры байт

    - формирование АА скрипта инициализации и его запуск (возможно без АА)

    - формирование АА скрипта как записи в таблице и регистрация горячей клавиши

    - Написать условие, если процесс игры был закрыт : вывести сообщение, очистить таблицу, ожидать процесс с последующей инициализацией.

    После того как это будет сделано.

    2. Встроить логику скрытия окна CE

    3. Создать интерфейс трейнера

    Конец первой части...

    Часть2. Пробуем на вкус CE 6.1 Alpha (седьмая альфа от 28 марта пофиксенная из SVN)

    Сделаем попытку открытия доступа к процессу и когда это произойдёт обработаем это событие.


    -- 1. Активировать циклический поиск процесса
    aalist = getAutoAttachList()
    stringlist_add(aalist,"Manhunt2.exe");

    -- После того как процесс был открыт вызовется этот обработчик
    function onOpenProcess(processid)

    showMessage("Я в функции onOpenProcess")

    -- 2. Формирование и запуск инициализирующего скрипта
    -- Поиск адреса внедрения

    -- 3. Сделать: формирование скрипта активации и добавление его в таблицу CE

    -- 4. Сделать: формирование скрипта деактивации и добавление его в таблицу CE

    end

    Сохраним этот скрипт в окне "Lua script: Cheat Table" вызываемого по "Ctrl+Alt+L"

    Сохраним таблицу.

    Выйдем из СЕ.

    Дваждый кликнем по файлу сохранённой таблицы. При этом появиться CE с предложением сразу выполнить LUA-скрипт - соглашаемся.

    Теперь как только запустим игру, то появиться сообщение "Я в функции onOpenProcess"

    Вот ещё один шаблон этой функции, который пригодится например тогда, когда игра есть лаунчер и он запускает другие процессы. Можно скорректировать какой процесс мы будем открывать, если уже открыт какой-то процесс


    --check if the user opened firefox.exe (for next version I should implement a getProcessnameFromID() )
    wrongProcessID=getProcessIDFromProcessName("firefox.exe")
    if (processid==wrongProcessID) then
    --is there a plugin-container.exe?
    correctProcess=getProcessIDFromProcessName("plugin-container.exe");
    if (correctProcess ~=nil) and (correctProcess ~=0) then
    openProcess(correctProcess);
    end;
    end;
    end;
    function onOpenProcess(processid) 

    Имейте ввиду, что onOpenProcess(processid) срабатывает всегда, когда открывается процесс и однажды был выполнен LUA-скрипт аналогичный одному из выше описанных. processid содержит идентификатор процесса с которым можно работать как в примере выше.

    Конец 2-ой части...

    Важное дополнение к этой части (от 5 апреля 2011 г)

    Функция onOpenProcess(processid) оказалась такой "вертлявой", что я сразу не понял в чем дело.

    Оказывается она просто сигнализирует о том, что processid был найден, но ещё не присоединён. И в то же время она сработает если вы вызовите OpenProcess. Это весьма странно. Функция уже должна сразу открывать процесс.

    Выйти из этого положения позволит следующий код.


    aalist = getAutoAttachList()
    stringlist_add(aalist,"Manhunt2.exe");
    attach = false

    -- После того как процесс был открыт вызовется этот обработчик
    function onOpenProcess(processid)

    if (attach) then return end
    -- Здесь код будет срабатывать только один раз если далее не изменить attach на false
    attach = true
    openProcess(processid)

    --- другой код
    end
    ----------
    ----------

    Часть3. Пробуем на вкус CE 6.1 Alpha (седьмая альфа от 28 марта пофиксенная из SVN)

    В первой части был скрипт на постоянное здоровье. Приводить его снова не буду. Задача сделать так чтобы чтобы формировался этот же скрипт, но с изменяемыми адресами при подключении к процессу. А позже мы уберём выделением памяти из скрипта автоассемблера.

    Сначала создайте пустой автоассемблерный скрипт с названием "Inf. Health". Точнее пустой с директивами


    [ENABLE]
    [DISBLE]

    Итак. Вызваем окно LUA по ctrl+alt+L из главного окна CE. И вбиваем


    -- 1. Автоматический поиск процесса и его ожидание
    aalist = getAutoAttachList()
    stringlist_add(aalist,"Manhunt2.exe");
    attach = false

    -- После того как процесс был открыт вызовется этот обработчик
    function onOpenProcess(processid)

    if (attach) then return end
    attach = true
    openProcess(processid)

    -- 2. Поиск адреса внедрения
    results = AOBScan("d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b", "+X-C-W")
    if (results == nil) then
    messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
    closeCE()
    return
    end

    count = stringlist_getCount(results)
    if (count >= 1) then
    address=stringlist_getString(results, 0)
    end

    -- 3. Формирование скрипта и добавление его в таблицу CE
    script =[[
    [ENABLE]
    alloc(_newmem,2048)
    label(_returnhere)

    _newmem:
    mov [ebp+7c],(float)125.0
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]
    jmp _returnhere

    ]]..address..[[:
    jmp _newmem
    nop
    nop
    nop
    _returnhere:

    [DISABLE]
    ]]..address..[[:
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    dealloc(_newmem)
    ]]

    te_InfHealth = getTableEntry("Inf. Health")
    memoryrecord_setScript(te_InfHealth, script)

    object_destroy(results)
    results=nil

    -- 4. ормирование интерфейса

    end

    Сохраняем и закрываем CE.

    Теперь запускаем файл таблицы двойным кликом.

    Затем игру (или наоборот игру а затем таблицу это без разницы)

    Тут же сформируется скрипт и если вы посмотрите какой там скрипт, то вы увидите теперь там полностью сформированный скрипт.


    [ENABLE]
    alloc(_newmem,2048)
    label(_returnhere)

    _newmem:
    mov [ebp+7c],(float)125.0
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]
    jmp _returnhere

    005AE415:
    jmp _newmem
    nop
    nop
    nop
    _returnhere:

    [DISABLE]
    005AE415:
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    dealloc(_newmem)

    Как видите здесь нет aobscan, потому что он уже отработал своё.

    Следующий шаг нам надо чтобы скрипт формировался где-то так.


    [ENABLE]
    сode_InfHealth: //005AE415
    jmp cave_InfHealth
    nop
    nop
    nop

    [DISABLE]
    сode_InfHealth: //005AE415
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    Но об этом и о другом в следующей части...

    Важное дополнение к этой части.

    Забыл написать про новую фишку переменных со знаком $;

    Предыдущий сгенированный скрипт можно получить таким и он будет работать совместно с LUA.


    alloc(_newmem,2048)
    label(_returnhere)

    _newmem:
    mov [ebp+7c],(float)125.0
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]
    jmp _returnhere

    $address:
    jmp _newmem
    nop
    nop
    nop
    _returnhere:

    [DISABLE]
    $address:
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    dealloc(_newmem)
    [ENABLE]

    Для этого надо изменить LUA


    --------
    -- 1. Автоматический поиск процесса и его ожидание
    aalist = getAutoAttachList()
    stringlist_add(aalist,"Manhunt2.exe");
    attach = false

    -- После того как процесс был открыт вызовется этот обработчик
    function onOpenProcess(processid)

    if (attach) then return end
    attach = true
    openProcess(processid)

    -- 2. Поиск адреса внедрения
    results = AOBScan("d9xxxxxxd9xxxxxxd8xxxxxxdfxxf6xxxx0fxxxxxxxxxx8bxxe8xxxxxxxx8b", "+X-C-W")
    if (results == nil) then
    messageDialog("Ошибка. Не найден адрес внедрения.\n\rТрейнер будет закрыт!",1, 2)
    closeCE()
    return
    end

    count = stringlist_getCount(results)
    if (count >= 1) then
    address=stringlist_getString(results, 0)
    end

    -- 3. Формирование скрипта и добавление его в таблицу CE
    script =[[
    [ENABLE]
    alloc(_newmem,2048)
    label(_returnhere)

    _newmem:
    mov [ebp+7c],(float)125.0
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]
    jmp _returnhere

    $address:
    jmp _newmem
    nop
    nop
    nop
    _returnhere:

    [DISABLE]
    $address:
    fld dword ptr [ebp+7c]
    push esi
    fstp dword ptr [esp+10]

    dealloc(_newmem)
    ]]

    te_InfHealth = getTableEntry("Inf. Health")
    memoryrecord_setScript(te_InfHealth, script)

    object_destroy(results)
    results=nil

    -- 4. ормирование интерфейса

    end
    ---------------

    Если посмотреть выше написанный скрипт, то он смотрится несколько громоздко это только для одного чита. А самое главное что писать всё это долго и неудобно.

    И тогда я задумался есть ли какой-то вариант нового формата?!

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

    Имя читкода

    Адрес

    Выполнять ли оригинальный код

    Тело чит-кода

    Всё это можно вписать в компактный формат наиболее удобный xml файл, который можно поместить в ресурсы с трейнером LUA.

    Представьте себе, что достаточно написать вот эти строчки для осуществления задуманного, все остальное за вас сделает LUA.


    <process name = "Manhunt2.exe">
    <cheat name ="InfHealth" address = "Manhunt2.exe+1AE415" originalcode = "true">
    mov [ebp+7c],(float)125.0
    </cheat>
    </process>

    Только для обработки придётся писать специальный LUA-анализатор. Или использовать анализатор совместной с free pascal на котором скомпилирован CE...

  2. Есть несколько способов занопить инструкцию в CE.

    1) Вручную написав скрипт CE

    2) Добавив инструкцию в список, если мне память не изменяет там можно двойным кликом как нопить так и восстанавливать.

    Tseatch возможно не стоит использовать, т.к. это программа не правильно дизассемблирует инструкции SIMD и в ней нет обращения к модулям типа этого 

    core.dll + 448:

    твои инструкции

  3. 28 марта вышла 7 Альфа версия CE 6.1 (скачать)

    Dark Byte:

    fixed some disassembler bugs

    exe trainer can now add extra files to the package (e.g when using extra lua libraries. Also, main.lua is not part of the default package, so if you make changes there and your trainer makes use of it, add it manually)

    structure spider gui/speed improvements

    Implemented shared memory (useful for debugging)

    Added the disassembler to lua

    Disassembler can now contain userdefined comments and they get saved in the cheat table

    Fixed some lua functions

    build with lazarus r29986 (64-bit) and r30042 (32-bit) (the ghosting in treeviews should be gone)

    Please reports bugs you find, even if you did report them before (perhaps I fixed them but got broken again)

  4. Если Разработчику очень сильно требуется тема обсуждения его трейенеров, то он может создать её в теме запросов (пока не знаю как Xipho, но я не против). Я перенёс имеющихся три темы обсуждений из временного форума авторов в тему запросов.

    Во временном форуме больше нельзя создавать темы и сообщения - надо стараться избавиться от временного форума побыстрее - задача из него перенести старые сообщения в новый формат. Там где голые скрипты, то они должны быть в виде файла-таблицы CE и перенесены в новый формат публикации с описанием.

  5. Изменены правила форума "Трейнеры"! Вы их можете увидеть в шапке форума. Уведомления об изменений этих правил будут появляться здесь.

    Темы из форума "Таблицы и скрипты" перемещены в форум "Временный форум авторов" (скрипты и таблицы теперь можно публиковать только в форумме "Трейнеры, скрипты, модули (PC, Windows)")

    К авторам просьба Ваши трейнеры опубликовать по новым правилам. Иначе это придётся сделать Администрации от имени ваш учётных записей. Этот процесс долгий.

    Новые изменения ведут к лучшей организации информации. Позволят форуму быть лучше чем раньше.

  6. Я посмотрел всё-таки на смалл бейсик нельзя определить размер получаемых данных от сервера. Может быть я плохо смотрел, не знаю. Во всяком случае я не счёл тратить время на поиски решения проблемы. Это подтверждение того что на смалл бейсике можно писать программы решающие ограниченный круг задач. Или же решаемые но с потерей времени.

    Я написал программу на C#. Можешь глянуть на пост здесь. Аналогично можно было бы написать на basiс.net. Может быть тебе покажется громоздким код для такой простой программы. Но все что в ней есть, то хорошо документировано на русском языке в MSDN с примерами.

    Смотреть код надо с метода static void Main(string[] args) - там основная логика, а остальное классовая обвёртка.

  7. Программа делающая следующее.

    Показывает изменилась ли страница на сервере. Если да то уведомляет. Промжуточную информацию сохраняет в info.txt там же где расположен программа. Написал программу за 15 минут вместе с перерывами.

    * 1) От сервера gamehacklab.ru ты забираешь ответ о размере страницы

    * 2) Если размер получен в первый раз, то ты его запоминаешь на жёстком диске в создаваемый новый текстовый файл.

    * 3) Если файл уже создан и из него можно прочитать размер, то ты его сравниваешь с полученным от сервера.

    * 4) Если размеры не равные, то новый размер сохраняется в перезаписываемый файл и раздаётся оповещающий сигнал 2 раза.

    * 5) Программа закрывается.

    Исходник (привожу специально текстом, а не файлами):


    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Media;
    using System.Threading;

    namespace WhileGetInetInfo
    {
    class Program
    {

    static class FileOpearations
    {
    private const string filename = @"info.txt";

    /// <summary>
    /// Получить полный путь до файла информации из директории с программой
    /// </summary>
    /// <returns>Полный путь</returns>
    private static string GetFullPathINFO()
    {
    return Environment.CurrentDirectory + "/" + filename;
    }

    /// <summary>
    /// Получить прошлый размер
    /// </summary>
    /// <returns>Размер, если была ошибка, то возвращает ноль</returns>
    public static long GetLastSize()
    {
    string PathINFO = GetFullPathINFO();
    long size = 0;
    try
    {
    using (StreamReader sr = new StreamReader(PathINFO))
    size = long.Parse(sr.ReadLine());
    }
    catch { }
    return size;
    }

    /// <summary>
    /// Сохранить новый размер в файл
    /// </summary>
    /// <param name="size">Размер</param>
    public static void SaveLastSize(long size)
    {
    string PathINFO = GetFullPathINFO();
    using (StreamWriter sr = new StreamWriter(PathINFO))
    sr.WriteLine(size.ToString());
    }
    }

    static class ConnectionOpearations
    {
    private const string uri = @"http://gamehacklab.ru";

    /// <summary>
    /// Получить прошлый размер
    /// </summary>
    /// <returns>Размер, если была ошибка, то возвращает ноль</returns>
    public static long GetLastSize()
    {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

    request.MaximumAutomaticRedirections = 4;
    request.MaximumResponseHeadersLength = 4;
    request.Credentials = CredentialCache.DefaultCredentials;
    request.Timeout = 10000;

    long size = 0;
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
    Stream receiveStream = response.GetResponseStream();
    using (StreamReader readStream = new StreamReader(receiveStream))
    size = readStream.ReadToEnd().Length;
    }

    return size;
    }
    }

    static void ShowErrMess(string mess)
    {
    Console.WriteLine(mess);
    }

    static void Pause()
    {
    Console.Read();
    }


    static void Main(string[] args)
    {
    /*
    * 1) От сервера ты забираешь ответ о размере страницы
    * 2) Если размер получен в первый раз, то ты его запоминаешь на жёстком диске в создаваемый новый текстовый файл.
    * 3) Если файл уже создан и из него можно прочитать размер, то ты его сравниваешь с полученным от сервера.
    * 4) Если размеры не равные, то новый размер сохраняется в перезаписываемый файл и раздаётся оповещающий сигнал 2 раза.
    * 5) Программа закрывается.
    */

    long curSize = ConnectionOpearations.GetLastSize();
    if (curSize==0)
    {
    ShowErrMess("Ошибка соединение с сервером");
    Pause();
    return;
    }

    long lastSize = FileOpearations.GetLastSize();
    if (lastSize != curSize) // если к файлу невозможно обратиться или в нём нет записей
    {
    // То инициировать сообщение о том, что данные на серевере изменились
    FileOpearations.SaveLastSize(curSize);
    Console.WriteLine("Данные на сервере изменились!");

    SoundPlayer sp = new SoundPlayer(Properties.Resources.FileCorrupted);
    sp.Play();
    Thread.Sleep(2000);
    sp.Play();

    Pause();
    return;
    }
    }
    }
    }

    using System;

    GamehacklabInfo.rar

  8. Я не знаю есть ли поддержка рефакторинга в 2008 версии. Но она есть в 2010.

    1) В проекте не должно быть ошибок

    2) Выделить изменяемое слово

    3) Нажать на ctrl+R+R

    4) Переименовать и согласиться.

    В этом случае будет переименовывание там где надо. Очень удобно. Стоит почитать побольше про рефакториг и шаблоны для различных часто встречающихся кусках кода. Тогда скорость разработки увеличиться.

  9. И, кстати, да. Скрипты от СЕ не выкладывайте на паблик, публикуйте их в разделе для разработчиков, чтобы у наших участников их не воровали.

    Я с Xipho поговорил, он ответил это не принуждение. Те кто желают выкладывать скрипты публично, то могут это делать.

  10. Уважаемы, Авторы трейнеров, сейчас происходит реорганизация тем с учётом потребностей пользователей.

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

    Созданная тема включает название игры без версии. Если эта тема уже существуют, то писать в ней.

    Все игры по умолчанию касаются игр на PC платформе Windows, без эмуляторов (без флеш игр и т.п.). Если кто-то пожелает постить трейнеры для эмуляторов, для флеш игр, для силверлайт игр и т.п., то написать об этом здесь или мне в личное сообщение.

    В теме пост автора включает:

    1) Версия игры; Версия трейнера/скрипта для этой версии игры; количество опций как например "+7"; дата создания трейнера в формате 00.00.0000;

    2) Скриншот трейнера (залитый на форум)

    3) Описание трейнера (если его не видно на скриншоте)

    4) Ссылка на архив (залитый на форум); в нём может быть .exe файл, таблица CE (указывайте версию CE) или модуль .dll, если это будет что-то другое, то спросите разрешения.

    5) Если надо, то можно включить дополнительную информацию (заключается под спойлер)

    В новых версия Cheat Engine появилась возможность создавать трейнеры на скриптах. Можно использовать этот вариант, а можно выкладывать обычную таблицу CE.

    В посте не надо указывать автора, т.к. подразумевается что Вы автор.

    Обычным пользователям запрещается писать что-либо - они пишут авторам трейнеров в личку (это специальные меры для строго оформления).

    Разработчики имеют право писать только один пост в теме и изменять его когда потребуется.

    Обязательно посмотрите ПРИМЕР.

    Пока на этом всё. Следите за изменениями.

    Добавление от Xipho:

    1. В связи с тем, что на некоторых ресурсах стали появляться трейнеры с нашего сайта настоятельно рекомендуется всем авторам трейнеров включать форму трейнера текст с адресом нашего сайта. Таким образом мы повысим популярность нашего ресурса

    2. Выкладываемый автором трейнер или таблица могут быть для удобства упакованы в формат rar.

  11. Бейсики могут отличаться...

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

    Например.

    При загрузке Windows (заранее нужно поместить ярлык на твою уже написанную программу в Автозапуск) происходит подключение к "gamehacklab.ru"

    Программа версии 1.0 делает следующее:

    1) От сервера ты забираешь ответ о размере страницы

    2) Если размер получен в первый раз, то ты его запоминаешь на жёстком диске в создаваемый новый текстовый файл.

    3) Если файл уже создан и из него можно прочитать размер, то ты его сравниваешь с полученным от сервера.

    4) Если размеры не равные, то новый размер сохраняется в перезаписываемый файл и раздаётся оповещающий сигнал 2 раза.

    5) Программа закрывается.

    Таким образом можно узнать что на главном сайте появилось что-то новое.

  12.  В статье я не разбирался. Может кто разберётся или я сам позже это сделаю. 

    На первый взгляд используется сценарий VBS с компонентом ActiveX.

    Возможно в будущем будет нужен инструмент Flash или Flex builder. Также я хотел ещё найти информацию по отладке SFW и опкодам выполняющихся виртуальной машиной ActionScript... Задача банальна - встраивать чит-коды.

    How to inject actionscript code into the existing SWF file


      
    InputFileName = "Input.swf"       //source SWF file to inject actionscript into
    OutputFileName = "Output.swf"  //output SWF file

    //actionscript code to inject
    actionScriptToInject = "function bla(){}; myparam = 9000;"

    //read information about width, height, top and left of the source swf file
    Set SWFFileInfo = CreateObject("SWFScout.SWFFileInfo")
    SWFFileInfo.LoadFile InputFileName

    FPS = SWFFileInfo.FPS
    Height = SWFFileInfo.YMax - SWFFileInfo.YMin
    Width = SWFFileInfo.XMax - SWFFileInfo.XMin
    CurrentTop = SWFFileInfo.XMin
    CurrentLeft = SWFFileInfo.XMin
    Coord = SWFFileInfo.SystemCoord

    Set SWFFileInfo = nothing

    //now create new movie with same width, height and fps

    Set Movie = CreateObject("SWFScout.FlashMovie")

    Movie.InitLibrary "demo","demo"

    Movie.BeginMovie CurrentLeft,CurrentTop,Width,Height,Coord,FPS,9

    //now inject actionscript before whole movie starts
    movie.AddScript
    movie.SCRIPT_Compile actionScriptToInject

    //merge the original SWF on root level (0=root level)
    movie.AddExternalSWF InputFileName , 0, true

    movie.EndMovie

    movie.SaveToFile OutputFileName

  13. Приятно узнать что у тебя есть интерес к этой теме )

    В настоящее время любой человек постоянно сталкивается с электронной информацией: интернет дома ("выдергивание" информация с сайтов и структуризация информации), интернет на телефоне, работа с файлами на локальных дисках и удалённых дисках, синхронизация данных на разных носителях, создания строк запроса и ответа для получения необходимых данных. Чаще всего может потребоваться создать простой ява-скрипт, консольное приложение или окно формы с кнопочками, которые что-то умели бы делать.

    Да даже просто ОСОЗНАТЬ (это большой шаг), что зная программирование, можно любым образом сформировать строку как тебе надо, любые математические и логические выражения... логические выражения и автоматизация практически любых действий с электронной информацией это вообще самое мощное что можно взять от языка программирования. Хотите чтобы окна на вашем рабочем столе отображались необычным образом, перемещались по-другому, хотите вообще свой менеджер окон в виде древовидной структуры вместо какой-то неудобной панели окон рядом с пуском, "листания" по alt-tab... это можно сделать. Хотите иметь программу базы данных по запускаемым ярлыкам на программы располагаемых по категориям (это не так сложно сделать в C# + так же применить технологию перетаскивания мышкой)... Хотите "забацать" граф как это сейчас называют "нечёткой логики" по поиску оптимального решения среди множества, это тоже не проблема в зависимости от сложности задачи.... и много много всего другого, что можно сделать с помощью языка программирования. Многое из упомянутого сделать не просто, на это надо упорство.

    Ну а что касается создания читов, то тут вообще без программирования никак. Процесс игры это прямо пласт данных и кода + взаимодействия с операционной системой. Тут без средств автоматизации каких-то действий будет туго.... Ну и создание чит-кодов + создание трейнеров + различные эффекты для трейнеров: музыка, визуальные эффекты...

    Всё упомянутое всё равно, что сказать процессору делай то-то и делай это и он будет делать "поедая" электрическую энергию от источника питания. Главная суть не в языке программирования, не в типах процессоров и операционных систем. Главная суть в возможности решения поставленной задачи эффективным способом.

  14. Для создания своей темы нет никаких ограничений.

    Если хочешь иметь возможность заливать файлы(трейнеры) на форум, то тебе нужно вести свою тему по трейнерам пока выкладывая на сторонние хостинги и как придёт время, попадёшь в группу разработчиков, и у тебя появится возможность выкладывать трейнеры на форум. Надеюсь понятно :)

  15. Паттерны действий, которые часто приходится выполнять при создании чит-кода эти действия можно автоматизировать в LUA. А что нельзя на LUA то можно на языке программирования под Windows. Здесь я просто опишу действия с которыми мне приходилось сталкиваться и делал я всё это кропотливо различными программными средствами в оновном OllyDbg или Cheat Engine (такими как окно расструктуризации, сканер памяти, установки бярков на регионы памяти в OllyDbg, фильтрация системных сообщений в OllyDbg кликов мыши и нажатий на клавиши и т.п.). LUA может во многом помочь в отладке, сканировании, сравнении и т.п. в различных ситуациях: в поисках указателей, в сравнении структур, в поисках фильтров, в поисках связей между структурами и указателями и т.п.

    Примеры. Допустим мы нашли адрес или несколько. Что может потребовать в работе с ними.

    1. оповещение об изменении значения (например нам нужно убедится в том, что указатель меняться не будет), об уменьшении(например уменьшение индекса массива), об увеличении.

    2. Оповещение о чтении адреса

    3. Оповещение о записи в адрес

    4. Оповещение о записи и чтении относительно адреса.

    Информация может логироваться. И тогда например можно узнать к какому указателю идёт обращение раньше, а к какому позже...

    Мы можем поставить брейкпоинт на целый регион памяти в котором находятся некоторые адреса и собирать лог-информацию о последовательности обращений к адресам региона. Сделав один такой лог и затем другой можно программно сравнить к каким адресам было обращение, какая была последовательность, какой код отличный или похожий вызывал те или иные адреса.

    Также можно поставить условия установки и снятия бряка на регион памяти, на структуры определённого размера (условия эти могут быть самыми разными).

    Например.

    Лог1. Герой1 стреляет. (Условие поставить бряк на регион, когда происходит чтение адреса X1 и снять когда происходит чтение адреса Y1)

    Лог2. Враг1 стрелятет. (Условие поставить бряк на регион, когда происходит чтение адреса X2 и снять когда происходит чтение адреса Y2)

    Лог3. Герой1 стреляет. (Условие поставить бряк на регион, когда происходит чтение адреса X и снять когда происходит чтение адреса Y)

    Лог4. Враг1 стреляет. (Условие поставить бряк на регион, когда происходит чтение адреса X2 и снять когда происходит чтение адреса Y2)

    Теперь нам попарно нужно отфильтровать логи и возможно мы найдём что-то интересное ;) Возможно, будут обращения к каким-то адресам рядом стоящим, возможно значения этих адресов натолкнут на те или иные мысли ну и т.п. В данном случае это нам должно помочь в нахождении "зацепок" например при создании чит-кода на максимальный урон от выстрела, на фильтр того кто стреляет. Теоритически установка бряка на регион памяти и его "логирование" может избавить от кропотливого исследования вложенных указателей в каждой структуре, т.к. в логах будет больше подсказок К КАКИМ УКАЗАТЕЛЯМ В КАКОЙ ПОСЛЕДОВАТЕЛЬНОСТИ БЫЛО ОБРАЩЕНИЕ например при выстреле. ОЧЕНЬ И ОЧЕНЬ полезный подход.

    Пока я не знаю как в CE добиться установки бряка на регион или на структуру через LUA ( потом попытаюсь разобраться). Но в OllyDbg это можно сделать.

    Едем дальше.

    Допустим у нас есть указатели на структуры и нам надо с ними работать.

    Сравнение как минимум двух структур:

    - поиск отличных значений

    - поиск одинаковых значений

    - оповещение об изменении значения в структуре, если мы не уверены в том что оно постоянное

    Допустим нам надо работать в отладке, когда происходит события срабатывания брейкпоинта на одной или нескольких инструкциях.

    В этом случе может быть полезно сохранить на конкретной иснтрукции1 копию структуры1 игрока1. А затем сделать такую же копию на этой инструкции или на других. А затем эти копии сравнивать в том порядке в каком нужно. При этом можно сохранить множество структур в том числе и стека на одном событии прерывания, а также сохранить показания регистров.

    Ещё одним важным моментом может являться СРАВНЕНИЕ ЛОГИКИ работы кода по определённом маршруту адресов заданными разными параметрами ограничений. Например при сравнении логик теоритически можно очень быстро найти подсвеченные участки отличной логики. Например, вы поднимаете гранату и поднимаете другие боеприпасы и вы можете намного быстрее и удобнее найти участок кода где будут срабатывать разные прыжки.

    Можно автоматизировать следующие действия.

    - Проскакивает ли на дизассемблерной инструкции X, только одно значение или несколько (возможно при каких-то условиях). В любом случае отобразить это значение

    - Проскакивают ли на инструкциях и в регистрах одинаковые значения

    - Сравнение информации (структур по указателям) между предыдущим бряком и следующим.

    Я описал наиболее общие моменты получения и выдергивания "зацепок" когда нужно сделать тот или иной чит-код.

  16. 18 марта вышла 6 Альфа версия CE 6.1 (скачать)

    (5 Альфа вышла 8-го марта, в ней в основном фиксы с дизассемблером, не очень интересно)

    Dark Byte:

    Several assembler/disassembler fixes

    added a structure spider (dissect structure and pointerscan combined)

    added a stringmap, to be used with the structure spider

    fixed a bunch of lua functions , typos, and added some that where missing

    fixed saving/loading TCheat objects

    and fixed a bunch of other minor bugs

    known bugs: Disassembler still seems to have a few bugs

    structure spider is useful in cases where you have a piece of code that is used to access multiple addresses. You can then use the spider to easily find differences, including differences in the pointers is points to

×
×
  • Создать...

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

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