Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
39.74 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> unixoidto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Файл /dev/mem в шестнадцатеричном редакторе

Чтение man'а по ptrace

элементарно, но вместе с этим блокируются

«наводка»), или, попросту говоря, перечень

атакуемой библиотеки на диске (то есть ее

и многие полезные программы (в частности,

путей к ранее найденным библиотекам. Это

«заражение»).

X'ы), так что остается только разграничение

не текстовый формат, да к тому же доступный

Все сказанное выше относится главным

доступа к /dev/mem с ведением списка «дове-

для модификации одному лишь root'у, так что

образом к Linux. У BSD-систем порядок поиска

ренных» лиц, которые к нему могут обращать-

не будем на нем подробно останавливаться.

динамических библиотек немного отличается,

ся, что отчасти реализовано в OpenBSD.

Лучше посмотрим на файл /etc/ld.so.config,

хотя суть остается той же:

Тем не менее, в общем случае надежной защиты

который задает порядок поиска динамических

• анализируется переменная окружения

от внедрения через /dev/mem нет и не будет!

библиотек и в свежеустановленном Knoppix

LD_RUN_PATH;

Успокаивает лишь тот факт, что доступ к нему

выглядит так: /lib, /usr/lib, /usr/X11R6/lib, /usr/

• если нужной библиотеки там нет, анализирует-

имеет только root.

i486 linuxlibc1/lib, /usr/local/lib, /usr/lib/mozilla.

ся переменная LD_LIBRARY_PATH;

 

Разумеется, модифицировать файл /etc/ld.so.

• при наличии секций DT_RUNPATH/DT_RPATH,

dl_load—матвтрихода

config может только root, зато читать его может

поиск происходит в них, причем DT_RUNPATH

Практически все приложения (за исключением

любой желающий, а для успешной атаки боль-

имеет приоритет перед DT_RPATH;

небольшого круга системных утилит) исполь-

шего и не надо! В частности, чтобы похачить

• библиотеки ищутся в общепринятых катало-

зуют динамически загружаемые библиотеки,

Mozilla, достаточно поместить библиотеку-

гах: сначала в /lib, потом в /usr/lib;

которые также могут быть использованы для

спутник (термин пришел из MS-DOS) в одну из

• если существует файл /etc/ld.so.conf, за-

внедрения в чужое адресное пространство.

вышележащих директорий. Тогда она будет

грузчик просматривает все упомянутые в нем

Самое простое — взять готовую библиотеку и

загружена первой, и спутнику остается только

каталоги.

подменить ее своей, но это слишком заметно,

похозяйничать внутри чужого адресного про-

Изменение переменных окружения — еще один

да и как-то по-пионерски. Это не наш метод.

странства, после чего благополучно ретиро-

возможный способ атаки, но, увы, доступный

Поэтому обратимся к странице справочного

ваться, загрузив оригинальную библиотеку и

одному лишь root'у, да к тому же слишком

руководства ld.so (в Linux) или ld (в FreeBSD).

передав ей управление.

 

заметный. Но в некоторых случаях он просто

Оттуда мы узнаем, что порядок поиска ди-

Вот только на этом пути нас ждут две большие

незаменим (если все остальные попытки атаки

намических библиотек — очень интересная

проблемы. Первая заключается в том, что

закончились крахом).

штука и в Linux системный загрузчик, сосре-

создать новые файлы в каталогах /lib, /user/lib

 

доточенный в файлах ld.so и ld-linux.so*, в

и т.д. может только root, а его еще как-то запо-

Защита

общем случае поступает так (а в не общем

лучить надо. Однако анализ показывает, что

Защититься от атак этого типа очень просто.

— как ему скажет утилита ldconfig, смотри

файл /etc/ld.so.config зачастую содержит пути к

Достаточно убедиться, что во все «библио-

man ldconfig):

несуществующим каталогам (в данном случае

течные» каталоги писать может только root и

• если в ELF-файле присутствует секция

это /usr/i486 linuxlibc1/lib), которые может

что файл /etc/ld.so.conf не содержит путей к

DT_RPATH с именем/путем к динамической

создавать кто угодно, помещая в них что угодно!

несуществующим каталогам. Тем не менее,

библиотеке и такая библиотека по данно-

Прежде чем открывать на радостях пиво,

несмотря на кажущуюся простоту, достаточно

му пути действительно обнаруживается,

следует решить вторую проблему — скор-

многие системы в конфигурации по умолчанию

то подключается именно она, в противном

ректировать или очистить кэш в лице файла

могу быть легко атакованы.

случае осуществляется поиск в директории

/etc/ld.so.cache, к которому опять-таки имеет

 

DT_RUNPATH (если есть);

доступ только root. Однако кэш на то и кэш,

Заключение

• если атрибуты setuid/setgid сброшены,

чтобы хранить не все, а лишь последние най-

За рамками статьи осталось множество

анализируется переменная окружения

денные библиотеки. Что мы делаем: грузим

интересных способов внедрения (в частности,

LD_LIBRARY_PATH, содержащая пути к ди-

все библиотеки, которые только установле-

директория /proc и ее содержимое), однако

намическим библиотекам, которые там могут

ны в системе (за исключением «нашей»),

одним хвостом всего ведь не охватишь, верно?

быть или… не быть;

в результате чего «нашей» библиотеки в

Главное для нас было не собрать огромную

• если же их там нет, загрузчик как последнее

/etc/ld.so.cache очень скоро уже не окажется,

коллекцию способов внедрения (многие из

средство использует пути по умолчанию: /lib, а

она будет взята не из /usr/lib/mozilla, а из

которых быстро устаревают, превращаясь в

затем /usr/lib;

/usr/i486 linuxlibc1/lib!

 

антиквариат), а дать толчок к новым идеям,

• если требуемой библиотеки нет ни в одном из

Но что делать, если в /etc/ld.so.config отсутс-

показать, что *nix-системы защищены намного

вышеперечисленных мест, то это облом!

твуют несуществующие пути?! Добывать root'а

слабее, чем это принято считать, и что, не-

Для ускорения поиска загрузчик использует

любой ценой и размещать «свою» библиотеку в

смотря на тщательно продуманную пол итику

файл /etc/ld.so.cache, содержащий таблицу

/lib или /usr/lib. Во всяком случае, это намно-

безопасности, концептуальные дыры в ней

хинтов (от английского «hint» — «подсказка»,

го менее заметно, чем прямая модификация

все-таки есть.z

xàêåð 03 /99/ 07

/ 119

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

 

 

w Click

to

 

 

 

 

unixoid

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Tips'n'tricks«j1m»

.ru

ТРюки и советы юниксоиду

Здравствуй,доблестный юниксоид!Чтопривело тебянастраницунашей скромнойрубрики?Жаждешьлитыширокихзнанийилихочешьполучить конкретныйответнасвой вопрос?Аможетбыть,ты простолистаешьжурнал, стояуприлавкакнижного ларька?Влюбомслучае тебенестоитпереворачиватьстраницу,таккакты рискуешьпропуститьтакие интересныевещи,как магическиеспособности шелловксокращениювсего ився,описаниевкусностей новойверсииvim,список самыхполезныхклавиатурныхсокращенийFirefoxи оптимизирующиевозможностикомпилятораgcc.

Firefox

Открыть сайт в новом табе:

Alt+Enter

Перейти к адресной строке:

Ctrl+L

Прекратить загрузку страницы:

Ctrl+R

Изменить размер шрифта (меньше / больше):

Ctrl+'-'

Ctrl+'+'

Переход между табами:

Ctrl+PageUp

Ctrl+PageDown

Закрыть таб:

Ctrl+F4

Добавить страницу в Закладки:

Ctrl+D

/ 120

Shell

Поменять местами два символа:

Ctrl+t

Поменять местами два слова:

Esc+t

Перевести слово в верхний регистр:

Esc+u

Перевести слово в нижний регистр:

Esc+l

Вывести список возможных автодополнений:

Esc+?

Магия клавиши <Tab> («2Tab» — это двойное нажатие клавиши <Tab>):

$ 2 Tab —показатьвсевозможныекоманды; $ / 2Tab — показать структуру каталога «/ »; $ * 2Tab — показать все подкаталоги;

$ ~ 2Tab — показать всех пользователей из 

/ etc / passwd;

$ $ 2Tab — показать все переменные окружения;

$ @ 2Tab —показать содержимое / etc / hosts.

Сокращение путей в zsh: ~ — домашний каталог;

~user — домашний каталог пользователя user;

~+ — текущий каталог; ~- — предыдущий каталог;

=команда — полный путь до бинарника команды.

Назначить низкий приоритет процессу: $ renice 19 p PID

Ftp-клиент, встроенный в zsh:

$ zmodload zsh / zftp — загружаем модуль zftp;

$ zftp open ftp.kernel.org — под-

ключаемся к серверу;

$ zftp login anonymous "" —

регистрируемся;

$ zftp binary — переходим в бинарный режим передачи файлов;

$ zftp cd pub / linux / kernel / v2.6

— переходим в нужный каталог;

$ zftp get a.tar.bz2 > b.tar.bz2

— получаем файл;

$ zftp close — закрываем соединение.

юниксоида

Vim7

Включить проверку орфографии:

: set spell

Сменить язык проверки орфографии:

: set spelllang=ru

Проверка орфографии:

]s —перейти к следующему «неправильному слову»;

[s — перейти к предыдущему слову; z= — посмотреть возможные варианты; zg —добавить слово в словарь;

zug — отменить последнее добавление в словарь.

Табы:

:tabnew [имя файла] — открыть новый таб;

:tabc — закрыть таб;

gt — перейти к следующему табу; gT — перейти к предыдущему табу; : tabs — список всех табов.

Ветви отмены:

:earlier 1h — откат на час назад;

:later 1h — на час вперед;

:undolist — история;

:g- — предыдущее состояние;

:g+ — следующее состояние.

Gcc

Оптимизация:

-O — базовая оптимизация, повышает скорость исполнения программы;

-O2 — стандартный уровень оптимизации, несущественно повышает скорость по сравнению с «-O»;

-O3 — экстремальная оптимизация через нарушение стандартов;

-march=семейство_процессоров — за-

точка под конкретный процессор (автоматически устанавливает «-mtune»).

-pipe— использовать каналы вместо создания временных файлов, снижает время компиляции (заметно только на медленных машинах). z

xàêåð 03 /99/ 07

III МЕСТО. USB КОЛОНКИ
2.1 ROVERMATE DIGI

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

o

РОЖДЕННЫЙ

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

В ОГНЕ

ЖУРНАЛ ХАКЕР И КОМПАНИЯ ROVERCOMPUTERS ОБЪЯВЛЯЮТ КОНКУРС. У ТЕБЯ ЕСТЬ ШАНС ВЫИГРАТЬ ОДИН ИЗ ТРЕХ

КРУТЫХ ПРИЗОВ ОТ КОМПАНИИ ROVER, А ТАК ЖЕ БИЛЕТЫ НА ЕДИНСТВЕННЫЙ КОНЦЕРТ САМОЙ ГРОМКОЙ ГРУППЫ В МИРЕ MANOWAR, КОТОРЫЙ СОСТОИТСЯ НА СЦЕНЕ ДС ЛУЖНИКИ 7 АПРЕЛЯ 2007 Г.

ЧТОБЫ СДЕЛАТЬ ЭТО, ТЕБЕ НАДО РЕШИТЬ ОДНУ ЗАДАЧКУ. ДЕЛО В ТОМ, ЧТО ОДИН ЗНАКОМЫЙ ХАКЕР CRAZYMETAL, ПОМЕШАННЫЙ НА БЕЗОПАСНОСТИ, ЗАБЫЛ НАПРОЧЬ ПАРОЛЬ ОТ СВОЕГО E-GOLD КОШЕЛЬКА И

НЕ МОЖЕТ СНЯТЬ ОТТУДА ДЕНЕГ, ЧТОБЫ ПОЙТИ НА КОНЦЕРТ ЛЮБИМОЙ ГРУППЫ MANOWAR. ПОСКОЛЬКУ CRAZYMETAL – КРУТОЙ ХАКЕР, ОН ЗАШИФРОВАЛ СВОЙ ПАРОЛЬ

САМОПАЛЬНЫМ АЛГОРИТМОМ, КОТОРЫЙ ТОЖЕ ЗАБЫЛ. НУЖНО ПОМОЧЬ ПРИЯТЕЛЮ.

ВОТ ЕГО ШИФРОВАННЫЙ ПАРОЛЬ: KSHW$SJ${EV

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

I МЕСТО. КОММУНИКАТОР ROVERPC ROVERPC S5

II МЕСТО. ПЛЕЕР

ROVERMEDIA M5

РАСШИФРУЙ ЭТУ СТРОКУ И ПРИСЫЛАЙ ОТВЕТ НА ROVER@REAL.XAKEP.RU. ПЕРВЫЕ ТРОЕ ПРАВИЛЬНО ОТВЕТИВШИХ ПОЛУЧАТ КРУТЫЕ ПРИЗЫ ОТ КОМПАНИИ ROVERCOMPUTERS И БИЛЕТЫ НА КОНЦЕРТ ГРУППЫ MANOWAR.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Alek Silverstone

/ aleksi@pisem.net /

Delphi

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ICQ-бот дляхакера

Тетя Ася — универсальная помощница

У каждого интернетчика есть аська. Все пользуются ей: кто-то редко, кто-то всегда в онлайне. В основном с ее помощью обмениваются сообщениями, гораздо реже —

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

Установка

Думаю, начать нужно с регистрации нового номера для бота. Заходим на https://www.icq. com/register и отвечаем на несколько пикантных вопросов. Затем необходимо найти на нашем диске или в интернете сам компонент TICQclient. Распаковываем архив в отдельную папку (например, TICQclient) и открываем файл

Component\ICQ.dpk. Если ты качал компонент из инета, то перед компиляцией и установкой исходники нужно пропатчить. Дело в том, что компонент довольно старый, а ICQ Inc. некоторое время назад поменяла протокол в надежде побороть альтернативные мессенджеры. Обновления для них появились уже на следующий день, а чуть позже хорошие люди

нашли решение и для этого компонента. Итак, тыкаем два раза на ICQclient.pas, находим строчку «FUIN := GetTLVStr(@pkt, T);» и меняем на нижеследующий блок:

Патчдляисходников

T := GetInt(@pkt, 2);

if T = $008e then // TLV(142

/ 122

xàêåð 03 /99/ 07

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Записная книжка

[0x008E]) begin

Inc(pkt.Len, GetInt(@pkt, 2)); FUIN := GetTLVStr(@pkt, T); end else

if T = $0001 then // TLV(1 [0x0001])

FUIN := GetWStr(@pkt);

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

Итак, будем считать, что нормальный компонент мы тем или иным способом добыли. Сохраняем, закрываем окно с кодом, жмем «Install». Компонент установится на вкладку «Samples». Теперь создаем новый проект и в его свойствах,

в разделе «Directories» в строке «Search path», указываем путь к папке TICQclient\Component.

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

Основы

Для начала перечислю самые основные свойства, методы и события компонента, без которых нам никак не обойтись (смотри врезку).

Для наших целей нам хватит и описанного (на списки видимости/невидимости, авторизацию и т.д. можно и забить). Разумеется, ничто не мешает тебе потом использовать все возможности компонента для создания более мощного кода: отправки файлов по

прямому соединению, работы через прокси и т.д. Для примера мы напишем бот-шлюз. После включения по нашей команде он будет

пересылать все полученные от нас сообщения на указанный номер. Разумеется, то же самое будет происходить с сообщениями нашего собеседника. Фишка в том, что он не увидит твоего номера, а только номер бота. Итак, кидаем на форму компонент, устанавливаем свойства UIN и Password. Дважды щелкаем по форме и пишем вот такой обработчик:

MasterUIN:='<номер «хозяина»>'; work:=false;

ICQclient1.Login;

Поднимаемся чуть выше и под строкой «Form1: TForm1;» пишем:

OpponentUIN, MasterUIN:string; work:boolean;

Это переменные для хранения номера собеседника и хозяина бота, а также статуса работы. Теперь начнем писать обработку входящих сообщений — событие OnMessageRecv. Сначала

команда создания соединения:

Созданиеканаласвязи

if (pos('/start ',Msg)=1)and(UIN =MasterUIN) then begin delete(Msg,1,length('/start ')); while pos(#10,Msg)<>0 do delete(Msg,pos(#10,Msg),1); while pos(#13,Msg)<>0 do delete(Msg,pos(#13,Msg),1); OpponentUIN:=Msg; ICQclient1.SendMessage(StrToInt( MasterUIN),'Channel created.'); work:=true;

exit; end;

Бот, получив от хозяина команду вида «/start <номер>», сохранит номер собеседника, отправит подтверждение хозяину и изменит статус работы. Два цикла нужны специально для официального клиента, который любит в конце сообщения вставлять перевод строки. Мы его вырезаем, чтобы выделить номер.

Код записной книжки

if UIN<>MasterUIN then exit;

send:='';

if FileExists('notes.txt') then fs:=TFileStream.Create('notes. txt',fmOpenReadWrite)

else fs:=TFileStream.Create('notes. txt',fmCreate);

if pos('/show',Msg)=1 then begin fs.Seek(0,soFromBeginning); for i:=1 to fs.Size do begin fs.Read(ch,1);

if ch<>#0 then send:=send+ch else

begin ICQclient1.SendMessage(StrToInt (MasterUIN),send);

send:=''; end; end;

end else begin fs.Seek(0,soFromEnd); send:=DateTimeToStr(now)+#10#1 3+Msg+#10#13#0; fs.Write(send[1],length(send)); ICQclient1.SendMessage(StrToInt (MasterUIN),'Note saved.'); end;

fs.Free;

Фрагмент обработки команды завершения соединения полностью аналогичен:

Разрывсвязи

if (pos('/stop',Msg)=1)and(UIN=M asterUIN) then

begin ICQclient1.SendMessage

(StrToInt(MasterUIN),'Channel

xàêåð 03 /99/ 07

/ 123

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Общаемся…

destroyed.');

work:=false;

exit;

end;

Ипоследниестрочки—пересылкасообщений:

Пересылка

if not work then ICQclient1. SendMessage(StrToInt(UIN),'Not connected.')

else

if UIN=MasterUIN then ICQclient1. SendMessage(StrToInt (OpponentUIN),Msg)

else ICQclient1.SendMessage (StrToInt(MasterUIN),Msg);

Тут сначала делается проверка статуса (если соединение разорвано, то отправляется сообщение об ошибке), затем определяется отправитель сообщения, которое пересылается другому собеседнику.

Вот и все! 5 минут — и твой персональный шлюз готов! Дорабатывать его можно бесконечно: разрешить пользоваться им всем, добавить бан-списки, разрешить передачу файлов… Все в твоих руках.

Записнаякнижка

Дом,работа,интернет-кафе…Ивездесвой клиентаськи.Аеслинужносохранитьважное сообщение?Записатьнабумажку?Естьрешение

получше:написатьсвоегобота—всюдудоступную записнуюкнижку.Онбудетсохранятьполученные сообщенияипокомандепоказыватьих.Нравится идея?Создавайновыйпроект,располагайкомпонент,выставляйсвойстваUINиPassword.Обра- ботчикформы—почтикаквпрошломпримере:

MasterUIN:='<номер «хозяина»>';

ICQclient1.Login;

Теперьбудемобрабатыватьвходящиесообщения.ВсобытииOnMessageRecvобъявляем четырепеременные:

fs:TFileStream; i:integer; ch:char; send:string;

Этофайловыйпоток,кудамыбудемсохранять заметки,счетчикдляцикла,считанныйизпотока символибуфердляотправки.Принципработы такой:получаемсообщениятолькоотхозяина; еслиполученосообщение«/show»,товыводим всезаметки;иначесохраняемсообщение.Самкод смотринаврезке.Внемвкачестверазделителя заметокиспользуетсясимволскодом0.Призаписи мыдобавляемсимволыпереводастроки.

Remotecontrol

Теперь сделаем кое-что посерьезнее: напишем программу для удаленного управления компом по аське. Только не надо сразу думать о троянах,

Свойства компонента

Свойство UIN — номер аськи для бота;

свойство Password — пароль от номера;

свойство ConverToPlaintext опре-

деляет, нужно ли преобразовывать полученные RTF-сообщения в обычный текст; для того чтобы можно было общаться с ботом при помощи официального клиента ICQ, нужно установить значение true;

метод Login — подключение к серверу;

метод Disconnect — отключение от сервера;

метод SendMessage(UIN, msg) — от-

правка сообщения msg на номер UIN; событие MessageRecv — вызывается при получении сообщения.

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

скольких сегментов. Находясь в одном из них, я могу по аське дать команду своему компу, находящемуся в другом, пинговать определенный хост. Пингуя его с разных сторон-сегментов, можно быстро локализовать проблему. Удобно? Еще как! Сейчас я покажу тебе, как можно просто создать программу, превращающую обычный клиент аськи в некоторое подобие удаленной консоли.

Создай новый проект, кинь на форму компонент, установи свойства UIN и Password. Теперь поищи на диске модуль uCmdPipe, написанный мной, скопируй его в папку с проектом и добавь в uses. Этот модуль берет на себя все основные функции по созданию консоли и связи ее с пайпами. Теперь найди в коде строчку «var Form1:TForm1» и напиши под ней:

MasterUIN:string; p:TCmdPipe; cmd:shortstring;

Первая переменная будет хранить UIN хозяина бота, вторая — класс нашей консоли, а третья — путь к cmd.exe. Теперь тыкаем 2 раза в форму и пишем обработчик ее создания:

MasterUIN:=’ <номер «хозяина»>’;

ICQclient1.Login;

/ 124

xàêåð 03 /99/ 07

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Пингуем ya.ru

SetLength(cmd,255);

GetEnvironmentVariable('ComSpec'

,@(cmd[1]),255);

Первой строчкой мы задаем номер хозяина (впиши свой), потом коннектимся и последними двумя записываем значение переменной

противном случае пишем в созданную ранее. Класс TCmdPipe создает только одну консоль и перед любой операцией делает проверку ее существования, что избавляет нас от лишних проблем. Все его методы смотри в комментариях в модуле uCmdPipe. Теперь нам нужно отослать результат команд обратно. Есть

«Другимвариантомможетбыть использованиеразвивающей сясейчасбиблиотекиICQkid2

—удобнойкроссплатформенной реализациипротоколаICQ.Опять жехедерынаписанынаС++»

среды ComSpec, содержащей путь к исполняемому файлу командного интерпретатора, в нашу переменную cmd. Далее пишем обработку входящих сообщений (OnMessageRecv):

if UIN<>MasterUIN then exit;

if pos('/cmd',Msg)=1 then p.CreateCmdPipe(cmd)

else p.WriteStringCmdPipe(Msg);

Тут мы проверяем номер отправителя (принимаем сообщения только от хозяина) и анализируем текст. Если в тексте содержится «/cmd», то создаем новую консоль, в

одна тонкость — мы никогда не можем быть уверены во времени прихода данных в пайп. Как сказал Zero Ice, «приход данных — это великая тайна». Поэтому мы будем делать его в отдельном потоке. Итак, кидаем на форму TTimer, устанавливаем интервал поменьше, а свойство Enable — в true и пишем обработчик

OnTimer:

if p.DataPresent then begin

send:=p.ReadStringCmdPipe;

ICQclient1.SendMessage(StrToInt

(MasterUIN),send);

end;

xàêåð 03 /99/ 07

IcqKid2

Мы проверяем наличие данных в пайпе (и заодно самого пайпа) и, если они есть, считываем и отсылаем. В этом же обработчике нужно объявить переменную send типа string. Заметил,каквсепросто?Всегонесколькострочек

—имынаписалиоченьполезныйкод.Авсеиз-за продуманностикомпонентаимоегомодуля.

Альтернативы

УкомпонентаTICQclientестьоднонеоспоримое преимущество—простота.Главныйжеегонедо- статоксостоитвтом,чтоонбольшенеподдерживается.Вслучаеизмененияпротоколаниктоне гарантируетвыпускпатча.Хотя,какпоказывает практика,толковыхлюдей,использующихего, предостаточно,ионивсостояниинаписатьпатч иподелитьсяимсовсеми.Нотогдатебевручную нужнобудетизменятьисходник.Естьальтер- натива—использоватьбиблиотекуIcqOscarJ. ЭтоодинизосновныхкомпонентовMirandaIM, доступныйвисходныхкодах,исдокументацией.Онрегулярнообновляется.Тыможешь реализоватьвсвоейпрограммеавтоматическую загрузкубиблиотекиссайтапроекта.Воттолько заголовочныемодулинаписанынаС++,такчто придетсяпосидетьпопереводить.Полезная программкаc2pas32поможеттебевэтом,хотяи сделаетдалеконевсюработу.

Другимвариантомможетбытьиспользование развивающейсясейчасбиблиотекиICQkid2

—удобнойкроссплатформеннойреализации протоколаICQ.ОпятьжехедерынаписанынаС++. Вот и все. Основы я тебе рассказал. Теперь ты можешь сделать такого бота, какого захочешь. Главное — идея, а реализовать ее будет несложно. Удачи! Будут проблемы — пиши мне, адрес указан в начале статьи.

Иеще—хотелосьбысказатьбольшоеспасибоче- ловекупоимениZeroIceзапомощьспайпами.z

/ 125

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Deeoni$

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

пальная

 

о

 

 

 

 

ам

 

 

 

 

ия

С

 

 

 

 

 

 

 

 

 

 

ф

 

 

 

 

гра

 

 

 

 

о

 

 

крипт

 

 

C\C++

 

 

 

 

 

 

Реализациякриптографическогоалгоритма

AES(AdvancedEncryptionStandard)

Учебноезаведение:Самарский Технический Университет, факультет ФМФ , 3 курс. Предмет:Компьютерная безопасность

Задание:разработать библиотеку классов, реализующих криптографический алгоритм AES (Advanced Encryption Standard). Предусмотреть следующие варианты шифровки/дешифровки: а)шифрация данных из файла в файл; б)дешифрация данных из файла в файл;

в)дешифрация данных из файла в память.

Ключ шифрования должен задаваться строкой, содержащей последовательность шестнадцатеричных цифр. Длина ключа — 128, 192 или 256 бит.

Сегодня в нашей недавно открытой подрубрике мы постараемся решить очередную лабораторную работу, которую прислал нам некий Николай П. из города на Неве. Итак, приступим.

Введениевпроблему

AES, а 26 мая 2002 года AES был объявлен стан-

запрещенные к публикации данные об исследо-

Advanced Encryption Standard (AES), также

дартом. По состоянию на 2006 год AES является

вании алгоритмов-кандидатов.

известный как RIJNDAEL, — это симмет-

одним из самых распространенных алгоритмов

Чтобы быть утвержденным в качестве стандарта,

ричный алгоритм блочного шифрования

симметричного шифрования в мире.

алгоритм должен был:

(размер блока — 128 бит, ключ — 128/192/256

 

1. реализовать шифрование частным ключом;

бит), выбранный в ходе конкурса и принятый в

История

2. представлять собой блочный шифр;

качестве американского стандарта шифрова-

В далеком 1998 году NIST объявил конкурс на

3. работать со 128 разрядными блоками данных

ния правительством США. Выбор был сделан

создание алгоритма, удовлетворяющего выдви-

и ключами трех размеров (128, 192 и 256

с расчетом на повсеместное использование

нутым институтом требованиям. Он опублико-

разрядов).

и активный анализ алгоритма, как это было с

вал все несекретные данные о тестировании

Дополнительно кандидатам рекомендовалось:

его предшественником DES. Государственный

кандидатов на роль AES и потребовал от авторов

1. использовать операции, легко реализуемые

институт стандартов и технологий США (National

алгоритмов сообщить о базовых принципах пос-

как аппаратно (в микрочипах), так и программно

Institute of Standards and Technology, NIST), пос-

троения используемых в них констант. В отличие

(на персональных компьютерах и серверах);

ле пятилетней подготовки, 26 ноября 2001 года

от ситуации с DES, NIST при выборе AES не стал

2. ориентироваться на 32 разрядные

опубликовал предварительную спецификацию

опираться на секретные и, как следствие,

процессоры;

/ 126

xàêåð 03 /99/ 07

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

>> codingto BUY

 

 

 

 

 

 

 

w Click

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

o

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Ковыряем процедуру дешифровки в демо-программе

А вот зашифруем по-нашему!

3. не усложнять без необходимости структуру

файлавпамять.Собственно,взаголовочном

шифра, для того чтобы все заинтересованные

файленетничегоособенного,поэтомупросто

стороны были в состоянии самостоятельно про-

приведуеголистингскомментариями:

вести независимый криптоанализ алгоритма

 

и убедиться, что в нем не заложено каких-либо

Листинг1

недокументированных возможностей.

 

Кроме того, алгоритм, претендующий на роль

#pragma once

стандарта, должен распространяться по всему

 

миру на неэксклюзивных условиях и без платы

#include <string>

за пользование патентом.

#define BLOCK_LEN 16

Перед первым туром конкурса в NIST поступило

 

21 предложение, 15 из которых соответствовали

class CAes

выдвинутым критериям. Затем были проведены

{

исследования этих решений, в том числе свя-

public:

занные с дешифровкой и проверкой произво-

CAes(void);

дительности, и получены экспертные оценки

~CAes(void);

специалистов по криптографии. В августе

/*

1999 года NIST объявил пять финалистов, кото-

Расшифровывает файл в память.

рые получили право на участие во втором этапе

Определяет размер файла и выделя-

обсуждений.

ет память в buffer.

2 октября 2000 года NIST сообщил о своем

Возвращает число расшифрован-

выборе — победителем конкурса стал алгоритм

ных байт или число <= 0, в случае

RIJNDAEL (произносится как «райндол»)

ошибки.

бельгийских криптографов Винсента Раймана

*/

и Йоана Дамана, который зарегистрирован в

static int DecryptToMemory(std::

качестве официального федерального стандар-

string fileName, std::string key,

та как FIPS 197 (Federal Information Processing

unsigned char* &buffer);

Standard).

/*

Для меня остается загадкой, зачем в россий-

Создает файл outFileName и за-

ском вузе преподают стандарты иностранных

писывает в него зашифрованное

государств. Видимо, исходят из принципа, что

содержимое inFileName.

врага надо знать в лицо :). Ладно, в общем-то,

Возвращает число зашифрованных

это не наше дело. Нам надо просто про-

байт.

граммно реализовать основу национальной

*/

безопасности США.

static int encryptFile(std::

 

string inFileName, std::string

Началоработы

 

outFileName, std::string key);

Итак,приступим.Таккакпозаданиюнамнадо

/*

былоразработатьбиблиотекуклассов,то

Расшифровывает из файла в файл

начнемсописанияэтихклассов,тоестьсзаго-

Возвращает число расшифрованных

ловочныхфайлов.Нашклассбудетиметьтри

байт

метода,которыереализуютосновныеоперации,

*/

перечисленныевзадании:encryptFile—шиф-

static int DecryptToFile(std::

рацияданныхизфайлавфайл,DecryptToFile

string inFileName, std::string

—дешифрацияданныхизфайлавфайл,

outFileName, std::string key);

DecryptToMemory—дешифрацияданныхиз

};

 

 

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

Вспомогательныйкод

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

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

госстандарт США. В этих файлах содержится куча полезных структур и алгоритмов, которые позволяют заниматься разработкой непосредственно класса, а не вникать в сложную математику AES. В большинстве случаев преподаватели сами предоставляют подобные куски кода, чтобы облегчить и без того тяжелую жизнь студента. Все эти файлы ты найдешь (а при желании и детально ознакомишься с их содержанием) на нашем DVD.Там как раз описаны две наши вспомогательные функции и один макрос. Все это хозяйство служит для заполнения массива псевдослучайных чисел. Непосредственно же заполнением занимается эта функция:

void FillRand( char *buf, const int len)

Как ее использовать, ты узнаешь чуть позже. Макрос RAND(a,b) вычисляет псевдослучайное число, а функция cycles считывает число из таймера процессора. Все это войдет в cpp-файл с реализацией класса. Также нам надо включить еще три заголовочных файла:

#include "caes.h" #include "aes.h" #include <stdio.h>

xàêåð 03 /99/ 07

/ 127

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to BUY

 

>> coding

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Листинг2

// Для шифрования

void cycles(volatile unsigned __int64 *rtn)

{

#if defined(_MSC_VER)

// считываем Pentium Time Stamp Counter

__asm { cpuid rdtsc

mov ecx,rtn mov [ecx],eax mov [ecx+4],edx cpuid

}

#else

#include <time.h> time_t tt;

tt = time(NULL);

((unsigned long*)rtn)[0] = tt; ((unsigned long*)rtn)[1] = tt & -36969l;

return; #endif

}

#define RAND(a,b) (((a = 36969 * (a & 65535) + (a >> 16)) << 16) + \ (b = 18000 * (b & 65535) + (b >> 16)))

void FillRand(char *buf, const int len)

{

static unsigned long a[2], mt = 1, count = 4;

static char r[4]; int i;

if(mt) { mt = 0; cycles ((unsigned __int64 *)a); }

for(i = 0; i < len; ++i)

{

if(count == 4)

{

*(unsigned long*)r = RAND(a[0], a[1]); count = 0;

}

buf[i] = r[count++];

}

}

А теперь зашифрованный

Здесь, caes.h описывает наш класс; aes.h — один из тех файлов, что мы нашли в интернете; stdio.h — спрашивать стыдно, все и так должны знать, что это стандартный ввод/вывод в C.

Шифрованиефайла

Настало время заняться функцией шифрования. Прототип ее выглядит так:

int encryptFile( std::string inFileName, std::string outFileName, std::string secretKey)

Содержимое из файла inFileName будет шифроваться ключом secretKey и записываться в файл outFileName. Код этой функции частично представлен в листинге 3.

Весь код, к сожалению, мы привести не можем, поскольку он занял бы значительный объем статьи; полностью ты найдешь его только на нашем диске.

Здесь первым делом мы объявляем и инициализируем несколько переменных. Затем в цикле проверяем корректность введенного ключа, а поскольку передается он в функцию в виде строки, то должен содержать лишь цифры от 0 до 9 и латинские буквы от A до F. Кроме этого, дополнительно мы проверяем длину ключа. После этого открываем входной и выходной

Листинг3

int CAes::encryptFile( std::string inFileName, std::string outFileName, std::string secretKey)

{

gen_tabs(); unsigned long i = 0;

int by = 0, key_len, err = 0; const char* cKey =

secretKey.c_str(); char ch,key[32];

//указатель на символ в key const char* cp = &cKey[0];

//счетчик обработанных цифр i = 0;

while(i < 64 && *cp) {

//максимальная длина ключа

Обычный файл

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

Дешифрацияизфайлавпамять

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

— 32 байта и, следовательно, максимум 64 шестнадцатеричные цифры

ch = toupper(*cp++); if(ch >= '0' && ch <= '9')

by = (by << 4) + ch — '0';

else

if(ch >= 'A' && ch <= 'F') by = (by << 4) + ch —

'A' + 10;

//ошибка, если символ не шестнадцатеричная цифра

else

return -2;

//запоминаем байт ключа для каждой пары шестнадцатеричных цифр

if(i++ & 1) key[i / 2 — 1] = by & 0xff;

}

if(*cp) return -3;

else if(i < 32 || (i & 15)) return -4;

key_len = i / 2; int encrypted = 0;

FILE* inFile = fopen( inFileName.c_str(), "rb");

if (!inFile) return -5;

FILE* outFile = fopen( outFileName.c_str(), "wb");

if (!outFile) return -5;

/ 128

xàêåð 03 /99/ 07

 

Соседние файлы в папке журнал хакер