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

Блоги

 

Обработка исключения в Cheat Engine Lua

pcall() функция может вызывать функцию, которая может вызывать исключение. Возвращает статус в виде булевой о том, есть ли исключение или нет и возвращает текст исключения.    Источник   Как этим пользоваться? Если вдруг знаем, что может произойти ошибка, то можно её обработать и выполнить правильное действие не останавливая работу Lua скрипта. Или например если  не выполняется условие, то можем сами создать ошибку с помощью функции error, что остановит скрипт.

MasterGH

MasterGH

 

Интересные программы

1. WebSite-Watcher позволяет отслеживать изменения на веб-страницах в том числе по по регулярным выражениям. Можно отслеживать изменения на сайтах Cheat Engine и других. Форум отслеживать смысла особого нет. Проще подписаться на обновление и почтовый клиент поставить. 2. Программы тестирования и автоматизации под разные ОС:     Sikuli — открытая кросс-платформенная визуальная среда создания сценариев-скриптов     AirTest IDE — почти как Sikuli и более того, китайские разработчики были вдохновлены Sikili и решили взять из него многое и использоваться  в QA тестировании.  3. Автоматический скрывать значков на рабочем столе AutoHideDesctopIcons 4. LightShot - быстро делаем скриншоты и заметки к ним. Можно еще использовать SnagIt, он еще и видео может снимать 5. f.lux — софтина регулирующее цветовую температуру компьютерного монитора 6. VerseQ — лучший на мой взгляд клавиатурный тренажер. Есть плагины тренировки на языки программирования 7. Scanner — показывает график в виде секторов о данных на жестком диске 8. ProcessExplorer, ProcessMonitor, WinScanner, API Monitor... все по системе 9. Возможно понравится XYplorer как замена или дополнение к файловому браузеру 10. NotePad ++ и sublime_text - на мой взгляд хорошие редакторы текста, может быть даже одни из лучших   Как-то раз нужно было поставить пробелы между китайскими иероглифами в гугл таблице (все для игры на Unity), чтобы в игре разрядить текст и он не был мелким. На notepad++ это выгладило так

MasterGH

MasterGH

 

Radare2 Скриптинг с python

