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

Xipho

Администраторы
  • Постов

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

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

    42

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

  1. Статья Джереми Гордона

    Макрос для облегчения обработки исключительных ситуаций. При использовании в СЕ вряд ли пригодится, но, на всякий:


    @TRY_BEGIN MACRO Handler
    Pushad ;сохраняем текущее состояние
    Mov esi, offset Handler ; Адрес нового исключения
    push esi ; сохраняем старое исключение
    push dword ptr fs: [0] ;устанавливаем новый Handler
    Mov dword ptr fs: [0], esp
    ENDM
    @TRY_EXCEPT MACRO Handler
    Jmp NoException&Handler ;исключений нет, делаем переход
    Handler: Mov esp, [esp + 8] ;исключение есть, получаем старое значение ESP
    pop dword ptr fs: [0] ;востанавливаем старое исключение
    add esp, 4 ; значение ESP перед тем, как SEH был установлен
    Popad ; востанавливаем старое состояние
    ENDM
    @TRY_END MACRO Handler
    Jmp ExceptionHandled&Handler ; исключение было обработано
    @TRY_EXCEPT
    NoException&Handler: ;исключений нет
    pop dword ptr fs: [0] ;востанавливаем старое исключение
    add esp, 32 + 4 ; значение ESP перед тем, как SEH был установлен
    32 для pushad и 4 для смещения Handler (состояние не восстанавливается)
    ExceptionHandled&Handler:
    ; исключение было обработано, или его вообще не было
    ENDM

    Вышеописанный макрос используется так:

    @TRY_BEGIN HandlerName 
    ; Код в этом месте будет проверен на исключения.
    @TRY_EXCEPT HandlerName
    ; Код в этом месте будет выполнен, если исключение произойдет.
    @TRY_END HandlerName
    ; Нормальное выполнение

    Пример программы:

    Чтобы откомпилировать эту программу, Вам потребуется 32 бит. Turbo Assembler

    TASM32 /ml SEH

    TLINK32 SEH, SEH, , IMPORT32.LIB

    .386p
    .model flat, stdcall
    EXTRN ExitProcess:PROC
    EXTRN MessageBoxA:PROC
    ; Определяем @TRY_BEGIN, @TRY_EXCEPT и @TRY_END макрос здесь
    .data
    SzCaption Db ' SEH на Ассме ', 0
    SzException Db ' Исключение было обработано!! ', 0dh, 0ah
    Db ' Нажмите ОК для завершения ', 0
    SzNoException Db ' Исключений нет ', 0
    .code
    WinMain:
    @TRY_BEGIN Zero_Address_Access
    Mov Ebx, 0 ; подготовка для записи в адрес 0
    Mov [Ebx], ebx ; пишим, по адресу 0 (нарушение доступа)
    @TRY_EXCEPT Zero_Address_Access
    ; этот код выполнится, если исключение произойдет.
    call MessageBoxA, 0, offset szException, offset szCaption, 0
    Jmp ExitProgram
    @TRY_END Zero_Address_Access
    ; нормальное выполнение
    ExitProgram:
    call MessageBoxA, 0, offset szNoException, offset szCaption, 0
    call ExitProcess, 0
    END WinMain

    PS. Применение этого макроса - самый простейший способ )) Жаль, что его нельзя применить в автоассемблере СЕ ) Впрочем, если постараться, то можно попробовать что-то подобное сделать. Надо подумать.

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

  3. Машины в ГТА 3 - это объекты, которые, если ездят по улицам, принадлежат глобальному объекту игрового мира. Если на них едет игрок - машина принадлежит объекту игрока. Если же машина стоит в гараже - она принадлежит гаражу, который, в свою очередь, принадлежит миру. То есть, для того, чтобы заспавнить машину в каком-либо из гаражей, нужно сначала найти все объекты/структуры гаражей, затем найти структуру того гаража, рядом с которым ты находишься, затем только уже в этой структуре искать меняющийся ID машины, которые ты будешь туда попеременно загонять. В каком-то из старых трейнеров точно была фишка добавления машины в любой из гаражей. Следовательно, сделать это можно. Более простой способ, как описал MasterGH - изучать под отладкой, что происходит при вызове чита спавна машины.

  4. Если хочешь, чтобы этот чит вызывался при ударе, находишь инструкцию, которая срабатывает при ударе, делаешь с нее прыжок на кейв, в котором восстанавливаешь оригинальную инструкцию, а затем прописываешь прыжок (или лучше вызов) на процедуру, активирующую чит. После вызова процедуры чита нужно непременно прописать прыжок на оригинальный код, иначе после выполнения процедуры ты вернешься в кейв, а из него в оригинальный код уже не вернешься. Можно попробовать сделать прыжок без кейва, но в этом случае не гарантируется правильная работа игры, ведь оригинальная инструкция будет забита прыжком (или вызовом) на процедуру активации чита. В любом случае, я не вижу никакого смысла в вызове встроенных читов игры, если тебе удается ее взломать самостоятельно.

  5. СЕ решает эту проблему созданием в памяти игры собственной выделенной памяти. Она создается по команде автоассемблера alloc(newmem,2048). Но в этом случае движок трейнера (как у СЕ) должен "уметь" рассчитывать самостоятельно прыжок на выделенную память и обратно. Это несложно, но у новичков вызывает некоторые приступы головной боли.

  6. Пользоваться выделенной памятью в памяти процесса. Создать выделенный кусок памяти можно с помощью функции VirtaulAllocEx. Только при таком подходе прыжки на выделенную память нужно будет рассчитывать "вручную".

  7. Проверил на работе.

    Системы: Windows XP х86, Windows 7 x64, Ubuntu Linux x86, Ubuntu Linux x64, Gentoo Linux x64, Ubuntu Server x86.

    Браузеры: Opera, Mozilla Firefox 4, Internet Explorer 8 и 9, Google Chrome, Flock. Проблем не обнаружено. Так что пролема у тебя явно локальная.

  8. В планах у меня переписать эту статью. MasterGH, как-то я тебе скидывал исходник с использованием структур PE для определения реального имени модуля игры. Думаю, в обновленной версии статьи использую этот прием. В этом случае и поиск уникальных сигнатур не понадобится. Впрочем, учитывая наличие aobscan в CE, актуальность поиска реального имени модуля становится под вопросом.

    ЗЫ. Где ж найти время, чтобы реализовать все ближайшие планы?..

  9. Во первых, восстановление кода сделано неправильно, судя по приведенному скрипту, во-вторых, как я и говорил, код кейва должен находиться до прописывания прыжка, но и в секции [DISABLE] восстанавливающий оригинальный код должен быть ДО уничтожения кейва. То есть, dealloc(newmem) должен стоять в самом низу секции [DISABLE]

  10. Форум как раз для того, чтобы помочь человеку повысить скилл, направить его в нужном направлении, а не выложить ему готовые скрипты на блюдечке с голубой каемочкой. Есть тема запроса трейнеров, там, кому нужно, попросит уже готовый трейнер. Не думаю, что кому-то из наших участников понравится, если его скрипт кто-то использует в своем трейнере и не укажет источник. А нечестных людей, к сожалению, хватает повсюду. На этом оффтоп закончили.

  11. Chucky, ты, похоже, сам даже не пытаешься взломать игру, а лишь выпрашиваешь скрипты у тех, кто это делает. И неясно, с какой именно целью ты это делаешь.

    Всем остальным: Отныне и впредь раскрытые скрипты во избежание их "воровоства" публикуем исключительно в разделе, доступ к которому имеют только участники группы "Разработчики".

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

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

  14. блокирование не подписанных драйверов...

    Отключать блокировку неподписанных драйверов можно при загрузке системы. Надо как только пройдет BIOS POST, сразу нажать F8 и выбрать соответствующий пункт меню.

  15. Ребят, извиняйте, конечно, но уж если вы самостоятельно не можете скопировать цепочку байтов из дизассемблера, то что вы вообще в геймхакинге делаете? На нашем ресурсе мы помогаем осваивать геймхакинг новичкам, но для этого должна быть хоть какая-то элементарная подготовка.

    Так что это для меня пустяк.

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

  16. А что тут непонятного? Поочередно берешь каждую инструкцию, и в дизассмеблере СЕ проверяешь, с какими адресами работает эта инструкция. Если она работает с несколькими адресами - значит, это не та инструкция, и надо брать следующую. Если же все инструкции будут работать с несколькими адресами одновременно, тогда придется обратной отладкой искать указатель здоровья героя и ставить на него фильтр. Это все подробно описывается в статьях на сайте и на форуме. Единственный момент, тебе, как новичку, довольно сложно будет проследить в отлдаке состоянии регистров процессора, поэтому, конечно же, предпочтительнее для тебя будет найти инструкцию, работающую только с адресом здоровья твоего героя.

    d820ef9ba39a1f7087907219d61eb180.png

    На скриншоте выделено, как для выбранной инструкции выяснить, с какими адресами она работает

  17. Я уже неоднократно говорил, но повторюсь еще раз. В скриптах TSearch или CE инструкции кейва ВСЕГДА должны писаться ДО забивания прыжком на кейв оригинальной инструкции. В некоторых случаях это может быть не принципиально, но в большинстве других случаев, из-за того, что забивание оригинальной инструкции прыжком на кейв прописано ДО самого кейва, в память игры этот прыжок пропишется до того, как будут прописаны, собственно, инструкции кейва, что гарантированно вызовет вылет из игры. Отсюда вывод - правильная очередность записи в скрипт делается так:

    caveaddress:
    new instructions
    original instruction(s)
    jmp backtogamecode

    originalgameaddress:
    jmp caveaddress
    nop (если нужен)

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

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

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