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

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

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

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

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

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



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



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



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



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;
}

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



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

На этом всё. Всем добра и позитива.
 
  • 112
  • 92
Контакты для связи отсутствуют.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Опозорил так опозорил
 
Активность
Пока что здесь никого нет
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше...