Перейти к содержанию
  • записи
    83
  • комментария
    74
  • просмотров
    5316

О блоге

 

 

Записи в этом блоге

 

Экономия времени при реверсе за счет вычислений энтропии

В зависимости от энтропии, мы можем с ходу определить какие утилиты нам понадобятся, для примера возьмем игровую дллку. Возьмем файл из каталога и проверим энтропию:
      Обычно энтропия выше 2-3 указывает на то, что файл накрыт чем-то и не подходит для статического анализа, из-за того, что будет попадаться мусор, куски нерабочего кода и отсутствие перекрестных ссылок, проделаем тоже самое, но уже с дампом этой же дллки.

    Как видите, энтропия стала меньше, а линия стала более ровной, это означает, что файл готов к использованию и во время реверса не возникнет никаких проблем.

partoftheworlD

partoftheworlD

 

Radare2 Эмуляция кода

Глава 0. Пролог   В общем в прошлой статье слетели картинки, да и статья не особо понравилась, вот её переписанная и обновленная версия. Место действия – терминал, в главных ролях – radare2, отлаживаемая программа.   Глава 1. Настройка окружения ESIL e asm.emu=true - Run ESIL emulation analysis on disasm e io.cache=true Глава 2. Настройка эмулятора Тут достаточно простой список команд: aei – инициализирует состояние виртуальной машины aeim – инициализирует стек aeip – устанавливает EIP по текущему положению в коде после всех этих команд в регистрах выставились адреса ebp, esp, eip.   Остальные регистры устанавливаем с помощью команды aer, значения обычно берутся из отладчика, но можно выставить любые. aer eax = 00000004;aer ebx = 0x17426e8;aer edx = 00000004;aer edi = 0x05e4830;aer tf  = 1;aer if  = 1;   Для пошагового выполнения кода используем aes, я обычно использую такую связку, чтобы получать необходимый минимум информации: pd -1 @ eip; aer=; aes но если кому так не удобно, есть возможность использовать визуальную отладку используя команду V!   Глава 3. Тест   Попробуем отладить код из дампа и посмотреть, что там вообще происходит.     Глава 4. Эпилог   Как видите, все достаточно просто, плюс поддерживается для эмуляции туева хуча архитектур. Так же это быстрее, чем поднять qemu или использовать реальное железо, плюс поддержка скриптов радара делает из эмуляции достаточно мощный инструмент для статической отладки и анализа кода.  

partoftheworlD

partoftheworlD

 

Немного о том, почему я люблю radare2

Покажу на примере кода по расшифровке строк, ничего особенного, просто xor шифрование, вроде бы все и понятно, но так не хочется вручную восстанавливать. А декомпилятор в x64dbg ужасен.
  И что же в таком случае делать? Воспользоваться radare2. Просто выделяем функцию, записываем её в файл и отрываем этот файл в r2.
Теперь определяемся что нам нужно из этого кода? Например, регистр cl. Пишем такую команду: pdc~cl Читается как:  pdc - pseudo disassembler output in C-like syntax ~ - grep cl   Хоба, и видим алгоритм расшифровки: [0x00aa93b0]> pdc~cl cl = bl cl ^= dl byte [rdi + rax + 1] = cl cl = bl cl ^= byte [rsi + 0x12c66dc] byte [rsp + rax + 0x1d] = cl cl = bl cl ^= byte [rsi + 0x12c66e0] byte [rax + rbp + 3] = cl cl = bl cl ^= dl byte [rsp + rax + 0x1f] = cl     Это не совсем декомпилятор, просто вывод дизассемблерного кода в удобно читаемом виде.  Код целиком.    

partoftheworlD

partoftheworlD

 

Приключение Wireshark в мире USB

