Гайд Шифрование XOR: Просто о сложном

  • Автор темы Автор темы ise1337
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
12 Мар 2023
Сообщения
27
Реакции
7
Шифрование XOR (или "Исключающее ИЛИ") — это один из самых простых способов защитить данные. Оно широко используется благодаря своей простоте, скорости и эффективности. Давайте разберёмся, как это работает, и почему оно полезно.

Основная идея XOR
XOR — это логическая операция "исключающее ИЛИ". Её ключевая особенность:

Если два входных значения одинаковы, результат будет 0.
Если они разные, результат будет 1.

Свойства XOR
  1. Обратимость:
    Если вы примените XOR дважды с одним и тем же значением, вы получите исходное число:
    (a XOR b) XOR b = a.
  2. Коммутативность:
    Порядок операндов не важен:
    a XOR b = b XOR a.
  3. Ассоциативность:
    Вы можете группировать операции как угодно:
    (a XOR b) XOR c = a XOR (b XOR c).
Где используется XOR?

Шифрование данных:
Используется для простых алгоритмов шифрования. Например, шифрование потока.
Контрольные суммы:
XOR применяется для проверки данных (например, в сетевых пакетах).
Обмен значениями без временной переменной:
XOR позволяет менять значения переменных местами без использования дополнительной памяти.

Пример использование XOR

Как же использовать XOR на примере ЯП C++
Для начала мы подключаем нужные нам библиотеки такие как:

C++:
Expand Collapse Copy
#include <iostream>
#include <string>

Надеюсь объяснение не требуется для чего каждая библиотека. Продолжим, после подключение нужных библиотек мы должны написать функцию для шифрования/дешифрования:
C++:
Expand Collapse Copy
std::string xorEncryptDecrypt(const std::string& input, char key) {
    std::string result = input;
    for (char& c : result) {
        c ^= key; // Применяем XOR для каждого символа
    }
    return result;
}

std::string: Тип возвращаемого значения функции — строка (в данном случае зашифрованная или расшифрованная).
const std::string& input: Входной параметр функции — строка, которая будет зашифрована или расшифрована. Передаётся по ссылке, чтобы избежать копирования.
char key: Символ, используемый в качестве ключа для XOR-операции.

То есть мы создаём копию входной строки input, которая называется result. Она будет модифицироваться в процессе шифрования/дешифрования, чтобы не изменять оригинальную строку. После мы применяем XOR к каждому символу и возвращаем результат.

Создание проверки введенного пароля довольна проста
C++:
Expand Collapse Copy
bool checkPassword(const std::string& inputPassword, const std::string& encryptedPassword, char key) {
    // Дешифруем сохранённый пароль
    std::string decryptedPassword = xorEncryptDecrypt(encryptedPassword, key);
    // Сравниваем введённый пароль с оригинальным
    return inputPassword == decryptedPassword;
}
После мы уже переходим к созданию пароля вы можете использовать разные сайты для шифрование пароля в xor но я так же прикреплю простенькую тулзу которой пользуюсь я.
C++:
Expand Collapse Copy
const std::string encryptedPassword = "\xfb\xd2\xc7\xfb\xdc\xc3\xc0\xc7\xc3\xd2\xdd\xc6\xed";
const char encryptionKey = 'A'; // Ключ шифрования

Вы спросите для чего нужен ключ?

Ключ — это символ или набор символов, который участвует в операции XOR с каждым байтом или символом входных данных (например, строки). Он нужен, чтобы результат шифрования был уникальным и зависел от ключа.