Частенько в играх стали попадаться функции описывающие структуру какого-то класса, так вот в этих функциях есть смещения и описание, выглядит это обычно так.     Ужасно, не  правда ли? Так что сегодня пойдет речь о скриптах в radare2. Почему именно радар, а не ида, думаю ответ очевиден, он работает быстрее и позволяет анализировать только выбранные функции, а не весь файл. Итак, начнем писать скрипты, если вы  не знаете Python, то у radare2 есть поддержка многих языков для написания скриптов в этом можно убедиться посмотрев на табличку ниже. Но есть один модуль в python позволяющий сразу создавать таблицы для ReClass (https://github.com/70RMUND/ReClassMap)   pipe spawn async http tcp rap json plug lib buff C X X - X X X X X X X C++/Qt X X - - - - X - X - C# / F# X X X X - - - - X - D X - - - - - X - - - Erlang X X - - - - - - - - Go X X - - - - X - - - Haskell X X - X - - X - - - Java/Groovy - X - X - - - - X - Lisp - X - - - - X - - - NewLisp X X - X - - X - X - Nim - - - X - - X - X - NodeJS X X X X X - X X - X Ocaml - X - - - - X - - - Perl X X - X X - X - - - PHP - X - - - - - - - - Python X X X X X X X X X - Ruby X X - - - - X - - - Rust X X - - - - X - - - Swift X X X X - - X - X - Vala - X X - - - - - - - Clojure X X - - - - - - - - Более поддерживаемые языки NodeJS Python Swift C/Nim/Vala/C++   А теперь перейдем к написанию скрипта.       Вывод выглядит следующим образом [0xa4] ['"PartQuality"'] size 1 [0xa8] ['"PartLevelDelta"'] size 4 [0xac] ['"PartQualityDelta"'] size 4 [0xb0] ['"PartDestination"'] size 1 [0xb8] ['"RewardModelId"'] size 8 [0xc0] ['"CarChunkRequired"'] size 4 [0xc4] ['"CarChunkCount"'] size 4 [0xc8] ['"IsVehicleCompleted"'] size 1 [0xcc] ['"Score"'] size 4 [0xd0] ['"ActionPoints"'] size 4 Не идеально, но сойдет.

partoftheworlD

partoftheworlD

 

CE Lua. Ищем свойства userData.

UserData в Lua это пользовательский тип.  Точно не знаю, но я думаю  в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например,  проверим, что главная форма CE это userData тип local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это  особая  таблица свойств Lua-переменной (подробнее здесь) local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy()   Результат в виде списка свойство переменной mainForm   Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются. Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое   local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера mainFormCE.setColor(546484)
   

MasterGH

MasterGH

 

Cheat Engine 6.8 Beta 1. ShowSelectionList функция

Довольно интересная функция, мне понравилась.  showSelectionList() позволяет просмотреть список класса Strings и выбрать свойство через список.
  Как пример посмотрим список свойств главной формы и выберем любое свойство local mainForm = getMainForm() local listProperties = getPropertyList(mainForm) local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listProperties, allowCustomInput) print ('Index: '..id..", Name: "..name) --> Примеры выполнения: --> Index: 55, Name: ShowHint --> Index: 10, Name: Top После исполнения Lua скрипта вот такой диалог появится. Можно искать свойство через ввод текста     Список строк (Stringlist Class) используют: createStringlist(): Strings  - постой список getAutoAttachList(): Strings  - список имен процессов для автоподключения getPropertyList(class) : Strings - список свойств getCommonModuleList(): Strings  - список пропускаемых при сканировании модулей getProcesslist(Strings) - список процессов getWindowlist(Strings) - список окон getThreadlist(Strings) - список потоков Database.Params: Strings  - свойство  базы данных SQL ListItem.SubItems: Strings - свойство подстрок в визуальном компоненте списка ComboBox.Items: Strings - комбобокс Memo.Lines: Strings  - мемо компонент RadioGroup.Items: Strings  - компонент RadioGroup ListBox.Items: Strings - компонент ListBox FileDialog.Files: Strings  -  выбранные файлы в диалоге

MasterGH

MasterGH

 

Взлом крафта в StarsOne

В оригинале, если нет всех компонентов рецепта, то нельзя скрафтить вещь. Цель: скрафтить без компонетов по нажатию кнопки   Игра на Unity и можно пробовать использовать в dnSpy модифицировать файл Assembly-CSharp.dll Открываем файлик и смотрим на классы связанные с крафтом   Так находим кнопку, которая создаст указанное количество вещей крафта в CreateItem     Задача скрафтить по имеющемуся рецепту любую вещь. Для этого я добавляю проверку количества вещей  и удаляю лишний код. Под сполерами оригинальный и модифицированный код   Визуальное сравнение   Модифицированный код   Оригинальный   Изменяем весь класс или метов в этом окне   Если выводит ошибки при компяляции, то скачиваем IlSpy и его код вставляем в код в dnSpy. Или качаем DnSpy 3.2.0 или ранее   Изменения сохраняем в модуль, запускаем игру и крафтим.   Получить все рецепты (не проверял правда, попробуйте если хотите)   Вещи не ломаются. Убрать отнятие "здоровья" у вещи    

MasterGH

MasterGH

 

[C++ Reverse]И снова RTTI, но уже в деталях

Когда ещё начинал писать первую статью по использованию RTTI хотел приложить эту статью, которую когда-то увидел на black hat, но как обычно бывает потерял её с переездом на vivaldi, очень круто все расписано включая внутреннее устройство этих таблиц, что очень полезно для начинающего реверсера. bh-dc-07-Sabanal_Yason-WP.pdf   Ах, да, статья на английском.
 

Unity набирает обороты

В версии Unity 2018 довольно много интересного.   1. Это Unity Hub. Та штука, которая позволяет быть в курсе новых версий Unity.  2. PackageManager. Покажет пакаджи установленный в проекте. 3. Pro Builder. Довольно интересный инструмент, который позволяет моделить оркужение в Unity и творить простые локации, здания и создавать примитивы с наложением текстур... там очень много чего, я не не смотрел особо. Это альтернатива террейну. Фишка в том, что мы не являясь художниками (2д, 3д артистами), на Pro Buildere можем вполне сносное сделать окружение в нереалистичном стиле.  И не очень мультяшный и не похожий на реалистичный стиль. В таком стиле в теории можно сделать быстро игру. Встроить туда рекламы и инаппов, ну и если все будет ок, то будет приносить прибыль на маркетах. Важнее продвинуть аппу вверх, на вид, чем сделать её; 4. У Unity развиваются мощные системы сервисов. Есть поддержка иннпов, рекламы, аналитики, багрепорты (альфа версия), стеки крашей и исключений с характеристиками устройств пользователей. Не все баги там можно увидеть. Google Play консоль ловит больше багов, крашей и ANR (диалоги с "подождите ваша программа что-то долго делает или не отвечает, или будет закрыта"). 5. Запомнился 2d аниматор с ригом. Т.е. риг это склет обычно на 3д модель, а теперь риг можно делать на 2д модели. 6. Пока больше не помню, что такого интересно...    В 2017 версии появилась возможность скрипты связывать с отдельными dll сборками. В теории это позволит увеличить скорость компиляции. Например, у нас в проекте на младших версиях Unity на правку уходит 8 секунд компиляции на мощном компе,т.к. все скрипты в одной сборке dll. Пока не тестили эту фичу...

MasterGH

MasterGH

 

Не работает плагин сборки Firebase для AirTest IDE

Почти месяц ковыряюсь со сборкой апк, которая не запускается на инструментальном тестировании в Firebase   Рис.1 Сборка апк на инструментальное тестирование TestLab  от Firebase. Окно AirTest IDE   Две апк-шки создается. 1. В Unity, с иvпортом Poco SDK  2. В Плагине как на рисунке   Затем обе апк-шки отправляются на инструметальное тестирование в Firebase  Запускаю тест. Шесть секунд видео со стандартной заставкой и конец теста.   На данный момент тестирование проводим через GameLoop тест, а не через инструментальный тест от AirTest IDE. Продолжаю искать решение, пока не понятно. Также в AirTest IDE еще не закончили свою документацию и в Firebase ничего не сказано про этот инструмент. Однако, известно что этот замечательный инструмент тестирования будет участвовать в FireBase TestLab. В 2018 году китайские разработчики официально договорились с гуглом об участии их продукта в тестировании на удаленных устройствах сервиса TestLab

MasterGH

MasterGH

 

Lua поиск элемента до и после строки

Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше   В утилите, которую я делал "Lua Regular Expressions (v. 1.0)"   Текст во вкладке "gmatch"   Game1
gameCompany
DAU
53.21k
-20% Game2
gameCompany
DAU
20.35k
-20%   Поиск элемента после строки   "DAU "DAU%c%c(.-)%c%c""
 > 53.21k;20.35k;   Поиск элемента до строки Вот такой паттерн со двигом скобок для поиска прыдыдущеей фразы   "%c%c(.-)gameCompany%c%c"   не прокатит для вывода списка игр над фразой gameCompany
  
 > ;53.21k
 > -20%
 > 
 > Game2
 > ;   Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз.    Для просты сначала добавим первую пустую строку и видим повторяющиеся фрагменты   %c%cGame1%c%cgameCompany%c%c   пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо    > Game1;53.21k
 > -20%
 > 
 > Game2;   Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем   "%c%c(%w-)%c%cgameCompany%c%c"
 > Game1;Game2;
 
