Необычная история становления программиста: от первых троянов до собственной программы для шифрования файлов

Обложка: Необычная история становления программиста: от первых троянов до собственной программы для шифрования файлов
6

Привет, читатель. Возможно, ты уже опытный разработчик и способен обучать других людей программированию. Может быть, ты новичок, только собираешься начать свой путь в IT и не знаешь, с чего начать (да не удержат тебя семеро). Может быть, ты системный программист и пишешь серьёзные программы для государственных предприятий военно-промышленного комплекса. Может быть, ты студентка филологического факультета местного ВУЗа и развлекаешь себя программированием простых программ на Python или JavaScript.

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

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

Первые трояны

Первый компьютер мне купили в 2007 году, когда я учился в 8 классе. Я обожаю компьютерные игры и сейчас в них тоже играю. Первыми же моими играми были Painkiller и S.T.A.L.K.E.R. Но ещё мне было интересно, как работает компьютер, что он может и чего не может.

Я мог бы начать изучение операционных систем и языка программирования Pascal, как все нормальные школьники, но меня слишком вдохновляли истории взломов, совершенных такими звездами компьютерного андеграунда, как Кевин Митник, Адриан Ламо, Джонатан Джеймс и т.д. В их руках я видел почти безграничную, свирепую, непобедимую власть, которую они обрели лишь терпением, желанием и опытом. Я считал их полубогами и хотел быть подобным им. Я был восхищен тем, как простые люди могут нажать пару клавиш и обрушить что-нибудь, да так, что мир вздрогнет.

В один из дней моей юности я открыл Internet Explorer, зашёл на Яндекс и ввел самый глупый запрос: «как создать вирус».

В интернете того времени была масса инструкций, следуя которым можно было создать почти всё, начиная от троянов и заканчивая бестелесными полиморфными сетевыми червями, вроде Code Red или SQL Slammer. После прочтения массы сомнительных и околокриминальных источников с подозрительной рекламой эротического и мошеннического содержания я решил начать с написания .bat троянов, потому что это было легче всего.

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

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

Позже я узнал про языки программирования, какими они бывают и зачем используются. Я узнал, что существует целый зоопарк операционных систем, и Windows XP — только одна из них. Я прочитал, что такое троян, червь, вирус, исходный код, дизассемблер, firewall, эксплойт, ФСБ, обыск и т.д. Со временем что-то во мне изменилось и я задумался, а смогу ли я создать что-нибудь по-настоящему полезное. Скачав первую попавшуюся пиратскую версию среды быстрой разработки приложений Delphi 7, о которой я узнал на одном из тех нехороших сайтов, я начал пробовать писать программы.

Первая программа

Первой разработанной мной программой была, насколько я помню, консольная программа для шифрования файла по паролю. Она открывала файл на чтение/запись, из которого читались данные, ксорились с паролем и записывались обратно в файл. Программа была написана так, что её исходный код лучше не видеть никому и никогда, чтобы просто не стать седым. Вот пример кода, который там реально был:

var
 fаil:  string; // да, именно fail
 kluch: string; // да, именно kluch

begin
 Readln(fаil); // не два отступа и не четыре, а один
 Readln(kluch);
 if FileExists(fаil) = True then
  begin
  // творим шифрование файла
  end
 else
 if FileExists(fаil) = False then // да, я был таким
  begin
  // пишем, что файла нет
  end;
end.

Уже и не помню, сколько файлов я испортил, пытаясь довести программу до ума. В итоге xor (сложение по модулю два) был выброшен на свалку, а выбран был алгоритм шифрования DES. Но со временем программа стала настолько сложной, что я уже сам не мог сказать, что и как в ней работает. И это в моей программе! Но меня ожидал хороший итог.

Хороший, потому что я понял свою ошибку — я не прочитал, как не надо делать, потому что это просто не пришло в голову. Мне даже не было дела до того, что до меня такие идиотские ошибки уже делали тысячи и тысячи людей! Я был невероятно некомпетентен!

Излазив сотни сайтов, я узнал про алгоритмы шифрования, какими они бывают, что такое режим шифрования и чем собственно плохи алгоритм DES и режим ECB (режим электронной кодовой книги), что такое перебор пароля, перебор ключа, криптоанализ, USA NSA и т.д. Но информации всё равно было мало, и мало настолько, что я был зол.

Как это так? В мире полно криптографических программ, а как их правильно разрабатывать, на форумах никто не знает? Да не может такого быть, думал я. Как оказалось, ещё как может.

