HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#статьи</a></p>
1 <p><a>#статьи</a></p>
2 <ul><li>25 авг 2023</li>
2 <ul><li>25 авг 2023</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><h2>Ревёрс-инжиниринг: что это такое и зачем нужно</h2>
4 </ul><h2>Ревёрс-инжиниринг: что это такое и зачем нужно</h2>
5 <p>Загадочная история Бенджамина Баттона, который решил стать программистом.</p>
5 <p>Загадочная история Бенджамина Баттона, который решил стать программистом.</p>
6 <p>Кадр: фильм "Игра в имитацию" / The Weinstein Company</p>
6 <p>Кадр: фильм "Игра в имитацию" / The Weinstein Company</p>
7 <p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
7 <p>Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.</p>
8 <p>Если вы в детстве любили разбирать игрушки, возможно, вы прирождённый специалист по ревёрс-инжинирингу, но пока не знаете об этом. Ведь занимаются они примерно тем же самым, только вместо игрушек у них программы и техника, а вместо молотка и отвёртки - специальные приложения.</p>
8 <p>Если вы в детстве любили разбирать игрушки, возможно, вы прирождённый специалист по ревёрс-инжинирингу, но пока не знаете об этом. Ведь занимаются они примерно тем же самым, только вместо игрушек у них программы и техника, а вместо молотка и отвёртки - специальные приложения.</p>
9 <p>Рассказываем об основах ревёрс-инжиниринга и показываем, как специалисты по кибербезопасности анализируют вирусы. А в конце статьи попробуем разобрать на винтики простенькую программу на C++, чтобы вы смогли понять, как этот процесс выглядит изнутри.</p>
9 <p>Рассказываем об основах ревёрс-инжиниринга и показываем, как специалисты по кибербезопасности анализируют вирусы. А в конце статьи попробуем разобрать на винтики простенькую программу на C++, чтобы вы смогли понять, как этот процесс выглядит изнутри.</p>
10 <p>Предупреждаем: то, о чём вы сейчас узнаете, может вызвать соблазн перейти на тёмную сторону. Не надо так: лучше<a>становитесь белым хакером</a>и помогайте компаниям бороться с киберпреступностью.</p>
10 <p>Предупреждаем: то, о чём вы сейчас узнаете, может вызвать соблазн перейти на тёмную сторону. Не надо так: лучше<a>становитесь белым хакером</a>и помогайте компаниям бороться с киберпреступностью.</p>
11 <p>Представьте, что вы работаете программистом в компании по производству беспилотных автомобилей. К вам приходит руководитель отдела разработки и говорит: "Мы получили прототип программы нашего главного конкурента. Вот тебе файл в формате EXE. Сможешь разобраться, как она работает?" Что будете делать?</p>
11 <p>Представьте, что вы работаете программистом в компании по производству беспилотных автомобилей. К вам приходит руководитель отдела разработки и говорит: "Мы получили прототип программы нашего главного конкурента. Вот тебе файл в формате EXE. Сможешь разобраться, как она работает?" Что будете делать?</p>
12 <p>Решить задачу не так-то просто, если размышлять в парадигме обычной (прямой) разработки. А состоит она в следующем:</p>
12 <p>Решить задачу не так-то просто, если размышлять в парадигме обычной (прямой) разработки. А состоит она в следующем:</p>
13 <ul><li>программист пишет код на понятном для него языке - например, Java, Python или C++;</li>
13 <ul><li>программист пишет код на понятном для него языке - например, Java, Python или C++;</li>
14 <li>затем он отдаёт файл компилятору, который превращает код из понятного для человека в бинарный файл - чтобы его мог прочитать компьютер;</li>
14 <li>затем он отдаёт файл компилятору, который превращает код из понятного для человека в бинарный файл - чтобы его мог прочитать компьютер;</li>
15 <li>Пользователь скачивает скомпилированную программу - например, в вышеупомянутом формате EXE и запускает её на компьютере.</li>
15 <li>Пользователь скачивает скомпилированную программу - например, в вышеупомянутом формате EXE и запускает её на компьютере.</li>
16 </ul><p><strong>Бинарный файл</strong>, или, как его ещё называют,<strong>исполняемый файл</strong>, - это набор нулей и единиц, машинный код. Простой человек со стороны не сможет прочитать его, а значит, и разобраться в устройстве программы.</p>
16 </ul><p><strong>Бинарный файл</strong>, или, как его ещё называют,<strong>исполняемый файл</strong>, - это набор нулей и единиц, машинный код. Простой человек со стороны не сможет прочитать его, а значит, и разобраться в устройстве программы.</p>
17 <p>Чтобы не попасть в тупик в таких ситуациях, придумали<strong>ревёрс-инжиниринг</strong>. Слово "ревёрс" означает, что процесс разработки идёт в обратную сторону - то есть бинарный файл переводят обратно в человекочитаемый формат. Вот как это выглядит:</p>
17 <p>Чтобы не попасть в тупик в таких ситуациях, придумали<strong>ревёрс-инжиниринг</strong>. Слово "ревёрс" означает, что процесс разработки идёт в обратную сторону - то есть бинарный файл переводят обратно в человекочитаемый формат. Вот как это выглядит:</p>
18 <ul><li>разработчик получает бинарный файл, который понимает только компьютер;</li>
18 <ul><li>разработчик получает бинарный файл, который понимает только компьютер;</li>
19 <li>затем он прогоняет этот файл через специальную программу и превращает в код на знакомом ему языке программирования;</li>
19 <li>затем он прогоняет этот файл через специальную программу и превращает в код на знакомом ему языке программирования;</li>
20 <li>дальше программист изучает этот файл и пытается разобраться во внутреннем устройстве программы.</li>
20 <li>дальше программист изучает этот файл и пытается разобраться во внутреннем устройстве программы.</li>
21 </ul><p>Процесс ревёрс-инжиринига может показаться простым - но это иллюзия. Даже опытные специалисты по обратной разработке могут анализировать одну и ту же программу месяцами. И не факт, что её удастся расшифровать полностью.</p>
21 </ul><p>Процесс ревёрс-инжиринига может показаться простым - но это иллюзия. Даже опытные специалисты по обратной разработке могут анализировать одну и ту же программу месяцами. И не факт, что её удастся расшифровать полностью.</p>
22 <p>С помощью ревёрс-инжиниринга мы можем понять, как работает программа, какие данные использует, куда и что отправляет, а также какие в ней есть слабые места и как она реагирует на аварийные ситуации. Это всё поможет нам сделать свой продукт лучше и переиграть конкурентов.</p>
22 <p>С помощью ревёрс-инжиниринга мы можем понять, как работает программа, какие данные использует, куда и что отправляет, а также какие в ней есть слабые места и как она реагирует на аварийные ситуации. Это всё поможет нам сделать свой продукт лучше и переиграть конкурентов.</p>
23 <p><strong>Дисклеймер:</strong>здесь стоит оговориться, что почти все разработчики запрещают расшифровывать код своих программ в лицензионном соглашении. А значит, применять ревёрс-инжиниринг стоит либо на свой страх и риск, либо предварительно согласовав с компаниями-поставщиками.</p>
23 <p><strong>Дисклеймер:</strong>здесь стоит оговориться, что почти все разработчики запрещают расшифровывать код своих программ в лицензионном соглашении. А значит, применять ревёрс-инжиниринг стоит либо на свой страх и риск, либо предварительно согласовав с компаниями-поставщиками.</p>
24 Так выглядит код программы, прошедший через ревёрс-инжиниринг<em>Скриншот: Skillbox Media</em><p>Давайте приведём ещё пару примеров областей, в которых полезна обратная разработка.</p>
24 Так выглядит код программы, прошедший через ревёрс-инжиниринг<em>Скриншот: Skillbox Media</em><p>Давайте приведём ещё пару примеров областей, в которых полезна обратная разработка.</p>
25 <p><strong>? Анализ вирусов и поиск уязвимостей.</strong>Специалисты по кибербезопасности уже давно применяют методы ревёрс-инжиниринга, чтобы анализировать вредоносное ПО. Например, они могут специально скачивать вирусы, заражать ими свои компьютеры и выяснять, как те устроены, чтобы потом разработать средства защиты.</p>
25 <p><strong>? Анализ вирусов и поиск уязвимостей.</strong>Специалисты по кибербезопасности уже давно применяют методы ревёрс-инжиниринга, чтобы анализировать вредоносное ПО. Например, они могут специально скачивать вирусы, заражать ими свои компьютеры и выяснять, как те устроены, чтобы потом разработать средства защиты.</p>
26 <p><strong>? Разработка модов для игр.</strong>В геймдеве обратная разработка позволяет создавать модификации для игр и изменять игровой процесс: добавлять новые функции и контент. Например, таким образом создавались моды для игр The Elder Scrolls V: Skyrim и Grand Theft Auto 5.</p>
26 <p><strong>? Разработка модов для игр.</strong>В геймдеве обратная разработка позволяет создавать модификации для игр и изменять игровой процесс: добавлять новые функции и контент. Например, таким образом создавались моды для игр The Elder Scrolls V: Skyrim и Grand Theft Auto 5.</p>
27 <p><strong>? Изучение старых технологий.</strong>Бывает, что оригинальная документация для приложений утеряна или что программа написана для старых компьютеров, которые больше не производятся. Поэтому разработчикам приходится с нуля воссоздавать код приложений.</p>
27 <p><strong>? Изучение старых технологий.</strong>Бывает, что оригинальная документация для приложений утеряна или что программа написана для старых компьютеров, которые больше не производятся. Поэтому разработчикам приходится с нуля воссоздавать код приложений.</p>
28 <p>Хорошо, ревёрс-инжиниринг - это наука о том, как машинный код превратить в понятный для человека язык. С этим разобрались. Но как именно происходит обратная разработка? Есть три способа.</p>
28 <p>Хорошо, ревёрс-инжиниринг - это наука о том, как машинный код превратить в понятный для человека язык. С этим разобрались. Но как именно происходит обратная разработка? Есть три способа.</p>
29 <p><strong>1️⃣ Перевести бинарный файл в код на языке высокого уровня</strong>. Для этого существуют специальные программы - дизассемблеры. Они понимают, как устроен машинный код, и без проблем могут перевести его на удобный для нас язык программирования - например, C++.</p>
29 <p><strong>1️⃣ Перевести бинарный файл в код на языке высокого уровня</strong>. Для этого существуют специальные программы - дизассемблеры. Они понимают, как устроен машинный код, и без проблем могут перевести его на удобный для нас язык программирования - например, C++.</p>
30 <p>Единственный минус работы дизассемблера в том, что в готовом коде часто нет названий переменных и комментариев, поэтому после процедуры разработчику нужно будет довольно долго разбираться, за что отвечают отдельные блоки кода.</p>
30 <p>Единственный минус работы дизассемблера в том, что в готовом коде часто нет названий переменных и комментариев, поэтому после процедуры разработчику нужно будет довольно долго разбираться, за что отвечают отдельные блоки кода.</p>
31 <p><strong>2️⃣ Перевести бинарный файл в код на языке ассемблера</strong>.<a>Ассемблер</a> - язык чуть более высокого уровня, чем машинный код, но гораздо более низкого, чем привычные нам JavaScript и Python. Любой процессор умеет работать с ассемблером, поэтому для компьютера этот способ расшифровки бинарного файла - самый простой.</p>
31 <p><strong>2️⃣ Перевести бинарный файл в код на языке ассемблера</strong>.<a>Ассемблер</a> - язык чуть более высокого уровня, чем машинный код, но гораздо более низкого, чем привычные нам JavaScript и Python. Любой процессор умеет работать с ассемблером, поэтому для компьютера этот способ расшифровки бинарного файла - самый простой.</p>
32 <p>Чтобы прочитать код, написанный на ассемблере, нужно разбираться в том, как устроен процессор, какие команды он использует и как вообще работает. Поэтому без подготовки проанализировать программу будет сложно.</p>
32 <p>Чтобы прочитать код, написанный на ассемблере, нужно разбираться в том, как устроен процессор, какие команды он использует и как вообще работает. Поэтому без подготовки проанализировать программу будет сложно.</p>
33 <p><strong>3️⃣ Изучить, какие данные программа пересылает по Сети или внутри компьютера.</strong>Обычно программы обмениваются данными по интернету или внутри операционной системы. Поэтому, чтобы понять, как устроена программа, ревёрс-инженеры используют специальные сетевые анализаторы.</p>
33 <p><strong>3️⃣ Изучить, какие данные программа пересылает по Сети или внутри компьютера.</strong>Обычно программы обмениваются данными по интернету или внутри операционной системы. Поэтому, чтобы понять, как устроена программа, ревёрс-инженеры используют специальные сетевые анализаторы.</p>
34 <p>Например, существует сетевой анализатор, встроенный прямо в Google Chrome. Чтобы его открыть, нужно зайти в инструменты разработчика (клавиша F12) и перейти на вкладку "Network".</p>
34 <p>Например, существует сетевой анализатор, встроенный прямо в Google Chrome. Чтобы его открыть, нужно зайти в инструменты разработчика (клавиша F12) и перейти на вкладку "Network".</p>
35 Это файлы, которые скачивает браузер при открытии Skillbox Media. Все они - картинки и иконки<em>Скриншот: Skillbox Media</em><p>Теперь, когда мы знаем основные способы обратной разработки, давайте перейдём к самому процессу - этапам ревёрс-инжиниринга. Всего их четыре.</p>
35 Это файлы, которые скачивает браузер при открытии Skillbox Media. Все они - картинки и иконки<em>Скриншот: Skillbox Media</em><p>Теперь, когда мы знаем основные способы обратной разработки, давайте перейдём к самому процессу - этапам ревёрс-инжиниринга. Всего их четыре.</p>
36 <ul><li><strong>Провести предварительное исследование.</strong>Сначала нужно внимательно изучить программу: понажимать все кнопки, попользоваться всеми функциями. Это поможет составить цельную картину того, как работает приложение.</li>
36 <ul><li><strong>Провести предварительное исследование.</strong>Сначала нужно внимательно изучить программу: понажимать все кнопки, попользоваться всеми функциями. Это поможет составить цельную картину того, как работает приложение.</li>
37 <li><strong>Начать разборку</strong>,<strong>или</strong><strong>демонтаж.</strong>Теперь мы должны заглянуть внутрь программы и посмотреть, как она устроена. Для этого как раз применяем один из способов обратной разработки, а затем изучаем полученный код.</li>
37 <li><strong>Начать разборку</strong>,<strong>или</strong><strong>демонтаж.</strong>Теперь мы должны заглянуть внутрь программы и посмотреть, как она устроена. Для этого как раз применяем один из способов обратной разработки, а затем изучаем полученный код.</li>
38 <li><strong>Провести анализ.</strong>Когда мы разобрались, какие в программе есть алгоритмы и структуры данных, пора собирать всё воедино. Мы изучаем все части и пытаемся понять, как они работают вместе. Например, смотрим, в какой последовательности выполняются методы в коде и как приложение взаимодействует с внешней средой.</li>
38 <li><strong>Провести анализ.</strong>Когда мы разобрались, какие в программе есть алгоритмы и структуры данных, пора собирать всё воедино. Мы изучаем все части и пытаемся понять, как они работают вместе. Например, смотрим, в какой последовательности выполняются методы в коде и как приложение взаимодействует с внешней средой.</li>
39 <li><strong>Создать документацию.</strong>После того как мы со всем разобрались, пора документировать функциональность. Нужно записать, что делают функции, какие переменные они принимают и куда отправляют данные. А потом всё это тщательно задокументировать, чтобы не возникало вопросов о том, что делают отдельные части кода.</li>
39 <li><strong>Создать документацию.</strong>После того как мы со всем разобрались, пора документировать функциональность. Нужно записать, что делают функции, какие переменные они принимают и куда отправляют данные. А потом всё это тщательно задокументировать, чтобы не возникало вопросов о том, что делают отдельные части кода.</li>
40 </ul><p>Ещё раз напомним, что процесс может занять много времени. А чтобы понять, как работает программа, нужно иметь опыт программирования - иначе будет сложно. Хотя попробовать всё равно стоит.</p>
40 </ul><p>Ещё раз напомним, что процесс может занять много времени. А чтобы понять, как работает программа, нужно иметь опыт программирования - иначе будет сложно. Хотя попробовать всё равно стоит.</p>
41 <p>Допустим, вы решили попробовать себя на нелёгкой стезе ревёрс-инжиниринга. Куда идти, что нажимать?</p>
41 <p>Допустим, вы решили попробовать себя на нелёгкой стезе ревёрс-инжиниринга. Куда идти, что нажимать?</p>
42 <p>❗️ Хотим напомнить, что пиратство в России незаконно. За него суд может назначить штраф до 200 тысяч рублей, до двух лет исправительных работ или лишить свободы на срок до двух лет. А за распространение, использование и создание вредоносного ПО - до семи лет. Поэтому не занимайтесь взломом - занимайтесь кибербезопасностью.</p>
42 <p>❗️ Хотим напомнить, что пиратство в России незаконно. За него суд может назначить штраф до 200 тысяч рублей, до двух лет исправительных работ или лишить свободы на срок до двух лет. А за распространение, использование и создание вредоносного ПО - до семи лет. Поэтому не занимайтесь взломом - занимайтесь кибербезопасностью.</p>
43 <p>Лучше всего изучить обратную разработку на своих проектах или решать задачи на специальных сайтах - например, на <a>Crackmes</a>. Так вы сможете вполне легально прокачать свои навыки.</p>
43 <p>Лучше всего изучить обратную разработку на своих проектах или решать задачи на специальных сайтах - например, на <a>Crackmes</a>. Так вы сможете вполне легально прокачать свои навыки.</p>
44 <p>Программ для ревёрс-инжиниринга достаточно. Некоторые из них могут быть вам знакомы - например,<a>Cheat Engine</a>. Вообще, это программа для обратной разработки, но она также позволяет накрутить игровой валюты где-нибудь в Sims или GTA.</p>
44 <p>Программ для ревёрс-инжиниринга достаточно. Некоторые из них могут быть вам знакомы - например,<a>Cheat Engine</a>. Вообще, это программа для обратной разработки, но она также позволяет накрутить игровой валюты где-нибудь в Sims или GTA.</p>
45 Интерфейс Cheat Engine<em>Скриншот: Skillbox Media</em><p>Вот ещё список программ:</p>
45 Интерфейс Cheat Engine<em>Скриншот: Skillbox Media</em><p>Вот ещё список программ:</p>
46 <ul><li><a>IDA Pro</a>;</li>
46 <ul><li><a>IDA Pro</a>;</li>
47 <li><a>Ghidra</a>;</li>
47 <li><a>Ghidra</a>;</li>
48 <li><a>x64dbg</a>;</li>
48 <li><a>x64dbg</a>;</li>
49 <li><a>Cutter</a>;</li>
49 <li><a>Cutter</a>;</li>
50 <li><a>ReClass</a>;</li>
50 <li><a>ReClass</a>;</li>
51 </ul><p>Давайте в качестве примера покажем, как выглядит обратная разработка в программе IDA Pro. Напишем код "Hello, World" на C++, скомпилируем его и попробуем расшифровать с помощью приложения.</p>
51 </ul><p>Давайте в качестве примера покажем, как выглядит обратная разработка в программе IDA Pro. Напишем код "Hello, World" на C++, скомпилируем его и попробуем расшифровать с помощью приложения.</p>
52 Так выглядит код программы в среде разработки Visual Studio Code<em>Скриншот: Skillbox Media</em><p>Открываем программу IDA Pro и видим первый экран. Здесь нажимаем кнопку "New", чтобы начать процесс дизассемблирования:</p>
52 Так выглядит код программы в среде разработки Visual Studio Code<em>Скриншот: Skillbox Media</em><p>Открываем программу IDA Pro и видим первый экран. Здесь нажимаем кнопку "New", чтобы начать процесс дизассемблирования:</p>
53 Видите - ничего сложного пока нет. Просто нажимаем кнопку "New"<em>Скриншот: Skillbox Media</em><p>Дальше нам нужно загрузить файл в программу. На выбор есть два варианта - формат DLL или бинарный файл. Нам нужен первый:</p>
53 Видите - ничего сложного пока нет. Просто нажимаем кнопку "New"<em>Скриншот: Skillbox Media</em><p>Дальше нам нужно загрузить файл в программу. На выбор есть два варианта - формат DLL или бинарный файл. Нам нужен первый:</p>
54 Остальные настройки оставьте по умолчанию. Они нам пока не пригодятся<em>Скриншот: Skillbox Media</em><p>Готово - вот как выглядит наш дизассемблированный файл. Можно поизучать его и понять, из каких элементов он вообще состоит.</p>
54 Остальные настройки оставьте по умолчанию. Они нам пока не пригодятся<em>Скриншот: Skillbox Media</em><p>Готово - вот как выглядит наш дизассемблированный файл. Можно поизучать его и понять, из каких элементов он вообще состоит.</p>
55 Так выглядит файл, который прошёл обратную компиляцию, или дизассемблирование<em>Скриншот: Skillbox Media</em><p>Сначала мы попадаем на вкладку "IDA View-A". Это место, где находится код языка ассемблера нашей переведённой программы. Если приглядеться, то можно увидеть строчку lea rdx, _Val ; "Hello, World". Она показывает, что мы что-то делаем со строкой "Hello, World" - а точнее, пытаемся вывести её в консоль. Но это очевидно для нас, потому что программа простая. Если бы тут был, скажем, код операционной системы Windows, то мы бы думали очень долго.</p>
55 Так выглядит файл, который прошёл обратную компиляцию, или дизассемблирование<em>Скриншот: Skillbox Media</em><p>Сначала мы попадаем на вкладку "IDA View-A". Это место, где находится код языка ассемблера нашей переведённой программы. Если приглядеться, то можно увидеть строчку lea rdx, _Val ; "Hello, World". Она показывает, что мы что-то делаем со строкой "Hello, World" - а точнее, пытаемся вывести её в консоль. Но это очевидно для нас, потому что программа простая. Если бы тут был, скажем, код операционной системы Windows, то мы бы думали очень долго.</p>
56 <p>Давайте посмотрим, что находится в других вкладках ?</p>
56 <p>Давайте посмотрим, что находится в других вкладках ?</p>
57 <em>Скриншот: Skillbox Media</em><p>Это вкладка "Hex View 1". Тут дизассемблированный код представлен в виде шестнадцатеричных - то есть понятных для компьютера - символов. Если понимать язык нулей и единиц, отсюда можно достать полезную информацию - например, найти повторяющиеся команды или какие-нибудь интересные данные.</p>
57 <em>Скриншот: Skillbox Media</em><p>Это вкладка "Hex View 1". Тут дизассемблированный код представлен в виде шестнадцатеричных - то есть понятных для компьютера - символов. Если понимать язык нулей и единиц, отсюда можно достать полезную информацию - например, найти повторяющиеся команды или какие-нибудь интересные данные.</p>
58 <p>Кстати, обратите внимание на функции слева. Они тоже могут дать много полезной информации:</p>
58 <p>Кстати, обратите внимание на функции слева. Они тоже могут дать много полезной информации:</p>
59 <em>Скриншот: Skillbox Media</em><p>Например, по этим функциям можно понять, какие системные вызовы делает программа. Правда, имена этих вызовов не вполне очевидны, поэтому часто приходится гуглить, зачем они нужны.</p>
59 <em>Скриншот: Skillbox Media</em><p>Например, по этим функциям можно понять, какие системные вызовы делает программа. Правда, имена этих вызовов не вполне очевидны, поэтому часто приходится гуглить, зачем они нужны.</p>
60 <p>Переходим на следующую вкладку - "Structures".</p>
60 <p>Переходим на следующую вкладку - "Structures".</p>
61 <em>Скриншот: Skillbox Media</em><p>Здесь можно подробнее исследовать, как устроены структуры данных в программе. Например, тут показано, какие классы вызываются, какие типы переменных они используют и какие исключения обрабатывают. Сложно, зато познавательно.</p>
61 <em>Скриншот: Skillbox Media</em><p>Здесь можно подробнее исследовать, как устроены структуры данных в программе. Например, тут показано, какие классы вызываются, какие типы переменных они используют и какие исключения обрабатывают. Сложно, зато познавательно.</p>
62 <p>? Подведём итоги: с помощью всех этих данных инженеры по обратному проектированию изучают, как работает программа. Они запускают дебагеры и тыкают везде, где можно потыкать, чтобы собрать максимум информации об архитектуре. Работа непростая - но невероятно полезная. А ещё за это платят неплохие деньги - какие именно зарплатные вилки у разработчиков, владеющих языком ассемблера, мы рассказывали в <a>отдельной</a>статье.</p>
62 <p>? Подведём итоги: с помощью всех этих данных инженеры по обратному проектированию изучают, как работает программа. Они запускают дебагеры и тыкают везде, где можно потыкать, чтобы собрать максимум информации об архитектуре. Работа непростая - но невероятно полезная. А ещё за это платят неплохие деньги - какие именно зарплатные вилки у разработчиков, владеющих языком ассемблера, мы рассказывали в <a>отдельной</a>статье.</p>
63 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
63 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>