Навчальна збірка [закрито]


102

Я вирішив вивчити асемблерну мову. Основна причина цього - це можливість зрозуміти розібраний код і, можливо, можливість написати більш ефективні частини коду (наприклад, через c ++), робити щось подібне до печер коду тощо. , отже, з цілей, про які я згадую, як слід починати? Яку збірку я повинен навчитися? Я хочу навчитися, спершу виконуючи прості програми (тобто калькулятор), але сама мета полягатиме в тому, щоб пройти обстеження, щоб я міг зрозуміти код, показаний, наприклад, IDA Pro.

Я використовую Windows (якщо це має значення).

редагувати: Отже, схоже, всі вказують на MASM. Хоча я розумію, що він має можливості високого рівня, але все добре для програміста програмного коду, це не те, що я шукаю. Це, мабуть, є, якщо, посилайтесь на тощо, інструкції не відображаються у популярних дезінселерів (наприклад, IDA). Тож, що я хотів би почути, якщо це можливо, - це думка кожного, хто використовує ASM для тих цілей, про які я прошу (читаючи розібраний код exe в IDA), а не лише "загальних" програмістів для збирання.

редагувати: Гаразд. Я вже навчаюсь складанню. Я вивчаю MASM, не використовую речі високого рівня, які для мене не мають значення. Що я зараз роблю, це випробовувати мій код на __asm ​​директивах у c ++, тому я можу спробувати все набагато швидше, ніж якби мені довелося робити все з нуля з MASM.


З таким запитанням stackoverflow.com/questions/1355524 / ...
TrueWill

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

Якщо ви знаходитесь у Windows, ціль (тобто процесор, і таким чином набір інструкцій) становить x86 або x86-64. Якщо ви не отримаєте іншу машину або плату MCU або не використовуєте емулятор. Отже, це питання, яким асемблером я повинен користуватися? Або ви справді запитуєте, на яку архітектуру орієнтуватися? Особисто я люблю приємну ортогональну інструкцію, встановлену на чіпах серії m68k, на жаль, alack.
dmckee --- кошеня колишнього модератора

2
"Схоже, є інструкції, якщо, викликати тощо," - це макроси ("M" у "MASM"), і вам не доведеться використовувати їх, навіть якщо асемблер підтримує їх.
ChrisW

3
Це важке рішення було дати питання 65-й підсумковій, 64 це така гарна кількість. . .
735Тесла

Відповіді:


40

Почніть з MASM32 і звідти подивіться на FASM . Але ви будете веселитися з MASM.


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

1
В основному це було б як написання коду оп, що насправді не має сенсу. Вивчення MASM32 допоможе вам зрозуміти, як виглядає код у відладчику. Ви також можете перевірити OllyDbg: ollydbg.de
полудень Шовк

7
Ви не розумієте складання. Вам потрібно це зрозуміти. Опкод - це число. Налагоджувачі намагаються вирішити коди до своїх інструкцій (іноді це важко). Потрібно зрозуміти основні вказівки. Вивчення MASM допоможе вам це зробити. Більше не треба говорити.
Полудень Шовк

5
Вам не доведеться використовувати всі функції MASM лише тому, що вони є; ви можете зробити так важко читати, як хочете, якщо ви думаєте, що так навчитесь.
JasonTrue

3
MASM, з його примхами, помилками і так званими особливостями високого рівня, зробив більше, щоб збити з пантелику програмістів-монтажників - як початківців, так і експертів - більше, ніж я можу придумати.
IJ Kennedy

44

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

Напишіть власний розбирач. Не для того, щоб зробити наступний найбільший розбирач, цей суто для вас. Мета - вивчити набір інструкцій. Я навчаюсь асемблеру на новій платформі, запам'ятовуючи асемблер для платформи, якою я колись знав. Почніть з лише декількох рядків коду, додаючи наприклад регістри та ping pong-ing між розбиранням бінарного виводу та додаванням все більш складних інструкцій на стороні введення:

1) вивчити набір інструкцій для конкретного процесора

2) дізнайтеся нюанси того, як писати код у збірці для згаданого процесора, щоб ви могли змішувати кожен біт опкоду в кожній інструкції

3) ви засвоїте набір інструкцій краще, ніж більшість інженерів, які використовують цей набір, щоб заробити собі на життя

У вашому випадку є декілька проблем, як правило, я рекомендую розпочати інструкцію щодо ARM, сьогодні є більше продуктів на основі ARM, ніж будь-які інші (в комплекті є комп'ютери x86). Але ймовірність того, що ви зараз використовуєте ARM і не знаєте достатньої кількості асемблера, щоб написати стартовий код або інші підпрограми, знаючи ARM, може допомогти або не допомогти тому, що ви намагаєтеся зробити. Друга і важливіша причина спочатку ARM полягає в тому, що довжини інструкцій мають фіксований розмір та вирівнювання. Розбирання інструкцій змінної довжини на зразок x86 може бути кошмаром як ваш перший проект, і мета тут - навчитися набору інструкцій не створювати дослідницький проект. Третя ARM - це добре зроблений набір інструкцій, регістри створюються рівними і не мають індивідуальних особливих нюансів.

Тож вам доведеться розібратися, з якого процесора ви хочете почати. Я пропоную спочатку msp430 або ARM, потім спочатку ARM або другий, а потім хаос x86. Незалежно від того, на якій платформі варто використовувати будь-яку платформу, дані, що містять інструкції, а також кодування опкодів (біт і байтів машинної мови), не мають постачальників даних або довідників програмістів. Для того, щоб дізнатися, що робить компілятор, і як писати код, з яким компілятор не повинен боротися, добре знати декілька наборів інструкцій і бачити, як однаковий код високого рівня реалізується для кожного набору інструкцій з кожним компілятором з кожною оптимізацією. налаштування. Ви не хочете вникати в оптимізацію свого коду лише для того, щоб виявити, що ви зробили це краще для одного компілятора / платформи, але набагато гірше для кожного іншого.

О, для розбирання наборів інструкцій змінної довжини, замість того, щоб просто починати на початку та розбирати кожне чотири байтове слово лінійно через пам'ять, як це було б з ARM або кожні два байти, як msp430 (msp430 має інструкції зі змінною довжиною, але ви все одно можете отримати лінійно проходить через пам'ять, якщо ви починаєте з точок входу з таблиці переривань вектора). Для змінної довжини потрібно знайти точку входу на основі векторної таблиці або знань про те, як завантажується процесор і слідувати коду в порядку виконання. Вам потрібно повністю розшифрувати кожну інструкцію, щоб знати, скільки байтів використовується, якщо ця інструкція не є безумовною гілкою, припустимо, що наступний байт після цієї інструкції - інша. Ви також повинні зберігати всі можливі адреси філій та припускати, що це відправні байтові адреси для отримання додаткових інструкцій. Одного разу, коли я був успішним, я здійснив кілька проходів через бінарне. Починаючи з точки входу, я позначив цей байт як початок інструкції, потім лінійно розшифровувався через пам'ять, поки не потрапляв на безумовну гілку. Всі цілі філій були позначені як вихідні адреси інструкції. Я зробив кілька проходів через двійковий файл, поки не знайшов нових цілей гілки. Якщо в будь-який час ви знайдете, скажімо, 3-байтну інструкцію, але чомусь ви позначили другий байт як початок інструкції, у вас є проблеми. Якщо код був створений компілятором високого рівня, цього не повинно відбуватися, якщо компілятор не робить щось зло, якщо в коді є рукописний асемблер (як, скажімо, стара аркадна гра), цілком можливо, що існуватимуть умовні гілки, які ніколи не можуть трапитися, як r0 = 0 з подальшим стрибком, якщо не нулем. Можливо, вам доведеться відредагувати ті, які випадають з двійкового файлу, щоб продовжити. З ваших найближчих цілей, які я припускаю, будуть на x86, я не думаю, що у вас виникнуть проблеми.

