srg91

Разработчики
  • Публикации

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

  • Посещение

Репутация

78 Intermediate

2 подписчика

О srg91

  • Звание
    Продвинутый пользователь
  • День рождения May 26

Контакты

  • Сайт https://telegram.me/srg91

Информация

  • Пол Мужчина
  • Город Москва
  • Интересы кушать, немного Python

Посетители профиля

473 просмотра профиля
  1.   Спасибо Надеюсь следующее будет чуть более удачным. Будем пробовать встроить получившийся скрипт в LUA форму с выбором машинки из выпадающего списка.
  2.   Записал видео со спавном машин рядом с игроком. Получилось ужасно долго, тихо и в конце похоже пропал звук.  Я решил всё равно выложить, я вряд ли смогу переснять, но если получится исправить - исправлю ссылку на видео. Плюс если что есть текстовая статья - можно выложить её (но она как и видео - огромна).   В видео мы узнаем какие функции вызываются при создании автомобиля через чит-коды и набросаем небольшой скрипт, который будет создавать требуемый автомобиль перед игроком:   Итоговый скрипт:  
  3. [offtop]Это было далекие года назад, вряд-ли  Плюс в основном писал не я, я больше по скриптам - зеркало там забабахать, сохранение инвентаря, etc. У меня упорства никогда не хватает - закончить хоть одну игру )[/offtop]
  4.   у меня что-то не получается может кто еще подскажет. в целом нужно выйти на move_speed, но это всё ruby-объекты и я не уверен как они выглядят в памяти.    Опять же, получилось сделать небольшой скрипт, который можно использовать в любом месте игры. Просто добавь его через Memory Viewer - Tools - AutoAssembler, вставляешь текст и жмешь - File - Assign to current cheat table.  
  5.   Спасибо     1. Да, конечно, можно и перенести. Просто мне кажется, такое ощущение из-за того, что это всё текстом. В целом ничего продвинутого вроде бы не происходит, но возможно я не правильно оцениваю. Поэтому мне кажется нет проблем, если перенесем - главное, что информация где-то есть ) 2. В целом я структурировал текст, возможно попробую на досуге еще раз записать видео. Если получится - дозалью в "Видео" и добавлю ссылочку в начало статьи.
  6.   Привет. Получилось сделать через Ruby, лови скрипт:   Собственно пример использования:   Сделал через переопределение реальных классов, поэтому сработает только при включении чита в главном меню и только с новой игрой. А так же будущие сохранения можно будет загрузить только предварительно включив чит. Я думаю можно это обойти, но увы, на это у меня не было времени и скрипт превращается в кракозябры. Возможно немного позже   Если надоест звук - просто убери строчку: db ' $game_system.se_play($data_system.escape_se)' #13 #10   Плюс расписал подробно, что делал - в статье. Спасибо тебе, что поднял эту тему - было интересно.
  7. Всем привет.   Спасибо Vasabist, который поднял тему RPG Maker. Он попросил сделать возможность ускорения персонажа при нажатии клавиши Shift. Мы как-то давно с другом создавали игры на RPG Maker XP и я даже писал какие-то скрипты, расширяющие возможности персонажа. Тогда уже был VX, но он нам не нравился из-за мелких моделей персонажей. В общем увидел тему, нахлынуло   Сами игры на RPG Maker XP - по сути большой набор Ruby-скриптов, которые выполняются движком RPG Maker с помощью Ruby-интерпретатора.   Сначала я предложил Vasabist использовать фильтры, так как повторяется ситуация с lua-играми - один код работает со множеством адресов. Но потом вспомнил, что  RPG Maker есть такой класс объектов как Events, который так же позволяет выполнить произвольный код при срабатывании определенных условий. Решил по-исследовать - думал выйти на функцию eval, которой скорее всего и выполняется пользовательский код. Но всё оказалось даже проще, движок RPG Maker XP предоставляет функцию RGSSEval, которая выполняет произвольный код переданный в аргументах с доступом к глобальным переменным игры.    Собственно на RGSSEval выйти оказалось очень просто. Я скачал RPG Maker XP, создал на карте Event и попросил при взаимодействии с ним вывести строку "Hello, 1234444567":   После запустил игру и попробовал найти данную строку. И она нашлась! Ставим бряк на access и активируем Event. И в памяти мы видим следующее:   Да, ребят, это оказался memcpy. Но, это не главное. Главное что мы видим смещения адресов как RGSS104E.regex_error_code_to_str+52018, а это значит в движке RGSS104E присутствуют публичные функции, которые он любезно предоставляет нам. И открыв Memory View - View - Enumerate DLL's and Symbols мы видим RGSSEval:   Осталось понять как её использовать. В целом на это довольно просто выйти, жмем два раза на функцию данном окне или просто прыгаем на неё и выполняем Memory View - Tools - Dissect Code. В появившемся окне жмем старт и видим всех, кто использует RGSSEval:   Двойным нажатием на один из (Call) под RGSSEval прыгаем на место использования и видим, что у данной функции один аргумент (один push с выполняемой строкой перед вызовом) и она не двигает за собой стек (add esp,8 - восемь из-за того, чтобы не двигать стек два раза):   Собственно, можем копировать эти call-ы в наш AutoAssembler и пробовать вызывать. Для тестирования я набросал следующий скрипт:   Запускаем и видим следующее:   Ура, функция работает как мы и ожидали. Проверить доступные глобальные переменные мы можем через print global_variables, либо обратившись к какой-нибудь из известных нам (или пока только мне..) переменных напрямую, например print $game_player. Можем творить!   Собственно весь код игры на Ruby можно увидеть в меню Tools - Script Editor в RPG Maker. И скорее всего код в вашем текущем проекте будет совпадать в большом количестве игр на данном движке. Поэтому можем попытаться написать обертки для стандартных функций для выполнения наших хитрых задач:   Для начала рекомендую пробовать написать обертку в своем проекте, а после внедрять её в Cheat Engine (еще лучше для начала прочитать краткий мануал по Ruby, но я так рвался закончить код что пропустил этот пункт). И сразу оговорюсь, обертки над классами будут работать только до того, как эти классы станут объектами. Поэтому наш будущий чит можно будет активировать лишь раз - до начала игры. Это поправимо, Ruby позволяет определять функции у инстансов на лету, но код становится менее лаконичным, поэтому я пошел по простому пути.   Собственно для того, чтобы ускорить нашего персонажа мы должны воздействовать на атрибут move_speed класса Game_Player. Он является приватным, поэтому для взаимодействия с ним лучше сделать его видимым для всех. Опять же нам повезло и у Game_Player есть метод update, в котором мы сможем проверять нажата ли клавиша Shift, но если бы его не было, пришлось бы менять move_speed из вне.   Приступим. Проще всего будет исправить Game_Player создав класс Game_Player унаследовав его от оригинала: class Game_Player < Game_Player Для изменения move_speed нам понадобится сохранять его оригинальное значение и назначать скорость бега, выделим для этого две переменные - walk_speed и run_speed. Ну и заодно сделаем move_speed публичным: attr_accessor :move_speed attr_accessor :walk_speed attr_accessor :run_speed Добавляем функции переключения скоростей и простую проверку на то, бежит ли персонаж: def start_run @move_speed = @run_speed end def start_walk @move_speed = @walk_speed end def running? return (@move_speed == @run_speed) end Осталось установить начальные значения переменным и добавить проверку на нажатый SHIFT. Для этого обернем функции initialize и update класса Game_Player с помощью функции alias: alias orig_initialize initialize def initialize orig_initialize @walk_speed = @move_speed @run_speed = 5 end Видите? Мы попросили обозначить родительский initialize как orig_initialize и вызывали его в нашей функции initialize. Скорость бега я установил на 5 (оригинальная скорость 4). Если увеличивать больше - персонаж просто летает и им неудобно управлять.   Тоже самое сделаем с update. На нажатый SHIFT проверить очень просто - движок предоставляет объект Input, который знает нажата требуемая клавиша или нет (её я нашел в оригинальных скриптах игры): def update if Input.press?(Input::SHIFT) if !running? start_run end else if running? start_walk end end orig_update end Собственно и всё - скрипт готов. Если вы добавите его в оригинальные скрипты проекта, при нажатии клавиши SHIFT персонаж будет идти быстрее.   Осталось просто заменить наш print "Hello, World" на получившийся скрипт. Выглядеть это будет следующим образом - каждую строку обрамляем в db 'xxxxx', где xxxx - строчка с кодом. В конце добавляем #13 #10 (каждое число через пробел) - это обычный Enter в конце строки (\n\r - если так привычнее). Я использовал для этого Sublime Text и его мультикурсоры, но можно воспользоваться простой заменой. Ну и не забываем 0 в конце, как конец текста. В итоге мы получим:   Теперь просто заменяем db 'print "Hello, world!"' на получившийся код и можем запускать в главном меню игры   Итоговый скрипт:   Итоговый скрипт на Ruby:   Видео работы скрипта:   Итого (или  рубрика "О проблемах"): Скрипт прекрасно работает если включать его в меню, до запуска игры. Но не получится загрузить уже существующие сохранения, так как оно выполняет через дампы и нашему коду там просто не откуда взяться  С этим можно бороться подключая код на-лету, но это уже в следующей серии. Так же скрипт ломает будущие сохранения - игра не сможет загрузиться, если чит не был включен. Увы, это частая проблема игр использующих моды, а мы фактически этим и занимались.   Вот и всё, народ )
  8.   Собственно это я и хотел предложить   Для затравки кину данный скрипт, ну и пока сам попробую накидать изменение move_speed скриптом:  
  9.   Не уверен, что подскажу про разные координаты, но с SHIFT сделать довольно просто. Сначала думал написать про хоткеи на скрипт, но они переключают скрипт каждые сколько-то миллисекунд.   В общем если ты сделаешь правильную фильтрацию, предлагаю тебе вынести значение скорости в отдельную "переменную" (в скрипт speedUp). После чего по таймеру проверять - нажат ли SHIFT:  
  10. Привет. Я думаю ты прав и эта инструкция работает с несколькими адресами. Возможно тебе поможет видео от Garik66, в котором он объясняет как можно написать фильтр для такой инструкции:   
  11. Всем привет. Сегодня я расскажу о том, как создавать нужный автомобиль с помощью CE в GTA Vice City. Как и говорил partoftheworlD, это очень просто, но раз возникают вопросы, я решил написать небольшой гайд.   Собственно, выйти на функции создания автомобилей очень просто - в игре есть читы, которые позволяют "вызывать" себе танк, катафалк и другие автомобили. Поэтому выйдя на функцию обработки чита - мы найдем функции для создания автомобиля. Приступим.   Для начала вспомним несколько читов для создания автомобилей. Я выбрал чит-код создания катафалка - THELASTRIDE , но так же можно использовать наш любимый чит создания танка - PANZER.   Собственно ввод кодов - это операция по сохранению текущего введенного символа в строку и последующая проверка получившейся строки на соответствие. Каждый введенный символ записывается как в стек, поэтому в реальности эти читы выглядят как REZNAP и EDIRTSALEHT.   Но если поискать данный текст, мы его не найдем. Как же так спросите вы? На самом деле функция обработки чит-кодов срабатывает на вводе последней буквы, поэтому проще всего просто искать часть введенного кода.   Выйдем в меню игры, введем чит-код THELASTRIDE и попробуем поискать подстроку TSALEHT (не забываем переворачивать чит-код) в игре:   Ура, мы нашли текст по адресу 00A0F94F. Не будем его запоминать, он нам не пригодится, а сразу посмотрим, что же творится в памяти. Нажмем на адрес правой кнопкой мыши и выбираем Browse this memory Region.   В памяти сразу поднимемся на пару строк вверх, обычно строки длиннее чем мы искали:   Ура, видим часть введенного нами кода. Так же могут присутствовать и другие куски текста, например на скришоте я немного побегал перед вводом чит-кода. Теперь мы видим, что в реальности строка ввода чит-кода больше чем мы ожидали, а её начало находится там, где присутсвуют первые символы DW DIRTSAL, т.е. по адресу 00A0F94A. Добавим этот адрес в табличку (размер строки вычислен эмпирическим путем - посчитал не нулевые байты):   Теперь если в игре мы побегаем или введем другие чит-коды, увидим как они укладываются в памяти.    Посмотрим же, что использует этот буфер - попросим CE найти всех, кто использует данный адрес при вводе чит-кода Сначала жмем ПКМ на адресе в главном окне CE и выбираем Find out what accesses this address:   Теперь переключимся в игру и введем любое слово, например HELLOGHL. Этим мы отсеим инструкции, которые используют наш адрес при обычном вводе. В окне появились следующие инструкции, мы будем их игнорировать:   Теперь введем чит-код на создание автомобиля - THELASTRIDE. Внимательно следим за окном с инструкциями, т.к. в процессе ввода у меня появились еще несколько инструкций, которые используют адрес, но не влияют на появление машины. После ввода последней буквы видим следующую картину:   Уже можно заметить несколько функций, выполняющихся один раз. Для того, чтобы отсеять лишние инструкции, попробуем ввести другой чит-код, не относящийся к созданию автомобилей, например LEAVEMEALONE:   Ура, из предыдущих инструкций у нас осталось одна - инструкция mov byte ptr [00A0F94A] по адресу 004AC84A. Давайте выделим её и нажмем Show disassembler, чтобы увидеть, где она выполняется:   Собственно мы видим некое условие, после которого в наш буфер записывает 0x20, он же 32 он же пробел и вызывается некая функция gta-vc.exe+AE7C0 с аргументом AC. Заочно можно нас поздравить, потому что мы нашли нужную нам функцию, осталось только убедиться в этом.   Попробуйте тем же способом найти чит-функцию для создания танка. Я её уже нашел, давайте посмотрим:   Видно, что функция находится немного в другом месте, но отличие состоит только в том, какой аргумент передается в функцию - push записывает в стек A2 , вместо AC. В остальном код условия идентичен и я предлагаю попробовать просто вызывать функцию gta-vc.exe+AE7C0 с разными параметрами.   Для вызова функции мы будем использовать AutoAssembe и функцию createthread. Зайдем в AutoAssembler (откроем Memory Viewer, меню Tools - AutoAssemble) и набросаем следующий скрипт:   Добавим его в таблицу через File - Assign to current cheat table и можно закрывать окно Auto assemble. Скрипт выделяет в памяти игры 64 байта для себя, после чего записывает туда инструкции, которые мы скопировали из оригинальной игры и просит createthread выполнить их.   Обратите внимание, что аргументы в данную функцию передаются как push AC. В оригинальной игре после call мы можем заметить инструкцию pop ecx. Это значит, что функция не трогает стек и мы сам должны двигать его за ним (т.е. откатить push AC). Поэтому после функции выполняется pop и мы обязательно должны его скопировать, иначе ret будет пытаться вернуть поток не куда-то по адресу 0xAA123456, а по адресу 0x000000AC. Почему pop использует ecx? В данном случае - потому что левая пятка компилятора так решила и это ни на что не влияет (ecx спокойно можно заменить на eax и другие регистры).   Ура, скрипт в нашей таблице, давайте же активируем его! Смотрим на результат и...:   Наш скрипт вызвал чит-функцию создания катафалка! Наверное вы уже догадались, что если мы заменим push AC на push A2 мы увидим заспаунившися танк?   Получается, что AC - это катафалк, а A2 - танк. Поискав GTA Vice City Vehicle IDs, мы найдем, что действительно, A2 = 162 - это Vehicle ID танка, а AC = 172 - катафалк. Попробуем указать свой ID, один из списка, например 168 (такси). Передача аргумента превратится в push #168:   Можно сказать, что наш скрипт работает! Осталось вынести ID модели как переменную:   Я удалил из скрипта функцию вызова потока, чтобы переместить её в отдельный скрипт:   Теперь можно добавить в таблицу адрес our_vehicle_id, в который после записи скрипта будет записано число 206 (ID наикрутейшего Sabre Turbo). Это число отвечает за то, что мы передаем в чит-функцию и меня его мы будем менять ID заспаунившегося автомобиля:   Результат:   И о проблемах   Скрипт фактически вызывает чит-код, поэтому мы начинаем слыть читерами, рейтинг в игре уменьшается и т.д. Это довольно легко обходится, т.к. если мы провалимся в функцию gta-vc.exe+AE7C0, перед самым ret есть две инструкции - add [gta-vc.exe+5B4F94],000003E8 и mov byte ptr [gta-vc.exe+60FB37],01 . Первая накидывает очки читерства (они хранятся отдельно) и устанавливает флаг - "этот парень использовал коды". Если их занопить - игра никогда не узнает о ваших проделках.   И вновь, потому что мы просто вызываем функцию чит-кода, она спаунит машины только на дорогу. Она находит ближайшую RoadPoint, прибавляет по оси Z несколько метров и спаунит авто. Поэтому создать авто прямо перед игроком так просто не получится.   Ну и основная проблема - это то, что в данной функции использует конструктор только для автомобилей. Он так же используется для вертолетов, но вот байки и лодки с ним заспаунить не получится (заспаунится, но крешится при посадке и выглядит, кхм...):   О том, как обойти эти проблемы и вызывать уже конструкторы классов мы узнаем в следующем уроке С видеоформатом гайдов мне сложно работать (довольно тяжело как смотреть, так и записывать их), поэтому уроки в текстовом формате.
  12. Train Me [v2.0] By Taiwan

    Всем привет. Я не особо опытный взломщик, поэтому пока взломал только новичковые пункты.   Ссылка на таблицу: https://yadi.sk/d/ystXS4wv3EbhfB   Код:   Видео:   С рандомными значениями не совсем понял, пока разбираюсь. Еще прошу дублировать задание текстом.
  13. Смотри, ты регистрируешь этот адрес как символ, после чего можешь узнать его адрес через функцию getAddress: Попробуй сделать так: function potokF(senderThread) autoAssemble([[ aobscan(address3,90 5F 01 00 50 C3 00 01 00 50 C3 00 00) registersymbol(address3) ]]) offset = 4 someAddress = getAddress('address3') + offset end function CEButton6Click(sender) writeInteger(someAddress, 50) end  
  14.   Адрес в памяти, даже если и выглядит как страшные "0x12345678" - по сути число. Если ты делаешь это через LUA то просто возьми и прибавь к нему смещение без кавычек: offset = 4 someAddress = mainAddress + offset Запись в память по этому адресу: writeInteger(someAddress, 666)  
  15. QLua(Lua) string.gsub

    Судя по всему вопрос в экранировании, вот так кажется работает: