Статья [Reverse-Engineering] Решаем крякми QHide без патчей

  • colby57
  • UNEXPECTED_KERNEL_MODE_TRAP_M (1000007f)
  • 155
  • 2
  • 240
Всем шалом, решил выпустить маленькую статейку чтобы показать людям, которые не смогли его пройти как можно спокойно все обойти без патчей.

Возьмём за пример последнюю версию крякми, а именно v4.

Сам крякми накрыт вмпротектом, а читать ассемблерный код мешала только мутация, поэтому мы всё ещё можем закинуть файл в иду.

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

После того как закинули файл в дизассемблер и нашли main функцию, начинаем искать проверку на валидные данные.

1628181920522.png


Итак, мы нашли функцию, которая принимала два аргумента в виде ника и пароля, а именно sub_140002AF0, сам алгоритм был настроен лишь на мутацию кода с помощью введенного никнейма.
Переходим к этой функции и копируем её полностью кроме последней проверки.

1628182082536.png


Теперь напишем консольку, которая будет выводить нам наш пароль с помощью никнейма.
Копируем нашу функцию с мутацией и вставляем в проект

1628182159521.png


На этом наш "генератор пароля" готов, давайте проверим как это дело будет выглядеть в консольке
Сам алгоритм у кодера вышел немного кривым, поэтому у некоторых будут непонятные символы.

1628182544158.png


C++:
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

#include <Windows.h>

char nickname[64];
char password[64];

char mutate_password(const char* nickname, const char* password)
{
    int j;
    size_t v5;
    char symbol[120];

    if (strlen(nickname) < 4 || strlen(password) < strlen(nickname)) {
        return 0;
    }

    for (int i = 0; i < strlen(nickname); ++i)
    {
        symbol[i] = nickname[i];
        symbol[i] ^= 7u;
        symbol[i] *= 16;
        symbol[i] += nickname[i] & 0xF;
    }

    std::cout << "mutated password -> " << symbol << std::endl;

    return 1;
}

int main()
{
    printf("nick: ");
    scanf("%s", nickname);

    printf("pass: ");
    scanf("%s", password);

    mutate_password(nickname, password);

    getchar();

    return 0;
}

Теперь проверим наш пароль на самом лоадере:

1628182578587.png


Сама дллка имеет права RWX, из-за чего она сильно палится в регионе памяти лоадера, поэтому думаю сдампить длл не составим никому труда.

На этом всё. Всем добра и позитива.
 
  • 112
  • 92
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Опозорил так опозорил
 
Сверху Снизу