Я рекомендую інструменти gcc, mingw32 - це простий спосіб використання інструментів gcc для Windows, якщо x86 - ваша мета. Якщо не mingw32 plus msys - це відмінна платформа для створення перехресного компілятора з binutils та gcc-джерел (як правило, досить просто). mingw32 має деякі переваги перед cygwin, як значно швидші програми, і ви уникаєте dg пекла cygwin. gcc і binutils дозволять писати на C або збирати і розбирати код, і там більше веб-сторінок, ніж ви можете прочитати, показуючи, як зробити будь-яку одну або всі три. Якщо ви будете робити це за допомогою набору інструкцій зі змінною довжиною, я настійно рекомендую використовувати набір інструментів, що включає в себе розбиральник. Наприклад, сторонній розбирач для x86 стане проблемою для використання, оскільки ви ніколи не знаєте, чи правильно його розібрали. Частина цього також залежить від операційної системи, мета полягає в тому, щоб компілювати модулі у двійковий формат, який містить вказівки щодо маркування інформації з даних, щоб розбиральник міг зробити більш точну роботу. Вашим іншим вибором для цієї основної мети є створення інструменту, який може збирати безпосередньо асемблер для вашої перевірки, а потім сподіватися, що коли він компілюється у двійковий формат, він створює ті самі інструкції.

Коротка (гаразд трохи коротша) відповідь на ваше запитання. Напишіть розбирач, щоб вивчити набір інструкцій. Я б почав з чогось RISCy та легкого для навчання, як ARM. Після того, як ви знаєте один набір інструкцій, інші набагато простіше підібрати, часто через кілька годин, за третім набором інструкцій, ви можете почати писати код майже відразу, використовуючи таблицю / посібник для синтаксису. Усі процесори, які варто використовувати, мають таблицю даних або довідкове керівництво, яке описує інструкції до бітів і байтів опкодів. Вивчіть процесор RISC, як ARM, і CISC, як x86, достатньо, щоб відчути відмінності, такі речі, як проходження реєстрів для всього або можливість виконувати операції безпосередньо на пам'яті з меншою кількістю реєстрів або відсутністю. Три інструкції операнда проти двох тощо. Під час налаштування коду високого рівня, компілювати для більш ніж одного процесора та порівняти вихід. Найважливіше, що ви дізнаєтесь, це те, що незалежно від того, наскільки добре написаний код високого рівня, якість компілятора і зроблений вибір оптимізації мають величезну різницю в фактичних інструкціях. Я рекомендую llvm та gcc (з бінутами), не вироблятичудовий код, але вони є багатоплатформенними та багатоцільовими, і обидва мають оптимізатори. І обидва, і безкоштовні, і ви можете легко створити крос-компілятори з джерел для різних цільових процесорів.


Дякую за відповідь. Але я навіть не знаю, як написати розбиральник.
пожирав елізіум

8
"Напишіть свій власний розбирач" - я погоджуюся, саме так я це найкраще навчився. (Що з "Але я навіть не знаю, як написати розбиральник"?) LOL
slashmais

Я йду з тобою! Щойно купив MSP430 і книгу на ньому ... :)
Pepe

1
У мене є деякі MSP430 прикладів github.com/dwelch67 плюс кілька наборів команд імітаторів для експериментів з включенням навчання асемблера і т.д.
old_timer

Мені дуже, дуже подобається ця ідея.
Міллі Сміт

33

Збірка, яку ви писали б вручну, і збірка, створена компілятором, часто сильно відрізняються, якщо дивитися з високого рівня. Звичайно, внутрішні програми програми будуть дуже схожими (існує лише так багато різних способів кодування a = b + c, зрештою), але вони не є проблемою, коли ти намагаєшся щось інженеру змінити. Компілятор додасть тонну кодового коду до навіть простих виконуваних файлів: минулого разу я порівнював, що "Hello World", складений GCC, становив близько 4 кБ, тоді як якщо писати від руки в зборі, це близько 100 байт. Гірше для Windows: востаннє я порівнював (правда, це було минуле століття) найменший "Hello World", котрий я міг отримати моєму компіляторі Windows для тогочасного вибору для генерації, було 52 кБ! Зазвичай ця котловарна панель виконується лише один раз, якщо вона взагалі не впливає, тому це не сильно впливає на швидкість програми - як я вже говорив вище, ядро ​​програми, частина, на яку витрачається більший час виконання, як правило, дуже схожа, чи компільована, чи написані від руки.

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