И тогда все ок.   Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда   "%c%c(%w-)%c%cgameCompany%c%c"
 > Game2;
 
 Не видит Game1.
 
 Значит мы можем  убрать %c%c,
 
 "(%w-)%c%cgameCompany
 > Game1;Game2;   Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет
 
My Game1: my Game
gameCompany
DAU
53.21k
-20% My Game2: my Game
gameCompany
DAU
20.35k
-20%   Пробуем (%w-)%c%cgameCompany > Game;Game;   Что не верно, т.к. захват одним (%w-)   Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие   ([%w%s]-)%c%cgameCompany
>  my Game; my Game;   Затем
([:%w%s]-)%c%cgameCompany
> My Game1: my Game;

> My Game2: my Game;   Затем
%c?%c?([:%w%s]-)%c%cgameCompany
> My Game1: my Game;
> My Game2: my Game;
  Вот и все. Если  попариться один раз, то тексты уже парсить будет гораздо быстрее.   Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк   p.s. Текст в консоли Lua отличается %c%c, а %с p.s.p.s. Можно разсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"

MasterGH

MasterGH

 

[Mouse-sensitivity Version 6.10.7 (April 28th 2018)] Premium account bypass открыт дискорд сервер

upd: приглашение на дискорд сервер https://discord.gg/JkFkpgD, пока большую часть делаю вручную, но уже ведется работа над ботом, который автоматизирует процесс использования премиума без участия человека.   Ну в общем ещё один обход уже для новой версии. Так что если кто в игры играет, то могу перевести чувствительность. На самом деле бесполезный сайт, для шутеров надо новую чувствительность подбирать от игры к игре.    

[STALKER Clear Sky] Выход на структуру хранящую все предметы на локации

Вот и настал тот час, когда я со всем разобрался, на сегодня у нас рассказ о том, как легко и просто выйти на массив инвентарей на локации. Для начала нужно понять, что мы собираемся искать, найти структуру предмета не всегда легко, где-то объекты статичные, а где-то их можно катать по всей карте и искать координаты, но признайте это долго и глупо. Так что воспользуемся моим любимым RTTI. Если у вас IDA 6.8 вам понадобится плагин ClassInformer, если IDA 7, то в нем уже встроен парсер RTTI для vc и gcc.   Заходим в View -> Open subview -> Names нажимает CTRL+F и ищем к примеру, CWeaponAK74     Нам нужен самый первый адрес виртуальной таблицы, почему именно он, все просто, IDA сортирует виртуальные таблицы по размеру и почти всегда самый первый адрес(а значит самая толстая виртуальная таблица) будет тем чем нужно. Теперь ищем этот адрес в памяти игры.     Великолепно, нашли 6 адресов, это у нас будут производные от нашего класса CWeaponAK74, а если по-простому, то вокруг нас есть 6 автоматов. Теперь нужно найти какие инструкции используют эти автоматы, переходим в CE и ставим бряк на доступ в памяти на понравившемся адресе, я взял 5613D030. После срабатывания получаем много инструкций, но нам нужна только первая. Если возникнет вопрос почему именно первая, то все из-за типа бряка, раз бряк на доступ значит первая инструкция будет показывать место откуда вообще берется структура.     Перейдем в дизассемблер и сразу бросается в глаза эта инструкция, выглядит как какой-то массив, перебирающий по индексу что-то, значит надо это проверить. Ставим трассировку на 2 инструкции и смотри что там по регистрам.     Все верно это массив с индексом. Посмотрим что внутри массива.     Хехей, так это же массив с указателями на все предметы на локации. Восстановил исследуемую функцию чтобы было понятно с чем мы работали и как это использовать.     И вывод парсера всех предметов на стартовой локации, база новичков или типа того.   0x108 Item_vecPos 0x118 Item_SpawnLocation

