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

partoftheworlD

Помогаторы
  • Публикаций

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

  • Посещение

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

    161

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

  1. partoftheworlD

    как задать условие на трассеровку?

    Посчитай на бумажке как формируется eax, смотря по инструкциям, которые были выше.
  2. Небольшая заметка. В общем давняя проблема была со значениями при декомпиляции, а именно они просто не отображались и вывод декомпилятора выглядел вот так: fVar12 = (float)uVar3 * (float)0x2f800000 * FLOAT_142ab7340; а нам нужно: fVar12 = (float)uVar3 * (float)0x2f800000 * 6.28318548; Это возникает только при анализе дампов, когда гидра считает, что адрес по которому лежит значения является динамическим, поэтому брать на себя ответственность за неправильный вывод гидра не хочет и предоставляет нам адрес. Чтобы поправить вывод, необходимо указать, что этот адрес и значение в нем являются константой. Для этого надо перейти по адресу со значением, ПКМ по значению, Data -> Settings -> Mutability = constant. Теперь мне кажется, что гидра еще более сложный инструмент, чем ида.😄
  3. partoftheworlD

    [Writeup] TraineMe by Xipho

    (С сегодняшнего дня все статьи будут идти в 2-х экземплярах, постом в блоге и в pdf версии, чтобы скрины в случае чего не полетели) Прошла уже неделя с момента релиза TraineMe, думаю все кто хотел уже поковыряли программу и уже пора выпустить решебник. Итак начнем. Используемые программы: Ghidra, CE. x64dbg, CherryTree.(Гидра была выбрана по 2-м причинам, первая она мне больше нравится, а вторая декомпилятор с этим файлом у гидры генерировал более понятный код, чем hex-rays.) Задание 1 m_fnEncodeValue(this ,param_2,m_fHealth ,AllocatedMemory,0); m_fnEncodeValue(this ,param_2,m_fAttack ,AllocatedMemory,1); m_fnEncodeValue(this ,param_2,m_fHealth ,AllocatedMemory,2); Здоровье передается в функцию m_fnEncodeValue в hex 1000.f = 0x447A0000 линия 1 и 3 Реверсим...Ставим бряк по адресу TraineMe.0+12E6 в x64dbg: bp TraineMe.0+12e6 Чтобы узнать, что лежит в регистрах и сделать код в функции m_fnEncodeValue более читаемым. После восстановления видим, что существует 2 массива для работы со здоровьем с общей структурой т.е.: PlayersArray[idx * 4] = KeysArray[idx * 4] ^ m_fLoadedHealth Сам ключ вычисляется довольно просто: srand(time64(0)) //Задаем seed для последующей генерации "рандомных" чисел с помощью rand() m_wPseudorandom = rand() KeysArray[idx * 4] = (m_wPseudorandom + (m_wPseudorandom * 0x93275ab3) >> 0x3f) * 0xdeadbeef + 1 Обратите внимание на код, который был показан выше, а точнее на последний аргумент: m_fnEncodeValue(this ,param_2,m_fHealth ,AllocatedMemory,0); m_fnEncodeValue(this ,param_2,m_fAttack ,AllocatedMemory,1); m_fnEncodeValue(this ,param_2,m_fHealth ,AllocatedMemory,2); 0, 1, 2 указывает на используемый индекс в структуре, которая была выделена во время нажатия кнопки “Start Game” 0 - текущее значение 1 - урон (???) 2 - статичное значение, скорее всего максимальное значение здоровья Эти значения могут пригодится для одного из способов создания бессмертия. Немного о выделении памяти, в этом traineme существует 2 основных выделения памяти под структуры на 48 и 24 байт. Все основные вычисления проводятся в той что по-больше. Задание 2 Выполнив первое задание, мы без проблем можем обнаружить единственную нужную инструкцию. После быстрого анализа кода с помощью трассировок, найти участок кода, где здоровье вычитается(а на деле прибавляется.), не составит труда. А теперь вспомним о значение 50, которое мы находили в первом задании. Весь алгоритм вычисления урона: srand(time64(0)) damage_multiplier = rand() / 32767.00000000 //приводим множитель к 1 damage = 50.f * damage_multiplier ^ 0x80000000 // 50.0 * 0.67 = 33.5 ^ 0x80000000 = -33.5 // // Загружается и расшифровывается значение здоровья (health) // health += damage //1000.0 += -33.5 damage = 0 damage_multiplier = 0 Задание 3 Довольно сложное задание, для тех, кто никогда/мало работал с GDI, поэтому ответ есть в этом видео: 01. Основные графики Windows. Изучаем GDI. Pen, Brush, Rectangle. Ну и табличка прилагается. TraineMe.CT RE--TraineMe.pdf
  4. Ищется так же как и любое другое значение в памяти. Не можешь найти скорость, значит ищи, то что можешь, например координаты, от них можно восстановить код и выйти на кусок кода работающий с расчетом координат, от него выходишь на дистанцию, от дистанции на скорость, от скорости на forward vector и т.д.
  5. Обычно это вектор единичной длины(если по простому - шаг проделываемый объектом), который используется для вычисления позиции за определенное количество времени и может принимать в себя разные параметры, типа ускорения, скорости и т.д.
  6. Это самые основы, которые даже есть в видео-уроках, а именно стек вызовов и многоуровневые указатели(ручной способ).
  7. Это и так самое простое, проще только идти в песочницу и лепить куличики.
  8. Сейчас нашлось свободных 10 минут, вот что нашел. В игре используется типичный switch/case, как первый вариант фильтрации просто использовать номера кейсов "если номер кейса равен n, то положить указатель в ...". Второй вариант продолжить искать инструкции формирующие указатель, он будет уровнем выше. И из-за этого раздули тему на целый десяток сообщений.
  9. Да очень просто, восстановлю алгоритм получения указателей и буду с помощью цикла получать только то, что мне нужно, а не перебирать все подряд и отсеивать с помощью исключений. Тем более поиск указателей не так уж и сложен, чем разбираться во внутреннем устройстве SEH.
  10. partoftheworlD

    Задачка по IDA и Python

    https://raw.githubusercontent.com/EiNSTeiN-/idapython/master/examples/ex_graph.py
  11. partoftheworlD

    Задачка по IDA и Python

    Подключение к питону происходит с помощью: import idc import idautils import idaapi У меня есть наработки некоторые, возможно что-то пригодится. В выводе получим Надо будет поправить пару строк, чтобы выводилась не функция целиком, а как при трассировке: for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: Если нужно, вечером могу поискать, где-то был код для постройки графов.
  12. Деобфусцировал код игры и посмотрел какие значения принимает функция рисования этой полоски, а после поиском нашел значение (изменилось/не изменилось)
  13. Визуальное значение проходит через эту инструкцию, останется только зареверсить. F3 0F 11 6E 1C C6 46 24 01 48 8B C7
  14. partoftheworlD

    [ PC Hunter ] Load Driver Error!

    Когда же люди научатся читать журналы изменений.
  15. partoftheworlD

    как задать условие на трассеровку?

    смотришь в документации объявленный счетчик срабатываний брейкпоинтов( $breakpointcounter), выбираешь вкладку трассировка, выбираешь тип трассировки с заходом или без захода в вызовы, появляется окошечко и туда вписываешь любые условия, для остановки, если остановка случилась, то что необходимо сделать и т.д. Вот пример, трассировка начнется, если счетчик срабатываний инструкции будет больше 1000. Вот еще пример, дампера значений с инструкции, там про трассировку с условием более подробно и надеюсь понятно написано.
  16. partoftheworlD

    как задать условие на трассеровку?

    Есть видео уроки, а так же книги , а так же документация, так что информации полно. Например, OALabs. Уроки и книги по крутым инструментам для отладки обычно у малварщиков, а как применить их, это уже дело фантазии, в случае чего, существует туева хуча уроков по ollydbg в том числе и на русском, если знаешь olly, то проблем с использованием x64dbg не будет. Интерфейс у них похожий, плюс есть поддержка различных языков, так что даже методом "тыка" можно разобраться за минут 30. CE представляет из себя комбаин из всего что только есть, но вот реализация не самая удачная и тут встает единственный вопрос, готов ли ты тратить на какое-то дело некое количество времени, чтобы написать костыли в CE, когда существует готовое решение, делающее то, что тебе нужно в один клик.
  17. partoftheworlD

    как задать условие на трассеровку?

    Как вариант, не заниматься ерундой, а использовать специально заточенные для отладки инструменты. Например, в x64dbg этот счетчик остановок вынесет в отдельную переменную ($breakpointcounter) для доступа к ней, или Windbg. CE не подойдет для чего-то серьезного как ни крути.
  18. partoftheworlD

    Трейнер Plants Vs Zombies GOTY Edition 1.2.0.1095

    Создай отдельный аккаунт на Mega, чисто для трейнеров, там будет доступно 50гб и ссылки на файлы не полетят, пока аккаунт или файл не удалишь. Есть
  19. partoftheworlD

    как задать условие на трассеровку?

    Вроде бы у CE не счетчика остановок, поэтому придется делать свой с помощью скрипта. cmp [debugCounter],#99 jne doSomething ... inc [debugCounter] jmp original_code doSomething: ... inc [debugCounter] jmp original_code
  20. Читать больно. А на счет трейнеров и их качества, условия использования не оговариваются, а значит трейнеры, таблицы и прочий софт, написанный разработчиками, распространяется "как есть" т.е. работоспособность не гарантируется вообще, так что при использовании трейнеров, таблиц и прочего софта пользователь использует все на свой страх и риск. Так что мне прямо удивительно видеть людей, которые требуют качества за бесплатно, так еще и возмущаются что, что-то не так работает или не работает совсем(не только ты, с того же пг полно подобного типа людей). Предлагаю закрыть и почистить топик, так как это достаточно глупое обсуждение.
  21. partoftheworlD

    Субтитры в UE3/4

    FText является классом, для каждого субтитра устанавливается свое время отображения.
  22. Статьи придется растянуть ещё на 1-2 т.к. я свалился с температурой. Но сегодня не об этом, для начала нам необходимо вспомнить структуру построения диалогов. [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать." Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Subtitles[0]=(Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать.") Необходимо обратить внимание на идентификатор, а точнее на SoundNodeWave, в прошлой статье я забыл указать, что это класс UE3, по сути это звуковой узел, работающий с локализацией, который содержит данные об воспроизводимом файле, а также его характеристиках. Но для нашей цели, а именно увеличения времени показа субтитров, надо обратить внимание на массив Subtitles, а дальше просто, посмотреть в документацию. смотрим на структуру array<SubtitleCue> Линия текста субтитров и время, которое субтитры должны отображаться. Из примера выше: Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать." Вот мы и нашли способ для увеличения времени показа субтитров, имея на руках только гугл и файлы локализации. Да, он относительно долгий (нам надо будет переписать все субтитры, а их там 598 файлов). Можно конечно скрипт написать, который подправит все, но должен же быть способ проще. Но насколько я понял по локализации, то проблема в быстрых субтитрах именно в ней, в нормальной английской версии, субтитры разделены на группы, а в русской все в одной строке. Eng: [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Good, you're awake - I wasn't sure how long you'd be under. Those tranquilizers wore off fast." Subtitles[0]=(Text="Good, you're awake - ") Subtitles[1]=(Text="I wasn't sure how long you'd be under. ") Subtitles[2]=(Text="Those tranquilizers wore off fast.") bManualWordWrap=True Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Rus: [B01_P_INTRO_01_000 SoundNodeWave] SpokenText="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать." Comment="NOTES[], TRIGGER[], GLOSSARY[]" bMature=False Subtitles[0]=(Text="Ты очнулся, очень хорошо - я не знала, сколько ты проваляешься. Эти транквилизаторы в конце концов перестали действовать.") В следующей статье, мы будет находить объект SoundNodeWave, реверсить его структуру, восстанавливать в ReClass и писать скрипт в CE, который будет подсовывать в массив SubtitleCue указанное нами время. Или оставить это моим читателям как домашнее задание?
  23. Для 10-15 людей, которые сидят на системе, которую уже 11 лет как не поддерживают? Может еще стоит указывать про то, что Windows 2000 и 98 тоже не поддерживается? Надеюсь это была шутка. Мне кажется, если используешь настолько устаревшую систему, то надо предполагать, что на ней мало что будет запускаться, тем более написанное в 2016 году.
  24. Подозрительно все это, трейнер основанный на сигнатурах не работает в более старой версии системы, а на новой работает.
×

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

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