Решил тут сделать кастомные пресеты для подсветки, но в софте производителя такой возможности не было, были стандартные, ограниченные. Как же я не люблю ограничения, ну что ж...приступим к исследованию.   Для начала необходимо понять как софт общается с клавиатурой, для этого запускаем Wireshark. При изменении яркости, происходит отправка пакета по USB.     Отлично, это уже что-то. Выполним еще пару действий, чтобы сделать шаблон для данных. //Стандартные настройки : 11 ff 0c 3a 00 01 ff 00 00 02 00 00 00 00 00 00 00 00 00 00 //Изменение яркости : 11 ff 0c 3a 00 01 f5 00 00 02 00 00 00 00 00 00 00 00 00 00 //Включение пресета : 11 ff 0c 3a 00 02 ff 00 00 10 40 00 64 00 00 00 00 00 00 00 //Изменение скорости пресета: 11 ff 0c 3a 00 02 ff 00 00 05 c7 00 64 00 00 00 00 00 00 00 Открываем 010 Editor и делаем шаблон.     Шаблон:   Шаблон можно будет использовать для программирования клавиатуры. Для программирования будем обращаться по имени HID устройства, чтобы с помощью CreateFile получить хендл и общаться с клавиатурой. Не самый лучший способ, но быстрый, хотя я бы выбрал хуки. Все есть файл. (ну почти) Посмотрим под отладчиком, что говорит софт логитека клавиатуре. Ставим бряк на WriteFile и бдыщ.     Дальше остается использовать CreateFile, Read/WriteFile, чтобы сделать основу для собственных пресетов. Один из плюсов всего этого, это уменьшение размера программы с 200 мб до 10кб.   Как раз вот-вот уже выходные, в планах привязать изменение подсветки клавиатуры в зависимости от готовности кофе в кофеварке. А до следующей статьи, можно будет разобрать как расширить функционал встроенных скриптов в клавиатуре и можно ли, туда прописать что-то действительно полезное, и что может пойти не так. И разобрать, за что отвечают последние 4 байта.

partoftheworlD

partoftheworlD

 

DDG яндекс фикс

В любой блокировщик рекламы как кастомный фильтр. Удаляет мусор от яндекса в уточке. duckduckgo.com##.result.results_links_deep.highlight_d:-abp-contains(/(data-domain\=)|(.*yandex.*|.*ya\.ru)/)  

partoftheworlD

partoftheworlD

 

[Burp Suite] Написание кейгена для твика iOS

Похожая статья уже была, но тут "новый" инструмент и не просто подмена рандомного значения. Что ж, для начала надо запихнуть исполняемый файл под дизассемблер, ищем что-нибудь связанное с лицензией, реверсим.     Привели к читаемому виду, а теперь разбираемся что же тут происходит.   Часть 1, проверка, чтобы имя пользователя было не длиннее, чем 20 символов. IVar1 = __picsymbolstub4::_objc_retain(param_3,param_2,(_NSZone *)param_3); lenth = __picsymbolstub4::_objc_msgSend(IVar1,"length"); if (lenth < 20) { bResult._0_1_ = 0; } Часть 2. Считываем введенное имя пользователя с 12 по 16 символ. uname = __picsymbolstub4::_objc_msgSend(inpurt_username,"substringWithRange:",12,16); user_name = __picsymbolstub4::AutoreleasedReturnValue(uname); Часть 3. Получение серийного номера устройства. SerialNumber = __picsymbolstub4::_objc_msgSend(&ATTweakClient,"getSerialNumber"); serial_number = __picsymbolstub4::AutoreleasedReturnValue(SerialNumber); Часть 4. Составление строки из соли, серийного номера и имени пользователя. _complite_string = __picsymbolstub4::_objc_msgSend (&_OBJC_CLASS_$_NSString,"stringWithFormat:",&cf_%@%@%@, & cf_kyf6jFJYT8aawe[we]D+F-s4JYI3jsaDp69jsdq123sDdflkDuF3sgvlkd3asfKLFDGhjalsddgasd ,serial_number,user_name); complite_string = __picsymbolstub4::AutoreleasedReturnValue(_complite_string); Часть 5. Хеширование полученной строки. hash = __picsymbolstub4::_objc_msgSend(&Utils,"sha1:",complite_string); IVar1 = __picsymbolstub4::AutoreleasedReturnValue(hash); Часть 6. Узнаем, что приходит от сервера. (Формат ключа)   Начинаем писать кейген. #Импортируем модуль для работы с хеш-функциями from hashlib import sha1 #Задаем серийный номер аппарата serial = b"QTW6NR7XXP7M" #Задаем имя пользователя == 16 знакам name = b"partoftheworlD16" #Задаем соль salt = b"kyf6jFJYT8aawe[we]D+F-s4JYI3jsaDp69jsdq123sDdflkDuF3sgvlkd3asfKLFDGhjalsddgasd" def generate_license_file(): #Хешируем и переводим хеш в hex license_hash = sha1(salt + serial + name).hexdigest() #Формируем ключ key = license_hash[:12]+name.decode("utf-8")+license_hash[12:] #Формируем лицензионный файл print("{\"validated\":true,\"key\":\""+key+"\",\"create_time\":\"00:00:00 Apr 10, 2019 MSK\"}") generate_license_file() На выходе получаем. {"validated":true,"key":"2ebb4e00950epartoftheworlD16cff6343256a724d56eb6506173ec","create_time":"00:00:00 Apr 10, 2019 MSK"}   Теперь необходимо этот ключ как-то скормить программе. 1. Способ, поместить ключ прямо в папку с программой 2. Скормить, через ответ с сервера.   Я выбрал второй, просто потому, что мне лень по папкам лазить, чтобы создать файл. Пусть за меня это делает программа, я что её зря взламывал? Заходим в Burp Suite, вкладка Proxy, Options.     Переходим в программу и запрашиваем лицензию.     Ах да, я забыл снова включить прокси. Все, после запроса, срабатывает подмена ответа с сервера и в Burp Suite видим.     А на экране телефона, успешно загруженную лицензию.  
   

partoftheworlD

partoftheworlD

 

Fiddler vs Burp Suite

Ну что ж, случайно на последнем CTF узнал, что Burp умеет сертификаты генерировать для прослушки HTTPS. Раньше я писал скрип для подмены запроса для mouse sensitivity в Fiddler, а тут оказалось, ничего писать не надо, составил регулярку для поиска и написал в окошечко на что заменить. Да и инструмент более гибкий, имеющий кучу плюшек.     Это же прелесть. А баг так и не по фиксили.      

partoftheworlD

partoftheworlD

 

Игровой фаззер

В общем начал разрабатывать игровой фазер, предназначенный для восстановления классов и смещений для не виртуальных функций. На данный момент я представляю это как отдельный проект, возможно написанный с нуля, но думаю использовать готовые дизассемблерные библиотеки, чтобы сэкономить время, который будет представлять из себя универсальный дампер SDK для любых игр. Хотя использовать x64dbg для подобного будет очень даже уместно т.к. функциональное ядро будет готово.   На первом этапе вешаем бряк на инструкцию. Получаем стек вызовов и восстанавливаем путь от 1-й функции вызванной клиентом до последней в которой находимся мы. На втором этапе будет создаваться каркас из классов, функций и ответвлений, я думаю воспользоваться перекрестными ссылками. На третьем этапе начнется интерпретация и парсинг инструкций основного древа без ответвлений кода, чтобы восстановить используемые в коде смещения и типы данных, отслеживая поведение инструкций. На четвертом этапе будет проводиться тоже самое, но только для ответвлений имея на руках уже найденные адреса и значения, я думаю это эффективней работы с ответвлениями начиная с нуля. На пятом этапе представлять в графическом виде все древо. На шестом генерировать таблицу рекласса.   Красным веделен четвертый этап, черным третий.   Основная проблема в том, что мы не знаем точный размер структур. И пока я не представляю, как можно получить размер динамически выделяемой памяти. Как вариант, пятым этапом вешать бряки на функции освобождающие память, фильтруя по всем найденным начальным адресам структур и после убивать процесс, чтобы перехватить размер. А после обрезать структуры по размеру, но концепция "ищи, чтобы удалить" мне не очень нравится.   Плюсы данного проекта в том, что ничего не надо делать самому(пфф, что-то там руками искать в 2019), а так же можно прилепить на один из этапов "рекурсивное" восстановление, т.е начинаешь с инструкции патрон и чем больше смещений восстановится, тем к большему числу классов получаешь доступ для восстановления и так будет продолжаться, пока файл не восстановится полностью. (нет это не нейронная сеть, хотя кто знает)

partoftheworlD

partoftheworlD

 

REDasm очередной игрок в мире интерактивных дизассемблеров

