Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Внедрение хэш-образа пароля в код программы

Поиск

Данный способ предполагает создание вспомогательной программной утилиты, предназначенной для вычисления хэш-образа для строки, вводимой пользователем. Так или иначе, но хэш-образ пароля определяется до момента компиляции программы.

 

#define A 54059   /* a prime */#define B 76963   /* another prime */#define C 86969 /* yet another prime */#define FIRSTH 37 /* also prime */// функция возвращает целочисленный хэш-образ строки, полученной// в качестве параметра вызова.unsigned hash_str(const char* s){ unsigned h = FIRSTH; while (*s) { // цикл выполняется пока не достигнут конец строки h = (h * A) ^ (s[0] * B); s++; // изменяется значение указателя, а не содержимое строки } return h; // возвращается сформированный образ, or return h % C;}

 

Кроме того, стандартная библиотека языка С ++, тоже предоставляет разработчику уже готовые хэш-функции, объявленные в библиотеке < functional >. Рассмотрим следующий пример: 

 

#include <iostream>#include <string>#include <functional> int main() { std::string s = "Stand back! I've got jimmies!"; std::hash<std::string> hash_fn; size_t hash = hash_fn(s); std::cout << hash << '\n';}

 

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

 

Управляющие E sc последовательности

Просто о сложном…

Терминал в UNIX/Linux -совместимых системах имеет низкоуровневый механизм для управления стандартным потоком вывода (STDOUT). Данный механизм основан на использовании управляющих ESC последовательностей (управляющие символы ANSIANSI escape code), передаваемых программой в STDOU T и приводящих к изменению в работе самого потока. Esc -последовательность начинается с управляющего символа обратный слэш – '\'. Ранее мы уже использовали некоторые E sc -последовательности, такие, как '\n', '\t'. Однако, система поддерживает механизм управления состоянием бит атрибут символов, выводимых на терминал. Рассмотрим следующий пример.

 

#include <iostream>

int main() {

std::cout<<"\x1B[2J";

std::cout<<"\x1B[31mHello\x1B[0m"<<std::endl;

std::cout<<"\x1B[34;46mProgramming\x1B[0m"<<std::endl;

std::cout<<"\x1B[43m\x1B[31mHello\x1B[0m\x1B[0m"<<std::endl;

return 0;

}

В стандартный поток передаются строки, содержащие несколько Esc –последовательностей. Рассмотрим, из чего они состоя. В начале каждой строки размещена Esc-последовательность, состоящая из символов '\x1B'. Если вы переведете 16-ричное значение x1B в 10-чный формат, то получите 27 – ASCI -код клавиши Esc. Именно по наличию данных символов терминал распознает управляющие последовательности. Затем идут символы, определяющие команду управления. В приведенном примере первая команда 2J заставляет терминал очистить экран, сохраняя текущее положение курсора.

Данную команду терминалу можно передать и посредством программы echo, поддерживаемой большинством программных оболочек. Например, введите в строке приглашения консоли следующую команду (MS Windows не поддерживает данный механизм управления):

 

>> echo –e "\x1B[2J"

 

Экран будет очищен, а строка приглашения будет сформирована ниже позиции ранее осуществленного ввода.

Поддерживается несколько способов для задания Esc -последовательности, определяя начальные символы следующим образом: \x1B, \033, \e. Все три способа задания Esc -последовательности эквивалентны.

Формат для большинства Esc -последовательностей:

 

\ESC[ <символ(-ы) режима>n1;n2…[<Замыкающий(-ие) символ(-ы)> буква

 

Данный формат позволяет передать в одной строке несколько управляющих команд. Так в приведенном примере в строке "\x1B[34;46mProgramming\x1B[0m" присутствуют две команды 34 – установить синий цвет символов, и 46 – установить голубой цвет фона. Эти команды влияют на свойство выводимого текста.

Замечание: изменяя стандартные настройки терминала не забывайте явным образам возвращать их в значения, заданные по умолчанию, для этого используется команда '\x1B[0m'. Две следующий команды, вводимые в консоли, продемонстрируют вам данное свойство терминала:

 

>> echo –e "\x1B[1mHello"

>> echo –e "\x1B[0mBye-bye."

 

Для работы в данном разделе вам потребуются следующие группы простых Esc -последовательностей:

∙ очистка экрана;

∙ управление атрибутами отображения символов;

∙ перемещение курсора по экрану терминала;

∙ скроллинг – прокрутка содержимого экрана.

 

Поддерживаются следующие команды для очистки экрана:

\x1B[0J – очистить от курсора до конца экрана;

\x1B[1J – очистить экран от начала, до позиции курсора;

\x1B[2J – очистить весь экран;

\x1B[0K – от курсора до конца строки;

\x1B[1K – очистить от начала строки до позиции курсора;

\x1B[2K – очистить всю строку.

 

Таким образом, использую Esc -последовательности, можно создать собственные макроопределения, позволяющие, например, очищать окно терминала:

 

#define clrscr1() printf("\e[2J")

#define clrscr2() std::cout<<"\033[2J"

 

Управление атрибутами выводимых символов (часть команд):

0 – сбросить все атрибуты в их значения по умолчанию;

1 – установить жирный шрифт;

2 – установить более яркий (имитированное цветом на цветном дисплее);

4 – установить подчеркивание;

5 – включить мерцание;

7 – включить режим инвертированного видео;

21 – включить режим нормальной интенсивности;

22 – выключить режим нормальной интенсивности;

24 – выключить подчеркивание;

25 – выключить мерцание;

27 – выключить инвертированное видео;

30 – установить черный цвет символов;

31 – установить красный цвет символов;

32 – установить зеленый цвет символов;

33 – установить коричневый цвет символов;

34 – установить синий цвет символов;

35 – установить сиреневый цвет символов;

36 – установить голубой цвет символов;

37 – установить белый цвет символов;

38 – включить подчеркивание, установить цвет символов по умолчанию;

39 – выключить подчеркивание, установить цвет символов по умолчанию;

40 – установить черный цвет фона;

41 – установить красный цвет фона;

42 – установить зеленый цвет фона;

43 – установить коричневый цвет фона;

44 – установить синий цвет фона;

45 – установить сиреневый цвет фона;

46 – установить голубой цвет фона;

47 – установить белый цвет фона;

49 – установить цвет фона по умолчанию.

 

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

 

# filename: colors.h

#ifndef __COLORS__

#define __COLORS__

/* Foregrond */

#define RST "\x1B[0m"

#define KRED "\x1B[31m"

#define KGRN "\x1B[32m"

#define KYEL "\x1B[33m"

#define KBLU "\x1B[34m"

#define KMAG "\x1B[35m"

#define KCYN "\x1B[36m"

#define KWHT "\x1B[37m"

 

#define FRED(x) KRED x RST

#define FGRN(x) KGRN x RST

#define FYEL(x) KYEL x RST

#define FBLU(x) KBLU x RST

#define FMAG(x) KMAG x RST

#define FCYN(x) KCYN x RST

#define FWHT(x) KWHT x RST

 

#define BOLD(x) "\x1B[1m" x RST

#define UNDL(x) "\x1B[4m" x RST

 

#endif /* __COLORS__ */

# END of file -----------------

 

# filename: color_testing_01.cpp

#include <iostream>

#include "colors.h"

int main() {

std::cout<<FGRN("I`m green.")<<std::endl;

std::cout<<BOLD(FRED("I`m red-bold"))<<std::endl;

return 0;

}

# END of file -----------------

 

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

 

# filename: color_testing_01.cpp

#include <iostream>

#include <string>

// constant strings - константные строки

const std::string red("\x1B[0;31m");

const std::string green("\x1B[1;32m");

const std::string yellow("\x1B[1;33m");

const std::string cyan("\x1B[0;36m");

const std::string magenta("\x1B[0;35m");

const std::string reset("\x1B[0m");

 

int main() {

std::cout << red << "Hello" <<reset

   << yellow << " World" << reset << std::endl;

return 0;

}

# END of file -----------------

 

Управление перемещением курсора по экрану консоли:

\x1B[nA – перемещение курсора вверх на n строк;

\x1B[nB или \x1B[ne – перемещение курсора вниз на n строк;

\x1B[nC или \x1B [na – перемещение курсора вправо на n позиций;

\x1B[nD – перемещение курсора влево на n позиций;

\x1B[nE – перемещение курсора в начало строки и на n строк вниз;

\x1B[nF – перемещение курсора в начало строки и на n строк вверх;

\x1B[n1;n2f или \x1B[n1;n2H – перемещение курсора переместить в позицию n 1 и строку n 2;

\x1B[nZ – перемещение курсора на n табуляций назад (как Tab, но в обратную сторону);

\x1B[n – перемещение курсора в той же строке в позицию n;

\x1B[nd – перемещение курсора в той же позиции в строку n;

\x1BM – перемещение курсора сдвинуть курсор на строчку вверх, если он был в самой верхней строке, то сдвинуть содержимое экрана на строчку вниз (то же самое, что делает NewLine, только "вверх ногами").

 

Скроллинг:

\x1B[nL– вставить n пустых строк (те, что были - раздвинуть);

\x1B[nM – удалить n строк (те, что остались - "схлопнуть");

\x1B[nP – удалить n знаков в строке (те, что остались - "схлопнуть");

\x1B[n@ – вставить n знаков в строку (те, что были - раздвинуть);

\x1B[nS – "прокрутить" содержимое экрана на n строк вверх;

\x1B[nT – "прокрутить" содержимое экрана на n строк вниз.

 

Замечание: здесь приведены далеко не все возможности управления символьным выводом в консоли. Дополнительную информацию вы можете найти в соответствующих справочных руководствах.

 

ЛАБОРАТОРНАЯ РАБОТА №1

Задания для самостоятельной работы

  1. Запустите терминал. Определите название используемого командного интерпретатора.
  2. Ознакомьтесь с встроенной справочной системой (man). Изучите способы получения контекстной справочной информации.
  3. Изучите базовые команды для навигации по файловой системе и манипуляции с файлами: ls, pwd, cd, cp, rm, mv, mkdir.
  4. Изучите базовые команды для управления вывода на экран: cat, more, less, pg.
  5. Изучите справку по команде more. Опишите алгоритм ее работы и используемые механизмы. Создайте функционально близкий функции more аналог средствами языка С ++. Сравните работу базовой и созданной функции. Сделать выводы.
  6. Изучите справку по команде cat. Описать алгоритм ее работы и используемые механизмы. Создать функционально близкий функции more аналог средствами языка С++. Сравнить работу базовой и созданной функции. Сделать выводы.

 



Поделиться:


Последнее изменение этой страницы: 2021-06-14; просмотров: 177; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.242.223 (0.007 с.)