Без ключа:
Если ключа нет, результат XOR всегда будет предсказуем (например, просто инверсия битов
Такие данные легко расшифровать, поскольку метод XOR прост, и злоумышленник может догадаться о преобразованиях.

С ключом:
Ключ добавляет сложность и делает шифрование уникальным.
Только тот, кто знает ключ, сможет расшифровать данные.

Каким должен быть ключ?
Чтобы шифрование XOR было максимально надёжным, ключ должен обладать следующими свойствами:

Секретность: Ключ должен быть известен только тем, кто имеет доступ к шифруемым данным.
Сложность: Ключ должен быть достаточно длинным и сложным, чтобы его было трудно угадать.
Случайность: Использование простых или повторяющихся ключей (например, 'AAAA') делает шифрование предсказуемым.

Теперь рассмотрим XOR в IDA

Теперь мы можем рассмотреть шифрование XOR с глаз человека который попробует взломать нашу программу.

Открыв нашу программу в иде перед нами встает такая картина
1737039694812.png

Нас интересует именно часть перед вводом пароля, а именно
1737040124018.jpeg


Основные моменты:
Переменная encryptedPassword содержит зашифрованный пароль.
Код:
Expand Collapse Copy
*(__m128i *)&encryptedPassword._Mypair._Myval2._Mysize = _mm_load_si128((const __m128i *)&_xmm);
encryptedPassword._Mypair._Myval2._Bx._Ptr = (char *)0xC7C0C3DCFBC7D2FBLL;
*(_QWORD *)&encryptedPassword._Mypair._Myval2._Bx._Alias[8] = 0xEDC6DDD2C3LL;
Здесь зашифрованный пароль представлен в виде байтового массива
Функция xorEncryptDecrypt используется для дешифрования encryptedPassword перед сравнением с введённым пользователем паролем:
Код:
Expand Collapse Copy
xorEncryptDecrypt(&result, &encryptedPassword, v5);
encryptedPassword — зашифрованный пароль.
v5 — ключ для XOR-шифрования.
result — дешифрованный пароль.
После дешифровки результат сравнивается с пользовательским вводом

Код:
Expand Collapse Copy
if ( userInput._Mypair._Myval2._Mysize == result._Mypair._Myval2._Mysize )
{
    if ( userInput._Mypair._Myval2._Mysize )
        v12 = memcmp_0(p_userInput, p_result, userInput._Mypair._Myval2._Mysize) == 0;
    else
        v12 = 1;
}
else
{
    v12 = 0;
}
Давайте расшифруем пароль, закодированный в переменной encryptedPassword, используя ключ XOR.
Зашифрованный пароль в байтах представлен двумя частями:
0xC7C0C3DCFBC7D2FB
0xEDC6DDD2C3

Пароль был зашифрован в виде последовательности байтов:

{ 0xFB, 0xD2, 0xC7, 0xFB, 0xDC, 0xC3, 0xC0, 0xC7, 0xC3, 0xD2, 0xDD, 0xC6, 0xED }

Но как же узнать какой пароль это ведь байты.
Напишем простую тулзу для этого:
C++:
Expand Collapse Copy
#include <iostream>
#include <string>
#include <vector>

// Функция для дешифровки XOR
std::string xorDecrypt(const std::vector<unsigned char>& encryptedPassword, char key) {
    std::string decryptedPassword;
    for (unsigned char byte : encryptedPassword) {
        decryptedPassword += byte ^ key; // Дешифровка каждого байта
    }
    return decryptedPassword;
}

int main() {
    // Зашифрованные байты пароля
    std::vector<unsigned char> encryptedPassword = {
        0xFB, 0xD2, 0xC7, 0xFB, 0xDC, 0xC3, 0xC0, 0xC7,
        0xC3, 0xD2, 0xDD, 0xC6, 0xED
    };

    // Ключ для XOR
    char key = 'A';

    // Дешифровка пароля
    std::string decryptedPassword = xorDecrypt(encryptedPassword, key);

    // Вывод результата
    std::cout << "Decrypted Password: " << decryptedPassword << std::endl;

    return 0;
}
Программа выведет пароль SecretPass123
Что и будет правильным!

Эта статья предназначена для новичков в сфере реверс инжиниринга которые могут столкнуться с данным шифрованием, я знаю что таких статей полно в инете, но когда ты полный ноль и без чей то поддержки решаешь кряк ми то тяжело понять что перед тобой xor шифрование, а не хуй в гандоне, все гуд бай спасибо за прочтение!
 

Вложения

  • 1737039604913.png
    1737039604913.png
    112.5 KB · Просмотры: 68
Последнее редактирование:
Помойму это наоборот: Сложно о простом)
 
рантайм типа такой лоооол
 
Помню как написал chatgbt напиши мне лоадер на с++ и было тоже с коментариями
 
chatgpt moment boost
 
Назад
Сверху Снизу