Прячем строки в программах. C++

tabac

(L1) cache
PR-group
Регистрация
30.09.2018
Сообщения
697
Оценка реакций
1 048
Баллы
106
Доброго времени суток!

Сегодня речь пойдет о шифровке данных внутри программы и будет показан простой пример.

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

Если у вас в программе содержится информация в строках, как константы, то их без проблем можно прочитать.

Могу привести пример - вирусописание. Зачастую у неопытных малварь-писателей в билдах остаётся информация, по которой можно выйти на них.

Помимо метаданных, которые некоторые компиляторы оставляют, есть еще и строки. Ссылки, пути, другая информация.

Сразу скажу, этот метод защитит от поверхностного анализа файла. То есть, если пользователь целенаправленно ищет слово "remote" или "rms", то он его не найдет.

И так приступим. Я буду проводить тест на Kali Linux 2019.2
Не обращайте внимание на Linux, под Windows есть подобные программы.

Что нам понадобится?
  1. Начальное знание C++ (так как тесты я как раз на нем буду проводить)
  2. Утилита "strings". ( Strings - *nix-утилита, применяемая для поиска печатных строк в двоичных файлах )
  3. Компилятор 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
И видим нашу строку:

1.png

Она написана открытым текстом. Что же я предлагаю сделать? Я предлагаю банально зашифровать строку при помощи 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

2.png

Видим только зашифрованный текст.

Таким способом вы можете зашифровать и расшифровать любые строки, байты, значения. Но стоит понимать, что от опытных реверсеров это не спасет, хотя и не только от опытных.

Всем спасибо за внимание, пишите свои мнения и критику.

Жду PE криптор с использованием XOR xD


Копирайт и автор @Pazsh
 

Flyffer

CD-диск
Пользователь
Регистрация
26.04.2019
Сообщения
16
Оценка реакций
2
Баллы
3
Занимательно
 

glasalmaz

CD-диск
Пользователь
Регистрация
25.06.2019
Сообщения
13
Оценка реакций
0
Баллы
1
На форуме была тема кажется Crack me называлась там предлогалось найти пароль для exe (который как я понимаю находится где-то в коде в каком-то if ввиде char[100] pass; cin >> pass; if(pass =="password"))я взял эту утилиту string подствил туда этот exe с темы ,получил строки но не одна строка не пошла как пароль))
 

500mhz

(L3) cache
Модератор
Регистрация
29.04.2008
Сообщения
242
Оценка реакций
157
Баллы
46
Если делать по умному, достаточно написать "макрос" который шифрует строку на этапе компиляции, без всяких выше описаных выебонов.

 
Верх