partoftheworlD

partoftheworlD

 

Python ошибка

Долго не могу решить проблему Traceback (most recent call last): File "C:\air test\plugins\firebase\build.py", line 124, in run self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 11-12: illegal multibyte sequence QObject::~QObject: Timers cannot be stopped from another thread Если кто шарит на питоне просьба помочь. Питон 2.7   Основная строка self.SIGNAL_INSERT_LOGVIEW.emit(_str.decode("GB2312").encode("utf-8")) При билде апк в firebase через плагин в AirTest (QA-тестирование на Unity)   Среда разработки от уважаемых китайских разработчиков Я думаю в связи с этим ошибки с кодировкой GB2312. Гуглил, искал... пока безтолку     Исходники Билд

MasterGH

MasterGH

 

[Разное] Поиск функции создающий объекты

Буквально вчера испытал в действии экспериментальный метод нахождения функции, которая создает игровые объекты (npc, оружие, транспорт).  Слава многопоточности. Суть метода в том, чтобы разрушать все вокруг и замораживать потоки, на примере Watch Dogs или Prototype это работает прекрасно, находим поток, морозим, если после заморозки и убийств нпц они не появляются, то это наш клиент, дальше смотрим откуда он создается и останется немного по отлаживать и по реверсить, чтобы восстановить прототип функции и аргументы при создании определенных предметов. Это все конечно хорошо и просто, но как всегда существует проблема, этот метод не будет работать с 40% существующих движков (пока что, есть пару идей как запустить создание предметов без обработчика) из-за того, что используются скриптовые движки, которые создает объекты за счет скриптов, т.е. получается, если мы будем использовать такой метод поиска он сможет вывести только к обработчику скриптов. Так же этот метод бесполезен в играх по локациям в которых объекты создаются при загрузке карты, а не постоянно как в играх с открытым миром.
   

partoftheworlD

partoftheworlD

 

SwampCTF 2018

Понравился первый CTF в 2018 году для меня, организаторы постарались и сделали соревнование атмосферным, истории, загадки, ухх. И вот решил поделится заданиями по реверсу, вдруг кто-то ещё любит реверсить или просто не знает, чем занять себя. Задания разной сложности, но 2-3 вечера убить можно. В общем, наслаждайтесь.    Ссылка

partoftheworlD

partoftheworlD

 

[Cheat Engine Lua] Тестирование производительности2

Уже была запись про тестирование производительности. В этом примере тестируем разное обращение к функции со средним арифметическим значением     Результаты при 4-х запусках avg = 0.93333998758048 avg = 1.0322099291325 avg = 0.92657961891689 avg = 1.1883763135947   Вывод. Разница не существенная.

MasterGH

MasterGH

 

Отладка Lua скриптов и stacktrace функций

Пример, который показывает как снять стек вызовов функций function A0() -- Здесь можно удалить ":gsub('\n','\r\n')", но тогда в консоли текст будет в одну строку print(debug.traceback():gsub('\n','\r\n')) end function A1() A0() end function A2() A1() end function A3() for i=1,3 do A2() end end A3()   Можно поставить пошаговую отладку в консоли Lua (как на скриншоте) и  пройти по шагам

MasterGH

MasterGH

 

Чтение адресов и записи в адреса

