Начинающий
- Статус
- Оффлайн
- Регистрация
- 12 Мар 2023
- Сообщения
- 27
- Реакции
- 7
Шифрование XOR (или "Исключающее ИЛИ") — это один из самых простых способов защитить данные. Оно широко используется благодаря своей простоте, скорости и эффективности. Давайте разберёмся, как это работает, и почему оно полезно.
Основная идея XOR
XOR — это логическая операция "исключающее ИЛИ". Её ключевая особенность:
Если два входных значения одинаковы, результат будет 0.
Если они разные, результат будет 1.
Свойства XOR
Шифрование данных:
Используется для простых алгоритмов шифрования. Например, шифрование потока.
Контрольные суммы:
XOR применяется для проверки данных (например, в сетевых пакетах).
Обмен значениями без временной переменной:
XOR позволяет менять значения переменных местами без использования дополнительной памяти.
Пример использование XOR
Как же использовать XOR на примере ЯП C++
Для начала мы подключаем нужные нам библиотеки такие как:
Надеюсь объяснение не требуется для чего каждая библиотека. Продолжим, после подключение нужных библиотек мы должны написать функцию для шифрования/дешифрования:
std::string: Тип возвращаемого значения функции — строка (в данном случае зашифрованная или расшифрованная).
const std::string& input: Входной параметр функции — строка, которая будет зашифрована или расшифрована. Передаётся по ссылке, чтобы избежать копирования.
char key: Символ, используемый в качестве ключа для XOR-операции.
То есть мы создаём копию входной строки input, которая называется result. Она будет модифицироваться в процессе шифрования/дешифрования, чтобы не изменять оригинальную строку. После мы применяем XOR к каждому символу и возвращаем результат.
Создание проверки введенного пароля довольна проста
После мы уже переходим к созданию пароля вы можете использовать разные сайты для шифрование пароля в xor но я так же прикреплю простенькую тулзу которой пользуюсь я.
Вы спросите для чего нужен ключ?
Ключ — это символ или набор символов, который участвует в операции XOR с каждым байтом или символом входных данных (например, строки). Он нужен, чтобы результат шифрования был уникальным и зависел от ключа.
Без ключа:
Если ключа нет, результат XOR всегда будет предсказуем (например, просто инверсия битов
Такие данные легко расшифровать, поскольку метод XOR прост, и злоумышленник может догадаться о преобразованиях.
С ключом:
Ключ добавляет сложность и делает шифрование уникальным.
Только тот, кто знает ключ, сможет расшифровать данные.
Каким должен быть ключ?
Чтобы шифрование XOR было максимально надёжным, ключ должен обладать следующими свойствами:
Секретность: Ключ должен быть известен только тем, кто имеет доступ к шифруемым данным.
Сложность: Ключ должен быть достаточно длинным и сложным, чтобы его было трудно угадать.
Случайность: Использование простых или повторяющихся ключей (например, 'AAAA') делает шифрование предсказуемым.
Теперь рассмотрим XOR в IDA
Теперь мы можем рассмотреть шифрование XOR с глаз человека который попробует взломать нашу программу.
Открыв нашу программу в иде перед нами встает такая картина
Нас интересует именно часть перед вводом пароля, а именно
Основные моменты:
Переменная encryptedPassword содержит зашифрованный пароль.
Здесь зашифрованный пароль представлен в виде байтового массива
Функция xorEncryptDecrypt используется для дешифрования encryptedPassword перед сравнением с введённым пользователем паролем:
encryptedPassword — зашифрованный пароль.
v5 — ключ для XOR-шифрования.
result — дешифрованный пароль.
После дешифровки результат сравнивается с пользовательским вводом
Давайте расшифруем пароль, закодированный в переменной encryptedPassword, используя ключ XOR.
Зашифрованный пароль в байтах представлен двумя частями:
0xC7C0C3DCFBC7D2FB
0xEDC6DDD2C3
Пароль был зашифрован в виде последовательности байтов:
{ 0xFB, 0xD2, 0xC7, 0xFB, 0xDC, 0xC3, 0xC0, 0xC7, 0xC3, 0xD2, 0xDD, 0xC6, 0xED }
Но как же узнать какой пароль это ведь байты.
Напишем простую тулзу для этого:
Программа выведет пароль SecretPass123
Что и будет правильным!
Эта статья предназначена для новичков в сфере реверс инжиниринга которые могут столкнуться с данным шифрованием, я знаю что таких статей полно в инете, но когда ты полный ноль и без чей то поддержки решаешь кряк ми то тяжело понять что перед тобой xor шифрование, а не хуй в гандоне, все гуд бай спасибо за прочтение!
Основная идея XOR
XOR — это логическая операция "исключающее ИЛИ". Её ключевая особенность:
Если два входных значения одинаковы, результат будет 0.
Если они разные, результат будет 1.
Свойства XOR
- Обратимость:
Если вы примените XOR дважды с одним и тем же значением, вы получите исходное число:
(a XOR b) XOR b = a. - Коммутативность:
Порядок операндов не важен:
a XOR b = b XOR a. - Ассоциативность:
Вы можете группировать операции как угодно:
(a XOR b) XOR c = a XOR (b XOR c).
Шифрование данных:
Используется для простых алгоритмов шифрования. Например, шифрование потока.
Контрольные суммы:
XOR применяется для проверки данных (например, в сетевых пакетах).
Обмен значениями без временной переменной:
XOR позволяет менять значения переменных местами без использования дополнительной памяти.
Пример использование XOR
Как же использовать XOR на примере ЯП C++
Для начала мы подключаем нужные нам библиотеки такие как:
C++:
#include <iostream>
#include <string>
Надеюсь объяснение не требуется для чего каждая библиотека. Продолжим, после подключение нужных библиотек мы должны написать функцию для шифрования/дешифрования:
C++:
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++:
bool checkPassword(const std::string& inputPassword, const std::string& encryptedPassword, char key) {
// Дешифруем сохранённый пароль
std::string decryptedPassword = xorEncryptDecrypt(encryptedPassword, key);
// Сравниваем введённый пароль с оригинальным
return inputPassword == decryptedPassword;
}
C++:
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 с глаз человека который попробует взломать нашу программу.
Открыв нашу программу в иде перед нами встает такая картина
Нас интересует именно часть перед вводом пароля, а именно
Основные моменты:
Переменная encryptedPassword содержит зашифрованный пароль.
Код:
*(__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 перед сравнением с введённым пользователем паролем:
Код:
xorEncryptDecrypt(&result, &encryptedPassword, v5);
v5 — ключ для XOR-шифрования.
result — дешифрованный пароль.
После дешифровки результат сравнивается с пользовательским вводом
Код:
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;
}
Зашифрованный пароль в байтах представлен двумя частями:
0xC7C0C3DCFBC7D2FB
0xEDC6DDD2C3
Пароль был зашифрован в виде последовательности байтов:
{ 0xFB, 0xD2, 0xC7, 0xFB, 0xDC, 0xC3, 0xC0, 0xC7, 0xC3, 0xD2, 0xDD, 0xC6, 0xED }
Но как же узнать какой пароль это ведь байты.
Напишем простую тулзу для этого:
C++:
#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;
}
Что и будет правильным!
Эта статья предназначена для новичков в сфере реверс инжиниринга которые могут столкнуться с данным шифрованием, я знаю что таких статей полно в инете, но когда ты полный ноль и без чей то поддержки решаешь кряк ми то тяжело понять что перед тобой xor шифрование, а не хуй в гандоне, все гуд бай спасибо за прочтение!
Вложения
Последнее редактирование: