Написать пост

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

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

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

Привет, читатель. Возможно, ты уже опытный разработчик и способен обучать других людей программированию. Может быть, ты новичок, только собираешься начать свой путь в 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 утра.

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

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

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

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

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

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

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

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

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

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

Да, я написал генератор «лицензионных» ключей для собственной программы! А откуда, вы думали, разработчики программ берут лицензионные ключи, которые потом продают за 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, за которую мне ужасно стыдно до сих пор.

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

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

Необычная история становления программиста: от первых троянов до собственной программы для шифрования файлов 4
Патчер бинарных файлов
Необычная история становления программиста: от первых троянов до собственной программы для шифрования файлов 5
Аналог поиска для 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 

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 КБ.

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

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

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

Следите за новыми постами
Следите за новыми постами по любимым темам
6К открытий6К показов