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

Xipho

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

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

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

    42

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

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

  2. cmp byte ptr [_cmp],1
    je _E99
    _E99:

    Этот кусок в принципе вообще не нужен, ибо прыжок делается на инструкцию сразу после инструкции прыжка. Можно просто продолжать выполнение после первого прыжка.

  3. В твоем скрине JMP вероятно может дать зависание программы, ибо постоянно будет выполняться этот прыжок. Впрочем, тут утверждать на сто процентов не могу, ибо не вижу весь код. Это раз. Во-вторых, тебе не надо ставить галочку "Fill with nop's" ибо количество байт JNZ и JMP всегда одинаково. Этим нопом ты "забил" часть какой-то следующей инструкции и велика вероятность вылета из игры или что это у тебя там под отладкой находится.

  4. dealloc(newmem) - уничтожение выделенной памяти нужно делать после восстановления оригинальных инструкций, ибо есть вероятность вылета, если, как у тебя написано, делать это до восстановления оригинального кода. Далее, для ThisIsMy необязательно выделять память. Достаточно прописать эту метку в выделенной памяти newmem.

  5. По поводу ограничения объем заливаемых за раз файлов - это ограничение хостера, с этим поделать ничего нельзя. Даже если я в настройках форума выставлю больший лимит - заливка файлов большего объема будет завершаться ошибкой. Это тоже одна из причин, по которой я думаю сменить хостера.

  6. Да, писать драйвер необходимо, но существует затыка - доступ к этому файлу непрост. Думаю, как вариант, попытаться отправить игру полностью в pagefile.sys, а потом из него страницы памяти игры сдампить. Задумка сырая настолько, что с нее капает )) Но да, вопрос интересный.

  7. Что имелось ввиду под понятием "баланса" я не понял
    Имелось в виду, что записывать надо количество байт, равное количеству байт затираемой инструкции. То есть, примерно так же, как с нопами, если затирается меньше байт, чем нужно, остальное балансируется. Так и здесь, хотя достаточно поменять всего один байт, желательно таки записывать все равно два байта, ибо инструкция длиной всего два байта. В большинстве случаев это не принципиально, но я сталкивался с парой игр (The Sims, The Sims 2, The Sims 3), которые вылетали, если в инструкции прыжка менять один байт вместо двух. С чем это связано - я сам не понял. Но факт есть факт.
  8. Так, друзья, я нашел более выгодные условия хостинга, при которых платить придется меньше, а плюшек больше, включая объем доступного места, более продвинутый доступ по SSH, больше фтп-аккаунтов (как следствие, можно будет создать для каждого из наших разработчиков отдельную фтп-папку или даже домен третьего уровня, как сейчас есть отдельный у MasterGH), поэтому, скорее всего, в конце июля я осуществлю переезд всего нашего портала (включая сайт и форум) к новому хостеру. Конечно же, постараюсь об этом предупредить заранее, но, на всякий случай, если ближе к 25-30 числам июля вы заметите, что сайт и форум пишут, что закрыты на тех.обслуживание, или же вовсе не будут открываться - знайте, это всего лишь на сутки, пока пропишутся новые НС-ы под нового хостера.

    • Плюс 1
  9. 1. ebx выбран автором навскидку. На самом деле, можно использовать любой регистр, лишь бы он не использовался в оригинальном коде, иначе это не будет иметь смысла. Ну и, естественно, крайне не рекомендуется использовать регистр указателя стека (ESP).

    2. [ebx+350] Что это? Быть может [ebx+250]? - Нет, именно так, как указано, ибо, как видно из найденной цепочки уровней указателей, второй уровень являет собой [[core.dll+00155744h]+350h]+43Ch.

    3. Почему 43C? - Потому, что по этому смещению нашелся необходимый адрес от указателя верхнего уровня.

  10. Отрывок из статьи, ссылку на которую давал выше:

    внутрипоточный обработчик исключений

    Этот тип обработчиков обычно используется для защиты некоторых локальных областей кода и устанавливается путем изменения значения, сохраненного системой в памяти по адресу FS:[0]. Каждый поток в вашей программе имеет свое уникальное значение в сегментном регистре FS, так что этот тип обработчиков исключений является поточно-зависимым. Он будет вызываться только в том случае, если исключение происходит во время выполнения кода, защищенного этим обработчиком.

    Значение в FS - 16-разрядный селектор, который указывает на "Блок информации Потока" ("Thread Information Block", TIB), - структуру, которая содержит важную информацию о каждом потоке. Самое первое двойное слово (DWORD) в TIB указывает на структуру, которую мы будем называть - структурой "ERR".

    Структура "ERR" состоит как минимум из двух двойных слов, как показано на следующей схеме:

    1st dword +0 Указатель на следующую структуру ERR (расположенную выше по цепочке).

    2nd dword +4 Указатель на имеющийся обработчик исключений.

    Установка внутрипоточного обработчика исключений

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

    Пример:

    PUSH OFFSET HANDLER
    PUSH FS:[0] ;Адрес следующей структуры ERR.
    MOV FS:[0],ESP ;Помещаем в FS:[0] адрес только что созданной структуры ERR.
    ...
    ... ;Здесь находится защищенный обработчиком код.
    ...
    POP FS:[0] ;Восстанавливаем в FS:[0] адрес предыдущей ERR, которая
    ;до этого была следующей в цепочке вверх после текущей ERR.
    ;Тем самым, мы удаляем текущий обработчик исключений.
    ADD ESP, 4h ; Очищаем стек от остатков ненужной нам более структуры ERR.
    RET
    ;***********************
    HANDLER:
    ...
    ... ;Здесь находится код обработчика исключений.
    ...
    MOV EAX,1 ;Возможные возвращаемые значения и их описание:
    ;eax=1 исключение не было обработано (система вызовет
    ;следующий по цепочке внутрипоточный обработчик);
    ;eax=0 перезагрузить контекст и продолжить выполнение
    ;программы.
    RET

    Из этого отрывка следует, что при обработке исключений система передает управление на адрес, указанный в обработчике исключений потока.

  11. Ну, в принципе, это может быть и название модели. Хотя, скорее, какой-то краткий идентификатор модели, по которому при ее создании считываются характеристики из файлов игры типа handling.cfg.

    К примеру,

    class Car {
    int weight;
    int handlingfactor;
    int maxspeed;
    public Car (int modelid){
    this.weight = GetInfoFromFile(handling.cfg);
    this.handlingfactor = GetInfoFromFile(handling.cfg);
    this.maxspeed = GetInfoFromFile(handling.cfg);
    }
    }

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

  12. Не не не )) Я ж написал про анализ реализации встроенного в игру чита спавна машины )) Я считаю, что этот чит как раз таки вызывает конструктор машины, передавая в него параметром ID модели машины, ведь это наиболее логичный вариант, не так ли? )))

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

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

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