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

Xipho

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

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

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

    42

Весь контент Xipho

  1. Если для отладки используешь OllyDebug - там можно ставить условные брейкпоинты. Если же делаешь это в СЕ - тогда можно воспользоваться Lua.
  2. dealloc(newmem) - уничтожение выделенной памяти нужно делать после восстановления оригинальных инструкций, ибо есть вероятность вылета, если, как у тебя написано, делать это до восстановления оригинального кода. Далее, для ThisIsMy необязательно выделять память. Достаточно прописать эту метку в выделенной памяти newmem.
  3. Это можно узнать только исследованием кода в отладчике, так как это может быть и указатель на структуру игрока, или же один из указателей на здоровье внутри структуры игрока.
  4. По поводу ограничения объем заливаемых за раз файлов - это ограничение хостера, с этим поделать ничего нельзя. Даже если я в настройках форума выставлю больший лимит - заливка файлов большего объема будет завершаться ошибкой. Это тоже одна из причин, по которой я думаю сменить хостера.
  5. Да, писать драйвер необходимо, но существует затыка - доступ к этому файлу непрост. Думаю, как вариант, попытаться отправить игру полностью в pagefile.sys, а потом из него страницы памяти игры сдампить. Задумка сырая настолько, что с нее капает )) Но да, вопрос интересный.
  6. Имелось в виду, что записывать надо количество байт, равное количеству байт затираемой инструкции. То есть, примерно так же, как с нопами, если затирается меньше байт, чем нужно, остальное балансируется. Так и здесь, хотя достаточно поменять всего один байт, желательно таки записывать все равно два байта, ибо инструкция длиной всего два байта. В большинстве случаев это не принципиально, но я сталкивался с парой игр (The Sims, The Sims 2, The Sims 3), которые вылетали, если в инструкции прыжка менять один байт вместо двух. С чем это связано - я сам не понял. Но факт есть факт.
  7. Вообще, по большому счету, достаточно замены лишь одного байта, но иногда несоблюдение баланса опкодов (даже если нопать ничего не надо) приводит к вылету из игры...
  8. db EB 14 FF 75 14 - Зачем эти три лишних байта? Достаточно просто db EB 14
  9. ТУТ. Самому лень в гугле было набрать?
  10. Достаточно поменять всего один байт - в 74 14 (опкоды) надо прописать EB 14.
  11. Получение базового адреса процесса. Довольно сомнительный подход, ибо не всегда база экзешника процесса будет равна 0х400000.
  12. Да, кстати, подавляющее большинство игр в Windows 7 весьма спокойно "прыгают" в оконный режим при нажатии Alt+Enter.
  13. Хм, интересно. С помощью этого же приема можно принудительно отправить игру в оконный режим, путем перехвата функции DirectX - CreateDevice. Надо будет вечерком попробовать.
  14. Так, друзья, я нашел более выгодные условия хостинга, при которых платить придется меньше, а плюшек больше, включая объем доступного места, более продвинутый доступ по SSH, больше фтп-аккаунтов (как следствие, можно будет создать для каждого из наших разработчиков отдельную фтп-папку или даже домен третьего уровня, как сейчас есть отдельный у MasterGH), поэтому, скорее всего, в конце июля я осуществлю переезд всего нашего портала (включая сайт и форум) к новому хостеру. Конечно же, постараюсь об этом предупредить заранее, но, на всякий случай, если ближе к 25-30 числам июля вы заметите, что сайт и форум пишут, что закрыты на тех.обслуживание, или же вовсе не будут открываться - знайте, это всего лишь на сутки, пока пропишутся новые НС-ы под нового хостера.
  15. Да, немного оговорился ) Скажем так, в большинстве современных игр применяется DirectInput
  16. 1. ebx выбран автором навскидку. На самом деле, можно использовать любой регистр, лишь бы он не использовался в оригинальном коде, иначе это не будет иметь смысла. Ну и, естественно, крайне не рекомендуется использовать регистр указателя стека (ESP). 2. [ebx+350] Что это? Быть может [ebx+250]? - Нет, именно так, как указано, ибо, как видно из найденной цепочки уровней указателей, второй уровень являет собой [[core.dll+00155744h]+350h]+43Ch. 3. Почему 43C? - Потому, что по этому смещению нашелся необходимый адрес от указателя верхнего уровня.
  17. Ребят, вы чего? О_____О Кто же в ИГРЕ пытается обработать подобные нажатия??? В играх, по крайней мере, в большинстве, используется DirectInput (dinput.dll), на него и надо делать хук.
  18. Отрывок из статьи, ссылку на которую давал выше: Из этого отрывка следует, что при обработке исключений система передает управление на адрес, указанный в обработчике исключений потока.
  19. Ну, в принципе, это может быть и название модели. Хотя, скорее, какой-то краткий идентификатор модели, по которому при ее создании считываются характеристики из файлов игры типа 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 (транспортное средство), ведь может быть еще и велосипед, и мотоцикл. Поскольку разными читами вызывается один и тот же конструктор, но в итоге даются разные машины в зависимости от введенного чита, я думаю, такой подход вполне логичен. Впрочем, у меня нет под рукой игры, чтобы проверить свои догадки.
  20. Не не не )) Я ж написал про анализ реализации встроенного в игру чита спавна машины )) Я считаю, что этот чит как раз таки вызывает конструктор машины, передавая в него параметром ID модели машины, ведь это наиболее логичный вариант, не так ли? )))
  21. Статья Джереми Гордона Макрос для облегчения обработки исключительных ситуаций. При использовании в СЕ вряд ли пригодится, но, на всякий: @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. Применение этого макроса - самый простейший способ )) Жаль, что его нельзя применить в автоассемблере СЕ ) Впрочем, если постараться, то можно попробовать что-то подобное сделать. Надо подумать.
  22. Не факт. Если этот ID в разные загрузки игры один и тот же, возможно, это не дескриптор уже созданного объекта, а как бы одна из характеристик (модель машины). Тут может быть два варианта, если это ID заполняется один раз при создании объекта машины - тогда да, это сложно сделать, но, опять таки, исследуя код, реализующий встроенный в игру чит спавна машины, можно выйти на конструктор этого объекта и прореверсить передаваемые ему параметры. Я склоняюсь к тому, что именно этот подход применен, ибо он наиболее логичен. Второй вариант - при каждом обращении к объекту считывается его ID и подставляется нужная модель машины. В этом случае можно ID просто подменить, но таков подход не оптимален для быстродействия, следовательно, он наименее вероятен.
  23. Не могу сказать точно, надо копаться в реализации чита спавна машин
  24. Машины в ГТА 3 - это объекты, которые, если ездят по улицам, принадлежат глобальному объекту игрового мира. Если на них едет игрок - машина принадлежит объекту игрока. Если же машина стоит в гараже - она принадлежит гаражу, который, в свою очередь, принадлежит миру. То есть, для того, чтобы заспавнить машину в каком-либо из гаражей, нужно сначала найти все объекты/структуры гаражей, затем найти структуру того гаража, рядом с которым ты находишься, затем только уже в этой структуре искать меняющийся ID машины, которые ты будешь туда попеременно загонять. В каком-то из старых трейнеров точно была фишка добавления машины в любой из гаражей. Следовательно, сделать это можно. Более простой способ, как описал MasterGH - изучать под отладкой, что происходит при вызове чита спавна машины.
×
×
  • Создать...

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

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