Выглядит достаточно ида-подобно, кроссплатформенный инструмент использующий Qt5 и конечно же опенсорсный.       Можно оставить в закладках и следить за развитием.  2019 можно назвать годом интерактивных дизассемблеров и декомпиляторов, много новых игроков появляется, даже немного удивительно.   https://redasm.io

partoftheworlD

partoftheworlD

 

реверсдоки

Intel 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B, 2C & 2D): Instruction Set Reference, A-Z, Sep 2016 (325383-060US)  https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Rev 3.26 May 2018 (24594)  https://www.amd.com/system/files/TechDocs/24594.pdf AMD64 Architecture Programmer's Manual Volume 4: 128-Bit and 256-Bit Media Instructions, Rev 3.23 Feb 2019 (26568)  https://www.amd.com/system/files/TechDocs/26568.pdf AMD64 Architecture Programmer's Manual Volume 5: 64-Bit Media and x87 Floating-Point Instructions, Rev 3.15 May 2018 (26569)  https://www.amd.com/system/files/TechDocs/26569_APM_v5.pdf AMD64 Technology 128-Bit SSE5 Instruction Set, Rev 3.01 August 2007 (43479)  http://www.cs.northwestern.edu/~pdinda/icsclass/doc/AMD_ARCH_MANUALS/AMD64_128_Bit_SSE5_Instrs.pdf

partoftheworlD

partoftheworlD

 

[Just Cause 2] Увеличение длинны крюка

Когда-то давно я хотел сломать длину крюка, ну так вот, как и предполагал это оказалось статичное значение получаемое из файла конфигураций по значению: 0x72104687(возможно, это ID параметра в таблице со значениями), найти это с помощью поиска я не смог т.к. нет значений от которых можно было бы оттолкнуться. И нам на помощь приходит реверс.   Вот так выглядит код.   Тут все достаточно просто, функция по ID параметра загружает значение из файла и записывает в структуру крюка-кошки, вместе со всеми остальными параметрами.     Параметров очень много, начиная от начальной скорости и ускорения, заканчивая силой захвата людей. И как это обычно бывает, во время тестов возникла проблема. Крюк-кошка в игре считается за патрон, а пули для оптимизации очищаются, когда достигают пика своего существования.
Поэтому даже если найдем длину крюка-кошки и изменим её, то ничего не получится, просто потому, что время жизни крюка всего ничего. Значит, придется найти инвентарь, в инвентаре указатель на оружие, а в структуре оружия найти характеристики, и только тогда крюк кошка заработает.        

partoftheworlD

partoftheworlD

 

История исследования прошивки роутера

Данный материал приведен в ознакомительных целях и если вы будете ломать соседей, я тут вообще ни причем как и форум. А так же статья носит популистский характер, призывающий вас не останавливаться только на взломе игр и постоянно совершенствовать свои навыки в различных областях компьютерных наук.

Сегодня мы поговорим о серьезных вещах, а именно безопасности, которую предлагают нам провайдеры, предлагая купить/взять в аренду их роутер. Проблема носит масштабный характер, и это серьезная проблема в нашем регионе, мой провайдер предлагает подобный роутер и люди не разбирающиеся в этом, покупают уязвимые устройства, у которых по дефолту(в 70% случаев) включен удаленный доступ, достаточно установить на телефон nmap + telnet и сеть пала. Только в своем дворе я нашел около 70 потенциально уязвимых устройств этой же модели в радиусе 30 метров. И это не нормально.   Начнем с того, что этот роутер (ZXDSL931WII) у меня давно лежит под скальпелем, и давно хотелось поковырять какую-нибудь прошивку для железки. Ну что ж, возьмем прошивку с диска, проверим энтропию, чтобы быть уверенными, что прошивка ни чем не упакована. Это можно сделать с помощью утилиты binwalk, ей же будет и распаковывать все файлы прошивки. После распаковки, надо понять вектор атаки, например, проверка подлинности/авторизация и что-то в этом роде.      Лучшим инструментом для поиска экспортируемых функций под Windows будет Total commander.
  *.so файлы представляют из себя подобие dll в Windows. 