Я обратил внимание на следующие поведения записи и чтения 1. Срабатывают только инструкции чтения до изменения параметра, адрес рабочий С адресом работают инструкции на чтение, но если в друг в этом адресе что-то поменять (например в CE), тот тут же выскочат инструкции на запись. Нельзя однозначно утверждать, что адрес является настроечным параметром, но и нельзя утверждать, что это не рабочий адрес. Какая-то инструкция может жестко менять значение, а может быть будет "стараться" изменить значение адреса в меньшую или большую сторону, но адрес при этом будет рабочим. 2. Срабатывают инструкции записи и чтения, адрес не рабочий Запись и чтение влияет только на часть игры, а не на все или вообще не влияет, а перезаписывается постоянно. Например, на визуальное отображение полоски со здоровьем. Получается, что адрес не рабочий, а у него есть как и в первом пункте инструкции и на запись, и на чтение. 3. Один раз срабатывает инструкция записи и потом всегда на чтение Если попался такой адрес в структуре, то он точно является "настроечным" и рабочим адресом. Например, это какой-то коэффициент, который добавляет, умножает, отнимает... в общем что-то меняет. Что с ним не делай, это адрес будут только "читать". Также это может быть булевой параметр "1 "или "0" и по нему может что-то резко меняться в игре.   Окей. Вспоминается окно с кучей инструкций и счетчиков уникальных адресов (не более 8-ми логируется) Постреляв патроны  с адресом патронов (в СТАКЛЕРЕ Зов Припяти) сработали инструкции как на запись, так и на чтение.   Первая инструкция читает очень часто, вторая редко. В круглых скобках обозначаются количество проскакивающих адресов. Если был выстрел и значение поменялось, то вылезли инструкции записи (все после первых двух).   Код читает в цикле адрес...и если, что поменялось, то запишет в него потом. Это похоже на пункт1, который обсуждали выше, но этот адрес патронов не тот, который нужен. С виду рабочий, но патроны потом не стреляют. Патроны это структуры в памяти, а адрес их как  счетчик структур   Как можно делать   Создаем две группы (скрин ниже). Первая текущая и не замороженная. Вторая с двумя замороженными состояниями, когда стоим и ничего не делаем. Делаем несколько выстрелов. Цвет по +AC нас интересует больше всего, он соответствует логике состояний (стреляю и (не стреляю и не стреляю))   Выделяем и перемещаем адреса этого цвета и морозим в таблице.   Первый праметр это прочность, второй не знаю. Третий счетик патронов. 3 и 5 адреса связанные, если правильно помню, с объектами патронов В Сталкере это не даст беск. патрнов, но в других играх может иметь смысл как прием сравнения структур и групп.   p.s. По Сталкеру Зов Припяти, к сожалению, у меня не было времени взломать патроны или может быть я не умею, не знаю. Какие-то патроны в сталкерах ломал, но не помню как.

MasterGH

MasterGH

 

[Cheat Engine] Dissect Data Scaner 1.0.1 beta

Немного комментариев к этой версии.   1. Исправлены смещения 2. Добавлены также инструкции на запись   На скриноте ниже пример сравнения текущей структуры с координатами в СТАЛКЕРЕ Зов Припяти с копией структуры.  

MasterGH

MasterGH

 

Новости по будущему плагину

Проведено огромное количество опытов над структурами. Много переделок. Очень кратко напишу, что поменялось.   1. Название структуры состоит из адреса, количества адресов в ней и  времени в миллисекундах на один байт в структуре. Подчеркнуто красным   2. Смещения отбираются только те, на которых за X времени не было обнаружено ни одной инструкции на запись. Чем больше та самая чувствительность,  тем точнее результат 3. В именах структур теперь ценная информация. Это смещение, регистр и тип   На скриншоте ниже можно посмотреть пункты 2 и 3. Также на этом скриншоте я заморозил по соседству адрес (поставил Lock) и пару раз пострелял в игре Сталкере Зов Припяти     Выводы, которые я сделал за очень и очень скромное время пользования. За минут 15 и на паре структур оружия в двух разных играх L4D2 и Сталкер Зов Припяти 1. Если править 4-х байтовые значения, то легко можно нарваться на вылет игры. Но подключившись снова, можно продолжить. 2. Правки значений с типом в 1 байт могут заблокировать оружие (в двух играх) или же устроить скорострельность на полную катушку в L4D2. 3. Правки значений с типом float. Можно легко нарваться на вылет в игре, если например поставить нолик. Деление на ноль или какая-то иная причина. Лучше ставить чуть больше нуля, можно положительные или отрицательные значения 4. Частенько бывают адреса в структуре, на которых включаются инструкции записи только после изменения значения. Тут я пока ничего не смог сделать, просто удалить их из структуры как лишние. 5. Для сканера используется 1 аппаратный брейкпоинт, остальные три штуки еще не используются, т.к. сложно их прикрутить. Если использовать все 4 аппаратных бряка, то скорость сканера была бы в 4 раза быстрее. Сейчас на 2К байт по 10 мс, у меня уходит где-то 150 секунд. Если я ставил 20мс, то находилось на 10 смещений больше или какие-то другие смещения пропадали.   Код будущего плагина все еще находится на стадии тестирования. Поэтому пока плагин не выкладываю.   upd1:  инструкции cmp, add, sub, xor, and, not, test, mulss, fsub, fmul, dec, inc, mul; теперь выводятся в имя элемента структуры. На скриншоте случайно вышел на координаты UI таймера. Сделал три скана трех структур в новых окнах     upd2: перемещение структуры   Итог перемещения двух структур в первую    

