-
Постов
4 022 -
Зарегистрирован
-
Победитель дней
42
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент Xipho
-
Если для отладки используешь OllyDebug - там можно ставить условные брейкпоинты. Если же делаешь это в СЕ - тогда можно воспользоваться Lua.
-
dealloc(newmem) - уничтожение выделенной памяти нужно делать после восстановления оригинальных инструкций, ибо есть вероятность вылета, если, как у тебя написано, делать это до восстановления оригинального кода. Далее, для ThisIsMy необязательно выделять память. Достаточно прописать эту метку в выделенной памяти newmem.
-
Это можно узнать только исследованием кода в отладчике, так как это может быть и указатель на структуру игрока, или же один из указателей на здоровье внутри структуры игрока.
-
По поводу ограничения объем заливаемых за раз файлов - это ограничение хостера, с этим поделать ничего нельзя. Даже если я в настройках форума выставлю больший лимит - заливка файлов большего объема будет завершаться ошибкой. Это тоже одна из причин, по которой я думаю сменить хостера.
-
Да, писать драйвер необходимо, но существует затыка - доступ к этому файлу непрост. Думаю, как вариант, попытаться отправить игру полностью в pagefile.sys, а потом из него страницы памяти игры сдампить. Задумка сырая настолько, что с нее капает )) Но да, вопрос интересный.
-
Имелось в виду, что записывать надо количество байт, равное количеству байт затираемой инструкции. То есть, примерно так же, как с нопами, если затирается меньше байт, чем нужно, остальное балансируется. Так и здесь, хотя достаточно поменять всего один байт, желательно таки записывать все равно два байта, ибо инструкция длиной всего два байта. В большинстве случаев это не принципиально, но я сталкивался с парой игр (The Sims, The Sims 2, The Sims 3), которые вылетали, если в инструкции прыжка менять один байт вместо двух. С чем это связано - я сам не понял. Но факт есть факт.
-
Вообще, по большому счету, достаточно замены лишь одного байта, но иногда несоблюдение баланса опкодов (даже если нопать ничего не надо) приводит к вылету из игры...
-
db EB 14 FF 75 14 - Зачем эти три лишних байта? Достаточно просто db EB 14
-
ТУТ. Самому лень в гугле было набрать?
-
Достаточно поменять всего один байт - в 74 14 (опкоды) надо прописать EB 14.
-
Получение базового адреса процесса. Довольно сомнительный подход, ибо не всегда база экзешника процесса будет равна 0х400000.
-
Да, кстати, подавляющее большинство игр в Windows 7 весьма спокойно "прыгают" в оконный режим при нажатии Alt+Enter.
-
Хм, интересно. С помощью этого же приема можно принудительно отправить игру в оконный режим, путем перехвата функции DirectX - CreateDevice. Надо будет вечерком попробовать.
-
Так, друзья, я нашел более выгодные условия хостинга, при которых платить придется меньше, а плюшек больше, включая объем доступного места, более продвинутый доступ по SSH, больше фтп-аккаунтов (как следствие, можно будет создать для каждого из наших разработчиков отдельную фтп-папку или даже домен третьего уровня, как сейчас есть отдельный у MasterGH), поэтому, скорее всего, в конце июля я осуществлю переезд всего нашего портала (включая сайт и форум) к новому хостеру. Конечно же, постараюсь об этом предупредить заранее, но, на всякий случай, если ближе к 25-30 числам июля вы заметите, что сайт и форум пишут, что закрыты на тех.обслуживание, или же вовсе не будут открываться - знайте, это всего лишь на сутки, пока пропишутся новые НС-ы под нового хостера.
-
1. ebx выбран автором навскидку. На самом деле, можно использовать любой регистр, лишь бы он не использовался в оригинальном коде, иначе это не будет иметь смысла. Ну и, естественно, крайне не рекомендуется использовать регистр указателя стека (ESP). 2. [ebx+350] Что это? Быть может [ebx+250]? - Нет, именно так, как указано, ибо, как видно из найденной цепочки уровней указателей, второй уровень являет собой [[core.dll+00155744h]+350h]+43Ch. 3. Почему 43C? - Потому, что по этому смещению нашелся необходимый адрес от указателя верхнего уровня.
-
Ну, в принципе, это может быть и название модели. Хотя, скорее, какой-то краткий идентификатор модели, по которому при ее создании считываются характеристики из файлов игры типа 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 (транспортное средство), ведь может быть еще и велосипед, и мотоцикл. Поскольку разными читами вызывается один и тот же конструктор, но в итоге даются разные машины в зависимости от введенного чита, я думаю, такой подход вполне логичен. Впрочем, у меня нет под рукой игры, чтобы проверить свои догадки.
-
Не не не )) Я ж написал про анализ реализации встроенного в игру чита спавна машины )) Я считаю, что этот чит как раз таки вызывает конструктор машины, передавая в него параметром ID модели машины, ведь это наиболее логичный вариант, не так ли? )))
-
Статья Джереми Гордона Макрос для облегчения обработки исключительных ситуаций. При использовании в СЕ вряд ли пригодится, но, на всякий: @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. Применение этого макроса - самый простейший способ )) Жаль, что его нельзя применить в автоассемблере СЕ ) Впрочем, если постараться, то можно попробовать что-то подобное сделать. Надо подумать.
-
Не факт. Если этот ID в разные загрузки игры один и тот же, возможно, это не дескриптор уже созданного объекта, а как бы одна из характеристик (модель машины). Тут может быть два варианта, если это ID заполняется один раз при создании объекта машины - тогда да, это сложно сделать, но, опять таки, исследуя код, реализующий встроенный в игру чит спавна машины, можно выйти на конструктор этого объекта и прореверсить передаваемые ему параметры. Я склоняюсь к тому, что именно этот подход применен, ибо он наиболее логичен. Второй вариант - при каждом обращении к объекту считывается его ID и подставляется нужная модель машины. В этом случае можно ID просто подменить, но таков подход не оптимален для быстродействия, следовательно, он наименее вероятен.
-
Не могу сказать точно, надо копаться в реализации чита спавна машин
-
Машины в ГТА 3 - это объекты, которые, если ездят по улицам, принадлежат глобальному объекту игрового мира. Если на них едет игрок - машина принадлежит объекту игрока. Если же машина стоит в гараже - она принадлежит гаражу, который, в свою очередь, принадлежит миру. То есть, для того, чтобы заспавнить машину в каком-либо из гаражей, нужно сначала найти все объекты/структуры гаражей, затем найти структуру того гаража, рядом с которым ты находишься, затем только уже в этой структуре искать меняющийся ID машины, которые ты будешь туда попеременно загонять. В каком-то из старых трейнеров точно была фишка добавления машины в любой из гаражей. Следовательно, сделать это можно. Более простой способ, как описал MasterGH - изучать под отладкой, что происходит при вызове чита спавна машины.