Що ви хочете зробити, це взяти інструкції з архітектури IA-32 та AMD64 (обидва вони охоплені разом) з Intel та AMD , а також ознайомтеся з початковими розділами інструкцій та підказок. Можливо, прочитайте підручник або два на мові асемблера, просто щоб знизити основи мови складання. Потім візьміть малогозразок програми, яка вас цікавить, і розібрати її: перегляньте її потік управління і спробуйте зрозуміти, що це робить. Подивіться, чи зможете ви зафіксувати його, щоб зробити щось інше. Потім спробуйте ще раз з іншою програмою, і повторіть, поки вам не зручно, щоб спробувати досягти більш корисної мети. Можливо, вас зацікавлять такі речі, як "crackmes", що виробляються спільним інженерним співтовариством, і це завдання для людей, зацікавлених у зворотному інжинірингу, і спробувати сподіватися щось на цьому шляху. Вони варіюються по складності від базового (почніть тут!) До неможливого.

Перш за все, потрібно просто попрактикуватися . Як і в багатьох інших дисциплінах, при зворотній техніці практика робить ідеальною ... або, принаймні, кращою .


Я знаю, що коли ви компілюєте що-небудь з мовою високого рівня, ви отримаєте багато "сміттєвого" коду, який би не знадобився, він був закодований безпосередньо в зборі. Я також розумію, що існує різниця між програмістом експертних зборів та експертом-розбиральником. Але те саме можна сказати і про майже все інше.
пожирав елізіум

3
Мене турбує те, що, хоча теоретично я міг прочитати статті та зрозуміти, що вони означають, поки я не почну писати речі, я не вірю, що я справді це зрозумію. Ви кажете, що я можу почати із зміни невеликих частин коду, але для цього я спершу повинен знати, який тип збірки "ароматизує" IDA pro, наприклад.
пожирав елізіум

Крім того, що MSVC ++ використовує для вбудованого коду складання? МАСМА?
пожирав елізіум

15

Я буду суперечити основній частині відповідей і порекомендую MMIX варіант KnIX архітектури MIPS RISC. Це не буде настільки корисно, як мови монтажу x86 або ARM (не те, що вони є все найважливішими для більшості справ у реальному житті в наші дні ... ;-), але це розблокує для вас магію останніх Knuth версія найбільшого в історії шедевра з глибокого розуміння алгоритмів та структур даних - TAOCP , "Мистецтво комп'ютерного програмування". Посилання з двох цитованих нами URL-адрес - це чудовий спосіб почати вивчати цю можливість!


12

(Я не знаю про вас, але я був схвильований збіркою)

Простий інструмент для експерименту зі складанням вже встановлений на вашому ПК.

Перейдіть до меню «Пуск» -> «Виконати» та введітьdebug

налагодження (команда)

debug - це команда в DOS, MS-DOS, OS / 2 та Microsoft Windows (лише версії x86, не x64), яка запускає програму debug.exe (або DEBUG.COM у старих версіях DOS). Налагодження може виконувати функції асемблера, демонтажника або шістнадцяткової дамп-програми, що дозволяє користувачам інтерактивно вивчати вміст пам’яті (мовою асемблери, шістнадцятковим або ASCII), вносити зміни та вибірково виконувати COM, EXE та інші типи файлів. Він також має кілька підкоманд, які використовуються для доступу до певних секторів дисків, портів вводу / виводу та адреси пам'яті. Налагодження MS-DOS працює на 16-бітному рівні процесу, і тому вона обмежена 16-бітовими комп'ютерними програмами . FreeDOS Debug має "DEBUGX" версію, яка підтримує 32-бітні програми DPMI.

Підручники:


Якщо ви хочете зрозуміти код, який ви бачите в IDA Pro (або OllyDbg ), вам потрібно буде дізнатися, як структурується складений код. Рекомендую книгу Reversing: Secrets of Reverse Engineering

Я експериментував пару тижнів, debugколи я почав вивчати складання (15 років тому).
Зауважте, що debugпрацює на базовому рівні машини, немає команд складання високого рівня.

А тепер простий приклад:

Дайте aпочати писати збірний код - введіть програму нижче - і нарешті дайте gзапустити її.

alt текст


( INT 21відобразити на екрані знак ASCII, що зберігається в DLреєстрі, якщо AHреєстр встановлено 2- INT 20припиняє програму)


