Джерело зображення: pixabay.com

Python - мова високого рівня. Хоча багато хто з вас можуть подумати, це як мова програмування, це не так. Це мова сценаріїв. Він ніде не наближається до машинного коду чи мови машини. Тоді що робить пітон таким цікавим? Якщо у вас є досвід перешкод, або ви спілкувались з багатьма експертами з веб-безпеки або аналізаторами зловмисного програмного забезпечення, вони завжди пропонують пітон як основну мову для розробки шкідливих програм або експлуатації.

Хоча деякі люди можуть віддавати перевагу C, C ++ або perl, я особисто проголосував би за пітона. Причина в тому, що вона не тільки корисна як інструмент для написання програми, але також корисно її зламати.

Що таке реверсна інженерія?

Реверсна інженерія - це дуже широке поняття. Насправді це неможливо визначити за допомогою простих синтаксисів. Правильна концепція реверсивної інженерії полягає в тому, щоб розбити код на простіші частини, зрозуміти його, змінити та вдосконалити відповідно до власних цілей, а потім зібрати його відповідно до наших потреб. Щоб зробити це трохи простіше, дозвольте навести кілька крайніх поширених прикладів.

Давайте візьмемо приклад мобільного телефону Android. Виробники створюють фондовий ром і продають його своїм споживачам. Але в більшості випадків він містить багато засобу, і він стає млявим. Таким чином, на таких веб-сайтах, як XDA і androidcentral, є люди, які реверсують інженер в дорогу ПЗУ, покращують його і роблять його відсталим. Одним з практичних прикладів може бути CyanogenMod Rom.

Але це був лише приклад, щоб ви зрозуміли, що це таке. Реверсивна інженерія має таку ж концепцію, але її спосіб занадто складний, щоб просто змінити ПЗУ.

Компіляція та Python

Якщо у вас є досвід роботи з Python, то ви знаєте, що при написанні сценарію python це може бути вірус, корисна навантаження, троянський файл або будь-який інший файл, він працюватиме лише в комп'ютерах, на яких встановлений python. Отже, скажімо, я написав чудовий комп'ютерний троянець, який може обійти будь-який антивірус, і я починаю його розгортати в системі Windows, але якщо в системі Windows не встановлений інтерпретатор python, він не працюватиме. Отже, потрібно скомпілювати кожен файл написаного сценарію python у виконуваний файл і потім розгорнути його в системі Windows.

Зворотні інженерії Windows

Тепер ви знаєте, що нам потрібно зібрати сценарії python для запуску у Windows, ви також повинні знати, що повинен бути компілятор, який перетворює сценарії python у виконуваний файл. Так, є. Його назва - Py2exe. Py2exe - це простий інсталятор, який перетворює сценарії python у окремі програми Windows. Тепер також є ще один інструмент, який перетворює виконувані файли Windows, написані в python, назад в сценарії python. Її звуть Pyinstaller Exe Rebuilder.

Відновлювач програми Pyinstaller exe - це інструмент для перекомпіляції / зворотного інженеру, створеного файлами pyinstaller, не маючи доступу до вихідного коду. Коли ви запускаєте EXE - він розпаковується в пам'яті. Сюди входять файли .pyc (код python, який перетворюється на байт-код). В основному, такі інструменти, як pyinstaller та py2exe, - це бібліотеки пакетів і залежності, які разом, щоб ви могли запустити "автономний" EXE без необхідності завантажувати їх або готувати машину за допомогою інтерпретатора python.

Існує також інший інструментарій, який дозволяє вам наблизитися до вихідного коду. Назва PyRetic, що розшифровується як Obfuscated Bytode Python Bytecode Rever Engineer. Цей інструментарій дозволяє повернути об’єкт у пам'яті назад до вихідного коду, не потребуючи доступу до байт-коду безпосередньо на диску. Це може бути корисно, якщо програми pyc на диску закриті одним із багатьох способів.

Рекомендовані курси

  • Тренінг з режиму сплячки на Java
  • Навчання в Інтернеті з сертифікації в Весі Java
  • Програма WordPress
  • Сертифікаційне навчання в Рубі

Реверсна інженерія Важкий шлях

Тепер вищевказану частину легко зрозуміти, і це зробити практично, коли ви засвідчите основні знання пітона. Але це не завжди так. Іноді у вас немає будь-якої документації чи коментарів у сценарії python, і для вас теж можуть бути файли, щоб зрозуміти самі. Зараз є дивовижна книга про цю частину, але я не буду багато зосереджуватися на цьому.

Назва книги - «Ефективна робота зі спадковим кодом». Книга не залежить від пітона або будь-якої іншої мови і дасть вам уявлення про зворотну інженерію майже на будь-якій мові. Основна увага при спробі зрозуміти фрагмент коду - це причина, чому ви хочете його зрозуміти.

Незалежно від того, чи хочете ви змінити інженерний код, щоб змінити його, або перенести порт, підхід для обох був би зовсім іншим. Таким чином, інструментація застарілого коду з батареями та рисуванням тестів та відстеженням / веденням журналу - це найважливіший шлях довгого, важкого гасла до розуміння та модифікації безпечно та відповідально.

Інструменти зворотного машинобудування

Тепер є ще один спосіб зробити його трохи легшим, якого ви можете дотримуватися, виконуючи описані вище кроки. Є сайт, який називається Epydoc. На цьому сайті перевіримо код і створимо на нього деяку документацію. Результат буде не таким хорошим, як оригінальна документація, але він принаймні дасть вам уявлення про те, як саме воно працює. І зробивши це, ви можете почати писати власну документацію, і після часткового написання документа ви зможете знову генерувати частину документа, що залишився, з сайту для частини, що залишилася.

Ви навіть можете використовувати інструмент IDE для аналізу коду. Зазвичай це дає завершення коду, але що важливіше в цьому випадку, це дозволяє просто клацнути клавішу ctrl на змінній, щоб побачити, звідки вона походить. Це дійсно прискорює справи, коли ви хочете зрозуміти код інших народів.

Також вам потрібно вивчити налагоджувач. Вам, у складних частинах коду, доведеться переходити через них у відладчику, щоб побачити, що насправді робить код. Pythons pdb працює, але багато IDE мають інтегровані налагоджувачі, що полегшує налагодження. PyReverse від Logilab та PyNSource від Енді Булка також корисні для створення діаграм UML.

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

Крім цього, розробники можуть змінювати бібліотеку кодів як класи UML та створювати з ними модель, як, наприклад, перетворювати загальну рамку колекції та розробляти власну рамку, розширюючи загальну. У цій главі ми пройдемо миттєвий зворотний бік Python.

Об'єкти та праймери

Щоб повністю зрозуміти внутрішню роботу Python, слід спочатку ознайомитися з тим, як Python компілює та виконує код. Коли код компілюється в Python, результат є об'єктом коду. Об'єкт коду є незмінним і містить всю інформацію, необхідну інтерпретатору для запуску коду. Інструкція байтового коду представлена ​​у вигляді однобайтового коду, а за необхідністю аргументи. Дані посилаються за допомогою індексу на одне з інших властивостей об'єкта коду.

Рядок байтового коду виглядає приблизно так:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

Байт-код Python працює над стеком елементів. Більш заповзятливим розширенням буде спроба декомпілювати байтовий код назад у читаний вихідний код Python, доповнений іменами об'єктів та функцій. Код Python можна поширювати у двійковій формі за допомогою модуля маршалки. Цей модуль забезпечує можливість серіалізації та десеріалізації об'єктів коду за допомогою функцій зберігання та завантаження.

Найбільш часто зустрічається бінарний формат - це складений файл Python (.pyc), який містить магічне число, часову позначку та серіалізований об’єкт. Цей тип файлу зазвичай виробляється інтерпретатором Python як кеш складеного об'єкта, щоб уникнути необхідності розбору джерела кілька разів. Ці методи залежать від простоти доступу до байт-коду та інформації про тип.

За допомогою байтового коду об'єкта коду логіку коду можна змінити або навіть повністю замінити. Вилучення інформації про тип може допомогти в осмисленні дизайну програми та виявленні функції та цілей об'єкта.

Заблуднення та зміцнення байтового коду програми завжди буде гонкою між реалізаторами та тими, хто прагне його зламати. Щоб спробувати захиститися від пошуку байтового коду, перший логічний крок - це рішення для перекладу часу виконання.

Властивості кодового об'єкта можуть зберігатися у будь-якому підписаному, зашифрованому чи іншому затуманеному форматі, який знешкоджується або перекладається під час виконання та використовується для інстанціалізації нового об’єкта. Можна навіть змінити спосіб пошуку змінних імен в інтерпретаторі для придушення інформації про іменування. Додавши шар перекладу між пошуком фактичних імен та іменами у вихідному коді, розробник може ще більше пом'якшити спроби реверсування.

Висновок

Тепер, прочитавши все це, ви можете відчути потребу поїхати та експериментувати з кількома дорогами там. Отже, ось кілька інструментів, які можуть допомогти інженеру змінити свій шлях до вашого пітонного коду:

  1. Паймей
  1. Саллі
  1. Колекція Carrera
  1. PyEmu
  1. ІДАПітон
  1. ImmDbg

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

Рекомендовані статті

Ось кілька статей, які допоможуть вам отримати більш детальну інформацію про реверсивну інженерію з Python, тому просто перейдіть за посиланням.

  1. 25 найдивовижніших запитань та відповідей на інтерв'ю Python
  2. Почніть роботи з Python та Django для веб-розробки
  3. Які переваги та обмеження використання Python?
  4. Кар'єра в Python
  5. Інструменти зворотного машинобудування