Первый взлом программы

Первой книгой по информационной безопасности, которую я прочёл, была пиратская версия книги Криса Касперски «Техника и философия хакерских атак». Я не просто её прочел, я её «проглотил». Найдя для себя хорошего кумира, я стал читать его книги и статьи. Я прочел «Записки исследователя компьютерных вирусов», «Компьютерные вирусы изнутри и снаружи», статьи вроде «Какие следы ты оставил после себя» и т.д.

Я начал понемногу учить язык ассемблера для процессора x86, с которым познакомился благодаря отладчику уровня пользователя OllyDbg и дизассемблеру IDA Pro, который использовал в своей книге Крис. Всё, разумеется, было пиратским: и Windows XP, и IDA Pro, и всё остальное. Мне было неловко от того, что другие умеют делать из лицензионных программ пиратские, а я не умею. Я думал, что Кевин Митник уж точно знает, как взламывать программы, и захотел уметь так же.

Первый crackme (программа, созданная специально, чтобы быть взломанной) я взломал где-то за один час. Потом я взломал ещё один crackme, и ещё один, и ещё. Так я дошёл до того, что теперь мог редактировать собственноручно разработанные программы, к чему успешно перешёл. С помощью пиратской версии программы WinHex я редактировал свои программы и смотрел, что будет. Я менял значения констант, команду ADD (сложение) на команду SUB (вычитание), превращал циклы с условием в бесконечные циклы, а условные переходы JE (перейти, если равенство) в безусловные JMP.

Когда я перешёл от взломов к программированию на языке ассемблера, я написал программу, которая меняла команду ADD на SUB прямо во время исполнения, а позже процессор выполнял изменённые команды. Я понял, что теперь могу написать любую программу. Чтобы узнать, что делает такая программа, её было мало прочитать, её нужно было именно запустить. Так я открыл для себя трассировку программ (выполнение программы по одной команде).

Это было волшебно! Я могу, и могу такое! Ай да я, ай да мамин суперхакер, думал я.

Позже, поверив в себя, расправив плечи и надев чёрные очки, я начал творить то, что могло стоить мне свободы. Я решил перейти на сетевой уровень IT, но используя для этого не учебники информатики, а статьи и книги того же Криса Касперски. Я узнал, что существуют протоколы связи программ друг с другом, такие как HTTP, FTP, SMTP, POP3, как взламывают компьютеры по сети, что такое переполнение буфера в стеке с перезаписью адреса возврата, что такое «куча», DDoS атака и т.д.

На всё тех же сомнительных сайтах с нехорошей рекламой я многое прочёл про сетевые взломы, эксплойты, программы для перебора паролей, уязвимости и т.д. Я думал, что вот-вот взломаю весь мир и поставлю на колени плачущего директора ЦРУ. Я думал.

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

— Здравствуйте, вы дома пользуетесь интернетом?

— Ээээ… Да. А вы от какого-то провайдера звоните? — спросил я, и посмотрел на настенные часы, которые показывали 04:30 утра.

— Ээээ… Нет, — ответил голос в трубке и мы оба замолчали. Я первый раз в жизни услышал то, что теперь зову «ехидным молчанием», которое ужасно меня напугало! Мне показалось, что бетонные стены квартиры начали сжимать меня! Вдруг я понял, что рекламировать свои услуги ни один провайдер в выходной день, тем более в половине пятого утра, не будет. После ехидного молчания со стороны собеседника я повесил трубку. Спустя два часа я уже ехал в деревню к бабушке на первой же электричке, пытаясь предугадать, какой же срок мне грозит.

Всё обошлось, но такого опыта я не пожелаю и врагу. Я понял, что есть люди гораздо умнее меня и отрезвлять умы они умеют ещё как. Простым звонком в четыре утра. И да, я не хочу знать, кто мне звонил.

Разработка собственных программ

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

— Что я могу? О, точно. Мне нужна своя база данных, как в фильме про агентов ЦРУ.

Собственная СУБД

Сказано – сделано.

Я написал её где-то за неделю, и да, я знаю, дизайнер из меня так себе. Программе нужно было название, данное в какой-нибудь крутой корпорации, и я придумал её — Plexus. Это не база данных, а система управления базой данных (СУБД), работающая с файлами Microsoft Access, поддерживающая шифрование AES-KSM-256, хеширование MD5 и SHA-1, смену пароля пользователя перешифрованием ключа шифрования записей в базе данных, смену изображения, уничтожение данных на диске и поиск по маске.

Режим шифрования KSM я придумал сам: это тот же самый режим ECB, в котором в качестве ключа шифрования следующего блока данных используется hash (контрольная сумма) ключа шифрования предыдущего блока. Программа устанавливалась на компьютер простым копированием файлов из архива, а мне хотелось чего-то настоящего, ТруЪ, и я написал для неё установщик. Позже, когда всё было готово, я вспомнил, что забыл записать «лицензионный» ключ для единственного установщика моей же программы, что заставило меня написать keygen.

Установщик СУБД

Да, я написал генератор «лицензионных» ключей для собственной программы! А откуда, вы думали, разработчики программ берут лицензионные ключи, которые потом продают за 1500 рублей? У них есть свой keygen, а у меня его не было.

/* эта кнопка и есть весь keygen */
procedure TForm1.Button1Click(Sender: TObject);
var
  data: string;
  i, simbol: Integer;
begin
  Edit1.Clear; 
 
  data:= '';
  simbol:= RandomRange(65, 90);
 
  for i:= 1 to 49 do
  begin
    while ((simbol xor i) mod 2) <> 0 do
    begin
      simbol:= RandomRange(65, 90);
    end;
    
    data:= data + Chr(simbol);
  end;

  Edit1.Text:= data;
end;

Я снова ощутил себя вершителем судеб, пока не нашёл на форумах информацию о том, что такие программы пишут студенты 3-4 курса технических ВУЗов.

Что? Студенты? Я не какой-то там студент! Я Криса Касперски читал!

Мне было мало, и я горел страстью! Мне нужно было творить, писать, создавать! Только ООН могла мне помешать вытворять то, что я хочу. И я написал в среде Delphi 7 целую базу данных различных программ. Например, программу для «склеивания» файлов, которую я написал, пытаясь создать собственный WinRar, что, кстати, не получилось. Пародия на Bourne Shell, за которую мне ужасно стыдно до сих пор.

Программа для склеивания файлов

Программа для склеивания файлов

Программа для вычисления контрольных сумм как файлов, так и текстов, была написана за один присест, трояны-шифровальщики (на самом деле, серьёзные вайперы), программы для создания больших изображений путем «склеивания» массы маленьких, патчеры бинарных файлов, файловые шредеры и даже простой чат с клиент-серверной архитектурой, поддержкой шифрования сообщений и поддержкой ника (сетевого имени). Ещё я написал аналог программы «Поиск» для Windows XP, но это уже в прошлом.

Патчер файлов

Патчер бинарных файлов

Аналог поиска для Windows

Аналог поиска для Windows XP

В конце концов, я изрядно устал. Мне казалось, что я написал вообще всё, что можно было написать. Мне стало скучно. Мне казалось, что писать программы — это несерьёзно. Я правда так думал!

Переход на язык Си и создание программы для шифрования файлов

Я задумался, смогу ли я написать ядро операционной системы, интернет-браузер, полиморфного многовекторного червя с функционалом анонимного удалённого управления, сайт вроде «ВКонтакте»? Ответ был: нет. И я обратил внимание на язык программирования, как мне казалось, более серьёзный, сильный, взрослый, круче, чем языки Object Pascal и Delphi. Это был язык Си.

Так я начал карабкаться на ступень, на которой уверенно стоят не просто школьники, перебирающие пароли к чужим серверам, а настоящие титаны инженерной мысли мира IT вроде Эрика Реймонда, Ричарда Столлмана и Линуса Торвальдса. Как оказалось, то, что я делал раньше, скорее всего, делали и они. Но сейчас для них это просто мелочь, недостойная внимания.

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

Я даже не знал, что это такое — думать точно. Я даже не думал! Я просто делал и всё. Как карта ляжет. Изучение языка Си открыло мне глаза на настоящее программирование. Я поставил GNU/Linux Debian рядом с уже сотни раз переустановленной Windows XP, установил gcc, cppcheck, Kate и начал постигать самую серьёзную, на мой взгляд, ступень программирования.

/* Это ТруЪ код, вот и всё */
void free_global_memory(GLOBAL_MEMORY * ctx, const size_t ctx_length) {
  if (NULL != ctx->vector) {
    if (ctx->vector_length > 0) {
      meminit((void *)ctx->vector, 0x00, ctx->vector_length);
    }
    free((void *)ctx->vector);
  }

  if (NULL != ctx->temp_buffer) {
    if (ctx->temp_buffer_length > 0) {
      meminit((void *)ctx->temp_buffer, 0x00, ctx->temp_buffer_length);
    }
    free((void *)ctx->temp_buffer);
  }

  meminit((void *)ctx, 0x00, ctx_length);
  free((void *)ctx);
}

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

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

Я решил вернуться к своей первой задумке, а именно программе для шифрования файлов. К тому времени я уже перепробовал массу программ для шифрования файлов и удовлетворить мои потребности смогла только GnuPG. Но зачем так сложно? Делать нужно просто, будто для дураков. Первое, что я сделал, это поставил задачу.

Нужно зашифровать файл так, чтобы никто, даже директор ЦРУ, никогда не получил открытый текст, не зная пароля или не имея доступа к ключевому файлу. Пароль же перебрать нельзя, а если и можно, то ждать придётся неисчислимое количество времени. Взлом шифротекста методами криптоанализа должен быть невозможен в принципе.

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

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

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

Я больше не могу видеть свой старый код. Меня от него трясет и корёжит. Правда. Я считаю, что следующий код хорош, но любой другой просто шлак, даже мой, что заставляет меня писать аккуратно, как будто я программирую ракету для миссии на Нептун! Что со мной? Все нормально. Просто, я расту над собой. Если ты новичок, тебя ждёт то же самое. Всех ждёт!

#include <stdio.h>

int printhex(char * buffer) {
  if (NULL == buffer) {
    return (-1);
  }
   
  int result = 0;
   
  for (int i = 0;'\0' != buffer[i]; i++) {
    result += printf("%02x%c",
                     buffer[i], (i + 1) % 16 == 0 ? '\n' : ' ');
  }
  return result;
}

int main(int argc, char * argv[]) {
  int i = 0, result = 0;
  
  while (NULL != argv[++i]) {
    result += printhex(argv[i]);
  }
  return result;
}

Первой прочитанной научной книгой стала пиратская версия книги Брюса Шнайера «Прикладная криптография», которую «проглотить» оказалось не так просто. Она оказалась мне не по зубам, и начался тяжёлый подъем в гору просветления.

«Криптография бывает двух типов: криптография, которая помешает читать ваши файлы вашей младшей сестре, и криптография, которая помешает читать ваши файлы людям из правительства».

«Прикладная криптография», Брюс Шнайер.

Я медленно, но верно изучил алгоритмы шифрования, выбрав пять наиболее понравившихся мне, а позже выбрав шестой, Twofish, режимы шифрования, выбрав в итоге CFB (режим обратной связи по шифротексту), за что спасибо учёным, авторам статьи на сайте одного белорусского ВУЗа. Я выбрал всё лучшее на тот момент, но не прочитал главного — как делать не надо. Снова.

Как оказалось, защита информации — это целая наука, и я думаю, что успешно поднимаюсь на эту ступень, хоть и маленькими шажками. Следующей книгой Шнайера, изученной мной, стала пиратская версия книги «Секреты и ложь: безопасность данных в цифровом мире».

После её прочтения я понял: безопасность — это процесс, а не инструмент. Дело не в винтовке, дело в профессионализме стрелка. Я понял. Я — плохой стрелок. Это и было ключом ко всему — познать границы своей компетентности и, увидев пятна незнания, взять их штурмом желания, терпения и опыта. Одно пятно за другим.

Сейчас разрабатываемую и поддерживаемую мной программу я использую сам для шифрования файлов размером до 2 ГБ включительно. Мне больше и не надо. Программа свободна и использовать ее может кто угодно и для чего угодно.

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

Единственный шанс получить открытый текст из шифротекста без знания пароля — это украсть открытый текст до шифрования. Как и у WinRar, копию которого я когда-то безуспешно пытался написать. Размер самой программы, точнее, её консольной версии, около 90 КБ, графической версии — около 480 КБ.

Программа для шифрования файлов

Консольная версия программы

Программа для шифрования

Графическая версия программы

Такие малютки, но столько мощи! Сегодня такие программы уже не пишут. Ну разве что ребята из проекта GNU. Я действительно горжусь тем, что создал, пройдя по-настоящему тяжёлый и долгий путь. Мне ещё многому предстоит научиться, многое сделать, но я чётко вижу, куда идти и что нужно делать, а, главное, знаю, как не надо делать.

Я сделал это. Сделаешь и ты. Главное, подогревать в себе огонь тем, что по-настоящему разжигает страсть!

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Что думаете?