Мені довелося натиснути ctrl-c, перш ніж я міг ввести "g".
ericp

2
@ericp, вам не доведеться натискати ctrl-c. Наприклад, ви вводите a& [enter], щоб почати писати код складання. Якщо двічі натиснути [Enter], ви вийдете з режиму складання. g& [enter], щоб запустити його (за замовчуванням зміщено 100).
Нік Дандолакіс

це насправді викликає переповнення стека чи просто записує його на екран?
Янус Троельсен

1
@user, він просто пише назву цього сайту :-)
Нік Дандолакіс

@JanusTroelsen ці цифри (53, 74, 61 тощо) - це коди ASCII для 'S' 't' 'a' ... Кожен дзвінок Int21 друкує по одному символу за раз! Ось чому збірка НЕ ​​швидша :)
doug65536

8

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

Не відкладайте назви. Більшість першої частини книги - "Злом" у значенні цього слова Еріка Реймонда: творчі, дивовижні, майже хиткі способи вирішення важких проблем. Я (а може, і ви) був набагато менше зацікавлений у аспектах безпеки.


7

Я б не зосереджувався на спробі писати програми в зборах, принаймні не спочатку. Якщо ви перебуваєте на x86 (який я вважаю, що ви є, оскільки ви використовуєте Windows), є безліч дивних особливих випадків, про які вчитися безглуздо. Наприклад, багато інструкцій припускають, що ви працюєте в регістрі, який ви прямо не називаєте, а інші інструкції працюють у деяких регістрах, але не в інших.

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

Я б вважав основою такі:

  • реєстри: скільки їх є, як називаються і які їх розміри?
  • порядок операнду: add eax, ebxозначає "Додати ebx в eax і зберегти результат в eax".
  • FPU: вивчити основи стека з плаваючою комою та способи перетворення в / з fp.
  • режими адресації: [базовий + зміщення * множник], але множник може бути лише 1, 2 або 4 (а може бути і 8?)
  • умовні виклики: як параметри передаються функції?

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

Це, ймовірно, також допоможе озброїтися посібниками Agner Fog , особливо інструкцією з переліком. Він приблизно розповість, як дорога кожна інструкція, хоча це важче безпосередньо оцінити на сучасних процесорах. Але це допоможе пояснити, чому, наприклад, компілятор йде так далеко, щоб уникнути видачі idivінструкції.

Моя єдина порада - завжди використовувати синтаксис Intel замість AT&T, коли у вас є вибір. Я раніше був досить нейтральним з цього приводу, до дня, коли я зрозумів, що деякі вказівки абсолютно різняться між ними (наприклад, movslqсинтаксис AT&T - це movsxdсинтаксис Intel). Оскільки посібники написані за допомогою синтаксису Intel, просто дотримуйтесь цього.

Удачі!


3

Я почав вивчати MIPS, що є дуже компактною 32-бітовою архітектурою. Це скорочений набір інструкцій, але саме це полегшує розуміння для початківців. Ви все одно зможете зрозуміти, як працює збірка, не перевантажуючи її складністю. Ви навіть можете завантажити хороший маленький IDE, який дозволить вам скласти свій MIPS-код: clickic Після того, як ви отримаєте повісити його, я думаю, що було б набагато простіше перейти до більш складних архітектур. Принаймні, так я думав :) На цьому етапі ви отримаєте основні знання щодо розподілу та управління пам’яттю, логічного потоку, налагодження, тестування тощо.


3

Пропозиція використовувати налагодження є цікавою, з цим можна зробити багато акуратних хитрощів. Однак для сучасної операційної системи навчання 16-бітної збірки може бути трохи менш корисним. Розглянемо натомість використання ntsd.exe. Він вбудований в Windows XP (він, на жаль, пронизаний у Server 2003 і вище), що робить його зручним інструментом для навчання, оскільки він настільки широко доступний.

При цьому, в оригінальній версії XP страждає ряд помилок. Якщо ви дійсно хочете використовувати його (або cdb, або windbg, які по суті є різними інтерфейсами з тим самим синтаксисом команд та налагодженням back-end), вам слід встановити безкоштовний пакет інструментів для налагодження Windows .

