Доброго времени суток!
Сегодня речь пойдет о шифровке данных внутри программы и будет показан простой пример.
Все мы знаем, что строки не сильно шифруются без дополнительных программ. Это очень опасно.
Если у вас в программе содержится информация в строках, как константы, то их без проблем можно прочитать.
Могу привести пример - вирусописание. Зачастую у неопытных малварь-писателей в билдах остаётся информация, по которой можно выйти на них.
Помимо метаданных, которые некоторые компиляторы оставляют, есть еще и строки. Ссылки, пути, другая информация.
Сразу скажу, этот метод защитит от поверхностного анализа файла. То есть, если пользователь целенаправленно ищет слово "remote" или "rms", то он его не найдет.
И так приступим. Я буду проводить тест на Kali Linux 2019.2
Не обращайте внимание на Linux, под Windows есть подобные программы.
Что нам понадобится?
Давайте для начала посмотрим, что мы имеем, когда создаем билд с обычной строкой.
Пишем код:
Компилируем:
Смотрим строки:
И видим нашу строку:
Она написана открытым текстом. Что же я предлагаю сделать? Я предлагаю банально зашифровать строку при помощи XOR. (XOR берется в качестве примера)
Напишем наш криптор строк:
Компилируем:
Запускаем:
Видим, что совершенно понятный нам текст превратился в не понятный набор символов.
Согласитесь, это выглядит куда загадочнее и не понятнее чем наш текст.
Ну и теперь напишем основную программу для теста:
Заметьте, ключи при шифрование и расшифровке должны быть одинаковы. Если разные - результат будет другой.
Компилируем:
Запускаем:
Видим правильный вывод строки.
Теперь заглянем внутрь файла.
Видим только зашифрованный текст.
Таким способом вы можете зашифровать и расшифровать любые строки, байты, значения. Но стоит понимать, что от опытных реверсеров это не спасет, хотя и не только от опытных.
Всем спасибо за внимание, пишите свои мнения и критику.
Жду PE криптор с использованием XOR xD
Сегодня речь пойдет о шифровке данных внутри программы и будет показан простой пример.
Все мы знаем, что строки не сильно шифруются без дополнительных программ. Это очень опасно.
Если у вас в программе содержится информация в строках, как константы, то их без проблем можно прочитать.
Могу привести пример - вирусописание. Зачастую у неопытных малварь-писателей в билдах остаётся информация, по которой можно выйти на них.
Помимо метаданных, которые некоторые компиляторы оставляют, есть еще и строки. Ссылки, пути, другая информация.
Сразу скажу, этот метод защитит от поверхностного анализа файла. То есть, если пользователь целенаправленно ищет слово "remote" или "rms", то он его не найдет.
И так приступим. Я буду проводить тест на Kali Linux 2019.2
Не обращайте внимание на Linux, под Windows есть подобные программы.
Что нам понадобится?
- Начальное знание C++ (так как тесты я как раз на нем буду проводить)
- Утилита "strings". ( Strings - *nix-утилита, применяемая для поиска печатных строк в двоичных файлах )
- Компилятор C++.
Давайте для начала посмотрим, что мы имеем, когда создаем билд с обычной строкой.
Пишем код:
C++:
#include <string.h> //библиотека для работы с классом std::string
int main(){ //функция входа
std::string mystr = "abcd123"; //Строка со значением "abcd123". Эту строку мы будем искать, ее нужно будет скрыть.
//Заметьте мы просто вставляем строку в ячейку памяти. Мы не выводим ее.
return 0; //Успешно завершаем выполнение
}
Bash:
mkdir builds # Папка для билдов
c++ uncrypted.cpp -o builds/uncrypted # В моем случае я использую компилятор "c++", указываю файл исходного кода uncrypted.cpp и сохраняю в builds под именем uncrypted
Bash:
strings uncrypted
Она написана открытым текстом. Что же я предлагаю сделать? Я предлагаю банально зашифровать строку при помощи XOR. (XOR берется в качестве примера)
Напишем наш криптор строк:
C++:
#include <iostream> // потоки ввода/вывода
#include <string.h> // библиотека для работы с классом std::string
int main(){ //функция входа
std::string mystr = "abcd123"; // Строка. Вы можете вводить строку и ключ с помощью потоков ввода, делайте на своё усмотрение.
std::string crypted = ""; // Переменная для сохранение зашифрованной строки
for(int i = 0; i < strlen(mystr.c_str()); i++) // Создаем цикл для шифровки каждого символа
crypted += mystr[i] ^ [B]2[/B]; //проводим операцию xor с ключом 2
std::cout << crypted << std::endl; // выводим результат
return 0; //Успешно завершаем выполнение.
}
c++ crypter.cpp -o builds/cryptor
Запускаем:
./builds/cryptor
Видим, что совершенно понятный нам текст превратился в не понятный набор символов.
Код:
c`af301
Ну и теперь напишем основную программу для теста:
C++:
#include <iostream> //потоки ввода/вывода
#include <string.h> // std::string
int main(){
std::string mystr = "c`af301"; //Зашифрованный текст
std::string a = ""; //Строка под расшифрованный текст
for(int i = 0; i < strlen(mystr.c_str()); i++) //Запускаем цикл для каждого символа
a += mystr[i] ^ 2; // Расшифровываем и заполянем переменную.
std::cout << a << std::endl; //Выводим
return 0; //Успешное завершение.
}
Компилируем:
c++ crypted.cpp -o builds/crypted
Запускаем:
./builds/crypted
Видим правильный вывод строки.
Теперь заглянем внутрь файла.
strings builds/crypted
Видим только зашифрованный текст.
Таким способом вы можете зашифровать и расшифровать любые строки, байты, значения. Но стоит понимать, что от опытных реверсеров это не спасет, хотя и не только от опытных.
Всем спасибо за внимание, пишите свои мнения и критику.
Жду PE криптор с использованием XOR xD