MasterGH

MasterGH

 

Анализ Dissect Data Structure 2

Охота на структуры и удивительное путешествие в мир структур в L4D2   1. Игру L4D2 в оконный режим 2. Установка плагина (позже) 3. Установка VEH отладчика, иначе вылеты 4. Первая миссия. Ищем адрес патронов. Бряк на адрес. Нашли инструкцию Красным показано, что я не всю структуру проанализирую позже. Долго было ждать. Структура больше 5К байт...   5. Делаем сигнатуру любой инструкции при работе  с патронами на всякий случай, если игра вылетит. server.dll,83 BE 14 14 00 00 00 7F 4D 6. Переходим в код и ищем проскакивающие адреса на инструкции. Там один адрес нашего  пистолета. Клик на него и переносим адрес начала будущей структуры в окно Dissect Window.  Можно не создавать структуру (отказываемся). Кликаем "Scanner" (он будет на всех окнах dissrct data)     7. Далее побежало сканирование.   В игре можно что-то делать, можно ничего не делать. Долго ждать..   Меняю опции. Чувствительность как была так и осталась минимальная (это время ожидания прерывания на адресе умноженное на коэфициент чувсвительности и на 100 мс).  Размер структуры меняю, до 1100   Наконец ~30 секунд дождался без вылетов (иногда бывают,  возможно из-за VEH). Появился результат   Самые интересны это байтовые и float значения. и инструкции чтения. Их определит можно пока только по логам...   Меняю первый байт на 1 и пистолет стал очень быстро стрелять.   Ради чего это все и делалось, чтобы похожие адреса искать...   Если сравнить дефолтную расструктуризацию, она слева     Логи (для меня и для желающих) по определению типа по опкодам   Плагин выложу позже. Надо еще доработать и потестить.   Вот к примеру float распознал как Pointer и там где fst тоже по +42C тоже фигня. Это ошибки. Это быстро поправить, но могут быть еще ошибки.   Не менее интересны еще вложенные структурки, которые удается раскрыть (не все). Вот одна из них и усеяна параметрами, которые можно покрутить   Вложенные структуры пока отдельно можно создавать в окнах, чистить сканером, потом подставлять их в основную структуру по имени. В общем пока рано об этом писать.   Больше всего меня волнует польза, т.е. что можно с этим сделать. Пока только сразу вышел на скорострельность. Еще шесть параметров покрутил байтовых, ничего не дало. Надо еще попробовать выводить только смещения, которые работают на инструкцияъ чтения, а не "чтении и записи". Запись скорее всего не нужна. Значения просто активно перезаписываются  в структуре. А вот оставлять смещения,  с которыми работает только "чтение" скорее всего даст куда больше вероятности найти параметр настройки.

MasterGH

MasterGH

×

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

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