Файл debugger.chm, що входить до цього пакету, особливо корисний при спробі з'ясувати незвичайний синтаксис.

Чудова річ у ntsd - це те, що ви можете вискакувати його на будь-якій машині XP, яка знаходиться поруч, і використовувати її для складання чи розбирання. Це робить / great / X86 інструмент навчання збірки. Наприклад (використовуючи cdb, оскільки він є вбудованим у запит dos, він інакше ідентичний):

(помилки символів пропускаються, оскільки вони не мають значення - також, сподіваюся, це форматування працює, це моє перше повідомлення)

C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`

Крім того, поки ви граєте з IDA, переконайтеся, що перевірити книгу IDA Pro від Chris Eagle (від’єднана, оскільки StackOverflow не хоче мені публікувати більше двох посилань на моє перше повідомлення). Це найкраща довідка там з рук.


1
+1 для книги Кріса Орла. Ви повинні покласти трохи любові до Sk3wl r00t;)
mrduclaw

3

Нещодавно я взяв клас комп'ютерних систем. Однією з тем була збірка як інструмент для спілкування з обладнанням.

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

З огляду на це, я схильний рекомендувати мою підручник з класу:

Комп'ютерні системи: перспектива програміста .

Комп'ютерні системи: перспектива програміста
(джерело: cmu.edu )

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


2

Я думаю, ви хочете вивчити мнемоніку опкоду (і їх параметри), яка виводиться ASCII, які виводяться розбиральником і які розуміються (можуть використовуватися як вхідні дані) асемблером.

Будь-який асемблер (наприклад, MASM) зробив би.

І / або вам може бути краще прочитати про це книгу (там були рекомендовані книги, так що я не пам'ятаю, які).


2

Ви займаєтесь іншими роботами по розробці вікон? На якому IDE? Якщо це VS, то немає необхідності в додатковому IDE просто для читання розібраного коду: налагоджуйте додаток (або додайте до зовнішнього додатка), а потім відкрийте вікно розбирання (у налаштуваннях за замовчуванням це Alt + 8). Крок і дивіться пам’ять / регістри так, як це робиться через звичайний код. Ви також можете зберегти вікно реєстрів відкритим (за замовчуванням Alt + 5).

Intel надає безкоштовні посібники , які дають як огляд базової архітектури (регістри, процесорні блоки тощо), так і повне посилання на інструкції. Коли архітектура дозріває і стає все складнішою, посібники з базової архітектури стають все менш читабельними. Якщо ви можете взяти в руки більш стару версію, вам, мабуть, буде краще місце для початку (навіть інструкції з P3 - вони краще пояснюють те саме базове середовище виконання).

Якщо ви хочете вкласти гроші в книгу, ось приємний вступний текст. Шукайте в амазонці "x86", і ви отримаєте багато інших. Ви можете отримати кілька інших напрямків від іншого питання тут .

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


2

Це не обов'язково допоможе вам написати ефективний код!

Коди op i iOS - це більш-менш "застарілий" формат, який зберігається із-за великого обсягу коду та виконуваних бінарних файлів для Windows та Linux там.

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

Таким чином, компілятори генерують код x86 за замовчуванням, і сучасні чіпи читають предки Op коди і переводять те, що вони бачать, в паралельні інструкції risc, з упорядкованим виконанням, спекулятивним виконанням, конвеєрним транспортом тощо, а також вони повною мірою використовують 32 або 64 регістри процесора насправді є (на відміну від жалюгідних 8, які ви бачите в інструкціях x86.)

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

У якийсь момент вам потрібно визнати, що 10-тисячні тисячі людей, що доклали зусиль, письменники-упорядники принесли свої сили, і, довіряйте їм.

Найпростіший і найпростіший спосіб отримати більш ефективний час виконання - придбати компілятор Intel C / C ++. Вони мають ринкову нішу для компіляторів efficeint, і вони мають перевагу в тому, що вони можуть запитати дизайнерів чіпів про те, що відбувається всередині.


Ваша історія дещо говорить про те, що процесори CISC внутрішньо стали процесорами RISC. Я, можливо, неправильно зрозумів, але це просто неправда. А жалюгідні 8? Сучасні процесори (скажімо, з 1999 року) включають ще багато: 10 гпр: EAX-EFLAGS, 80-бітний FP0-FP7, 64-бітний MMX0-MMX7, 128-бітний XMM0-XMM7, сегмент: CS-GS, спеціальні: CR0-CR4 , DR0-DR7, TR3-TR7, GDTR, IDTR, LDTR, MSR та на x86-64 також R8-R15. Не всі з них доступні через ring-3, але більшість з них використовуються останніми (після 2006 року) компіляторами GCC / VC ++. Всього трохи більше, ніж "жалюгідних 8";).
Авель

2

Щоб зробити те, що ви хочете зробити, я просто взяв посилання на інструкцію з набору Intel (можливо, не точну, яку я використав, але вона виглядає достатньою) та кілька простих програм, які я написав у Visual Studio і почав кидати їх у IDAPro / Windbg . Коли я вирощував власні програми, програмне забезпечення в crackmes було корисним.

Я припускаю, що ви маєте базове розуміння того, як виконуються програми в Windows. Але насправді для читання складання є лише декілька інструкцій, які слід вивчити, та декілька ароматів цих інструкцій (наприклад, є інструкція зі стрибків, у стрибка є кілька ароматів, як стрибок-якщо-рівний, стрибок-якщо-екх-це-нуль тощо). Після того, як ви засвоїте основні інструкції, досить просто отримати суть виконання програми. Перегляд графіку IDA допомагає, і якщо ви відстежуєте програму за допомогою Windbg, зрозуміти, що робити інструкція, якщо ви не впевнені, досить просто.

Трохи погравши так, я купив Hacker Disassembly Uncovered . Як правило, я тримаюсь подалі від книг із написом слова "Хакер", але мені дуже сподобалось, як ця детально поглибилася, як складений код виглядав розібраним. Він також займається оптимізацією компілятора та деякими ефективними роботами, які були цікавими.

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


1

Однією зі стандартних мов педагогічної збірки є MIPS. Ви можете отримати тренажери MIPS (шпигун) та різні навчальні матеріали для нього.

Особисто я не шанувальник. Мені більше подобається IA32.


MIPS приємно. 68000 теж є, і якщо ви дізнаєтесь 68000, ви можете писати бінарні файли, які працюють у MAME. :-)
Носредна

1

Мій особистий фаворит - NASM, здебільшого тому, що це багатоплатформа, і він компілює MMX, SSE, 64-бітні ...

Я почав компілювати декілька простих вихідних файлів C з gcc і "перекодувати" інструкцію асемблера з gcc-формату в формат NASM. Тоді ви можете змінити невеликі частини коду та перевірити підвищення продуктивності.

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



0

Тут багато хороших відповідей. Програмування низьких рівнів, складання тощо користуються популярністю у спільноті безпеки, тому варто шукати підказки та підказки, як тільки ви вирушаєте. Вони навіть мають кілька хороших навчальних посібників на кшталт цього на збірці x86 .


0

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

Вивчення неоптимізованого коду c / c ++ допоможе створити посилання на вид коду, який створює компілятор для ваших джерел. Деякі компілятори мають якесь застережене слово ASM, яке дозволяє вставляти машинні інструкції у свій код.

Моя порада полягатиме в тому, щоб на деякий час пограти з тими інструментами і промокнути ноги, а потім піднятися? вниз? прямий код асемблера на будь-якій платформі, на якій ви працюєте.

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


0

Ми дізналися збірку за допомогою набору для розробки мікроконтролерів (Motorola HC12) та товстої таблиці.


0

Я не знаю тему, але оскільки ви програміст Windows, я не можу не стверджувати, що це може бути більш доцільним та / або кращим використанням вашого часу для вивчення MSIL. Ні, це не збірка, але це, мабуть, більш актуально в цій епосі .NET.


0

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


Хм. Ви все ще можете самостійно викреслити додаткову збірку кодування, але для перемоги компілятора потрібно більше роботи, ніж раніше.
Носредна

0

Ви можете перевірити відеокурс xorpd x86 Assembly . (Я це написав). Сам курс платний, але вправи з відкритим джерелом, на github. Якщо у вас є досвід програмування, я думаю, ви повинні вміти працювати лише з вправами і розуміти все.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.