В нашем случае libcms_cli.so   Как видите на картинке ниже, никакой защиты памяти нет.   Теперь переходим к реверсу.     cmsCli_authenticate является функцией, которая считывает логин с паролем при подключении к роутеру через telnet(точно, остальные виды подключения не проверял). Приведем код к читаемому виду.
    Я думаю, что опытные программисты уже заметили в чем тут дело. Но, если кто не понял, то вот, тот участок из-за которого возможны проблемы(а они будут). // Считывание введенного пароля password = getpass("Password: "); if (password != (char *)0x0) { cmsUtl_strcpy(password_buffer,password); password_len = cmsUtl_strlen(password); memset(password,0,password_len); }   Т.к. отладчик не поднять, методом "тыка" было выяснено, что пароль может быть больше 256 байт(!!!). А проблема возникает из-за метода getpass, который,возвращает пароль в функцию, которую нельзя называть, это одна из запрещенных функций,  использование запрещенных функций, тоже самое, что купить билет в один конец до Азкабана из-за того, что strcpy не проверяет размер аргументов и это может вызывать переполнение. Чем мы сейчас и воспользуемся. addiu sp,sp,-0x238 //выделение памяти под кадр стека password_buffer = -0x110 //позиция буфера пароля ra = 0x0 //return address залогинились = 0x12c20 //участок кода, который сообщает роутеру об успешном выполнении проверки   Это все что нам надо знать для написания эксплоита, его будем лепить с помощью pwntools. Достаточно лишь заполнить 276 байт мусором, а после прописать 0x12c20 как адрес возврата.   Ну что, давайте украдем сладкий рулет!!!
  Пароль неверный, а доступ получили. Такие дела.       Как видим, права у стека полные.   7f97b000-7f990000 rwxp 7f97b000 00:00 0 [stack]     Функционал прошивки ограничен
, но когда это кого-то останавливало? Можно придумать костыли всегда. Например, использовать dumpmem в цикле, чтобы задампить всю память в которой, находится интересная информация, например, логин и пароль от учетки для подключения к интернету, пароль от вайфая и т.д. (На самом деле, получив доступ к роутеру, можно просто вызывать команду, которая покажет всю информацию о роутере, настройках в том числе и паролях.
  Или создать скрытую точку доступа, установив на него свой пароль и пользоваться чужим интернетом, устроить dhcp спуфинг.(Это все конечно теоретически, на тестовых машинах, только ради исследовательского интереса, ничего противозаконного, лол)   А теперь о том как защититься: В идеале обновить прошивку и следить за тем, что обновление исправляет. В реалиях придется просто отключить удаленный доступ к сервисам, которыми вы не пользуетесь, а ещё лучше и локальные, если вы неуверенны в людях, который присоединяются к вашему вайфаю.

partoftheworlD

partoftheworlD

 

[GHIDRA] Спустя 2 недели использования

Ну что ж, вот и прошло 2 недели с момента выхода GHIDRA и хотите верьте, хотите нет, но за все это время у меня не возникло желания вернуться в IDA (даже открыть). Т.е. весь функционал, который дает гидра из коробки в IDA реализован только в плагинах.   Производительность. После релиза я писал статью, где рассказывал о «баге» с производительностью, как мне потом объяснили, что такое возможно на свежеустановленной Java, т.е. после запуска какие-то данные кешируются на жесткий, чтобы при последующих запусках не выдирать их из файлов GHIDRA, так что сейчас с этим все отлично. Ах, да гибкие настройки автоанализа, которые позволяют выбрать что именно нужно анализировать, уменьшить количество потоков, анализирующих файл, чтобы уменьшить нагрузку на систему.   Декомпиляция. С этим что у Hex-Rays, что у GHIDRA все на одном уровне. Где-то вывод хуже в GHIDRA, где-то в IDA. Но для себя я выбрал декомпилятор гидры просто потому, что у меня на руках есть все правила декомпилятора и если, вдруг, что-то где-то выводится неправильно, то я могу поправить это за 5 минут, а не ждать год в лучшем случае, пока китайцы сольют новую версию IDA, где возможно, поправят этот баг. Временами вывод декомпилятора GHIDRA странный, если сравнивать с IDA, но если вдуматься, то он более логичный.   Документация. Еще гидра идет с подробнейшей документаций как по работе с GHIDRA, так и по работе с API. В менеджере скриптов, так же идут различные примеры работы с кодом. И переписывая плагин для ассоциации функций строками, наслаждался эти процессом, из-за того, что в документации написано «чтобы использовать эту апи, вот эту штуку засунь сюда и получишь вот это, с которой можно работать вот так»   Плагины. К моему глубочайшему удивлению за 2 недели комьюнити наделало огромное количество плагинов. Хочешь деобфускатор кода — пожалуйста, хочешь загрузчик switch, wasm, ps4, sega — без проблем, есть какая-то специфичная прошивка для специфичной железяки — читай документацию и без проблем сделаешь для него загрузчик и даже декомпилятор.    И в заключении, сегодня я удалил IDA из-за ненадобности. Да, она была хороша и удобна, когда не было альтернатив, но сейчас у IDA нет какой-то особенной фитчи, которая бы серьезно повлияла на выбор в её пользу.   

partoftheworlD

partoftheworlD

 

[Ghidra] Function String Associate релиз.

Переписал скрипт на гидролад.(я теперь знаю Java через Python 😄)
 Делает все тоже самое, рекурсивный поиск строк в функции и создание комментов.   Установка: Скачиваем файл из  репозитория Добавляем его в менеджер скриптов Ищем среди всех скриптов Запускаем     Надо будет еще по колдовать над форматированием строк, а так вроде все работает. Если что, какие-то баги, пишите сюда или создавайте репорт на гитхабе.

partoftheworlD

partoftheworlD

 

Импорт баз данных IDA в GHIDRA

Вместе с гидрой в папке ${GHIDRA}/Extensions/IDAPro/ идет плагин для IDA, для импорта и экспорт баз в виде XML.     Открываем плагин, выбираем, что нужно экспортировать и ждем завершения процесса.   На выходе получаем базу в виде XML файла(со всеми сохранными данными) и просто переносим его в окно GHIDRA. Происходит импорт.     ...        

partoftheworlD

partoftheworlD

 

[GHIDRA] Первые ощущения

Ну что ж, все ощущения буду сравнивать с IDA. Дизассемблер рабочий, со странными "горячими" клавишами, сканирование проходит быстрее.     Декомпилятор работает на уровне с Hex-Ray, в некоторых моментах даже лучше. Автоматическое создание структур из коробки это действительно круто. Все что делается в IDA плагинами, в гидре есть из коробки, очень подробная документация к API, скрипты можно писать на Python и Java. О дааа, гидра умеет в различные типы, чего ида до сих пор не могет.     Сравнение декомпиляторов(низ ида, верх гидра)   Сверх удобная работа с сигнатурами функций   В ида это выглядит куда хуже.   Графическое представление функций, все же я выберу гидру, графики выглядят не так скомкано, временами это мешает сфокусироваться на отдельном блоке.   Так же у гидры удобное отображение функций при использовании классов. К примеру, в аргументах к функции используется созданная структура, гидра позволяет видеть в каких функциях она использована. Встроенный экспорт заголовков с созданными структурами, очень радует.   А вот так выглядит ручное создание классов. Создание классов так же поддерживает пространство имен, что удобно при реверсе, чтобы не создавать из одного класса помойку.   Одна из очушенных фитч, это сравнение функций, берем 2 или более функции и сравниваем, удобно бороться с самодельными пакерами имеющий ловушки. Так же поддерживается сравнение функций в разных файлах, что-то типа встроенного BinDiff.   Из минусов(временных) отсутствие поддержки темной темы и FLIRT анализа.   В заключение, мне кажется разработчикам иды придется очень-очень сильно постараться, либо снижать цены очень сильно, чтобы люди не уходили на бесплатный продукт с аналогичным функционалом. После переезда иды на новый API, ситуация с плагинами у неё не самая лучшая, но тут гидра выигрывает встроенным функционалом. Сейчас для меня гидра выигрывает почти по всем параметрам, пореверсим что-нибудь рабочее и посмотрим как себя поведет программа, какие проблемы могут быть и про это будет отдельная статья через 1-2 недели.  

partoftheworlD

partoftheworlD

 

Нахождение функции трассировки лучей

Начнем с теории, для того чтобы, что-то реверсить, надо знать как это работает, для этого стоит почитать вот эту книжку, а так же понять устройство функции выстрела.
Для этого нарисовал небольшую схему, описывающую в общих чертах, что происходит под капотом при нажатии ЛКМ в игре.     Как видим на схеме, необходимо проделать все тоже, что делали в прошлой статье по нахождению разброса, на данном этапе необходимо найти функцию рисующую дырки от пуль, по деловому она называется FX_FireBullet.   Если мы попали в функцию "Создания следов от выстрелов", остается только дебажить. В итоге внутри вложенной функции, внутри FX_FireBullet мы найдем такой код.  
  Он может отличаться, количество аргументов быть больше/меньше. Но вот какие аргументы принимала функция:   Координаты начальной позиции:     Координаты конечной позиции:   3-й аргумент маска. Маска задает магической функции создания луча, какие текстуры луч должен игнорировать, а с какими работать.
4-й аргумент фильтр трассировки 5-й аргумент булева переменная, указывающая, должна ли функция использовать группу коллизий. 6-й аргумент буфер, для вывода результата магии.   Вот какие значения получаем на выходе.     Красным выделено, то ради чего весь этот поиск затеян, это значение является чем-то типа процента отражения луча, обычно это значение от 0 до 1. На отражение так же влияет маска и если мы её подправим, отключив при трассировке все лишнее, оставив только модельку игрока, то возвращаемое значение fraction будет рано 0.95-1 если видим противника и можем попасть, и 0 если что-то мешает.     Ах да, совсем забыл, эта функция обычно находится в цикле for, просто для того, чтобы вызываться и рассчитывать разброс, дырки от пуль, трассировку каждый выстрел. В некоторых играх попадаются интересные реализации, т.е нет какой-то определенной функции работающей с трассировкой, но зато есть методы работающие с игровыми скриптами.     Этот метод ищет функцию по её названию и вызывает, а внутри этого метода находятся функции трассировки, но работают они по-разному в зависимости от передаваемого имени, а видимость задается 0 и 1, которое функция возвращает.  

partoftheworlD

partoftheworlD

 

Отключение разброса на уровне рандомизации значений

Обнуление прицела это конечно хорошо и просто, но часто не работает с оружием у которого нет прицела. Для начала необходимо найти адрес работающий с перекрестием. Бряк на доступ. Делаем выстрел.     1 выстрел 1 срабатывание инструкции, то что нужно. Открываем дизассемблер и разбираемся что тут происходит. Я уже все декомпилировал.     Готово, после реверса становится ясно, что тут у нас создаются значения, которые задают разброс оружию.   rng_init возвращает значение размером в 2 байта, мне кажется это seed (число используемое для инициализации генератора псевдослучайных чисел)   rng_flt возвращает значение float, первым аргументом задается seed, вторым минимально возможное значение, третьим максимально возможное.     В принципе тут все, чтобы разброса не было, можно либо отключить проверку, либо, при условии запрета на инжект перехватывать seed, для генерации в собственном чите, чтобы компенсировать разброс.      Или ноускопить как млг про     Но на этом не все, прелесть данного способа в том, что, если мы нашли функцию инициализирующую генератор псевдослучайных чисел, мы можем управлять всем, что только работает с псевдорандомом, например выпадение лута, движение ветра, шанс крафта, успешность взлома и т.д. Только посмотрите, сколько здесь возможностей для взлома, используя псевдорандом.  

partoftheworlD

partoftheworlD

 

CrySearch <3

Сегодня поговорим про CrySearch и причины по которым я его выбрал.   1. Чистый код. Если сравнить репозитории CE и CrySearch вы поймете про что я.   2. Скорость сканирования. После того как я впервые воспользовался CrySearch для поиска неизвестного, я удивился и не мог поверить, что поиск может занимать так мало времени.   3. Встроенные защиты от анти-читов. Рандомные заголовки, разные методы внедрения, чтения, записи в память, открытия потока, запрет на чтение физически не поддерживаемой памяти.
  4. Все под рукой.   Посмотрите на интерфейс, в нем нет ничего лишнего, а если что-то мешает, всегда можно отключить.     5. Интересный TODO лист   Много чего интересного ожидается, т.е автор собирается добавлять действительно нужные плюшки для взлома, а не делать из программы для сканирования памяти комбайн, который вроде бы и работает, но часть функционала сделана слишком не удобно для использования.        

partoftheworlD

partoftheworlD

×

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

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