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

partoftheworlD

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

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

  • Посещение

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

    161

partoftheworlD стал победителем дня 29 сентября

partoftheworlD имел наиболее популярный контент!

Репутация

789 Advanced Gamehacker

Информация о partoftheworlD

  • Звание
    инженер проектирующий свалки

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

11846 просмотров профиля
  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!

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

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

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