Стоит ли учить ассемблер если хочу научиться реверсингу? Или достаточно понимать какой код ассемлера соответствует коду языка Си? Если да, то какие книги посоветуете?
Почему именно си? Программы же не только на нём пишутся. Учится писать программы на языке ассемблера стоит, потому что при реверсинге вам придётся анализировать вывод дизассемблера, а без опыта написания собственного кода это будет проблематично.
Это не отменяет того факта, что куча программ написана не на си. В реверсинге нужно не ассемблерный код в сишный переводить, а понимать семантику того, что делает конкретный ассемблерный код. Правда для этого бывает полезно знать, какой примерно код выдаёт компилятор языка, на котором написана программа. Например, в том же c++ в отличие от си есть vtables, а в каких нибудь языках со сборщиком мусора и рантаймом есть обращения к рантайму и сборщику мусора. И все эти нюансы надо иметь в виду, когда занимаешься реверс-инженерингом
Мне кажется, прям "учить" не нужно. Главное уметь читать листинги и понимать что происходить.
В общем случае сопоставить ассемблер с сишкой не получится.
Тут зависит от целей автора. Если он собрался реверсить что-то, что по сложности сопоставимо с типичным "Hello world", то, возможно, базового понимания и хватит.
А если что-то уровня коммерческих протекторов типа Oreans, то придется потратить достаточно времени на обучение.
Под реверсингом насколько я понял имеется в виду реверс-инжинеринг. Скорее всего - по ситуации. Какими тулами ты пользуешся? Если они выдают достаточно информации - то тогда не надо.
Но я-бы учил не для реверса а для понимания например железа и архитектуры. Просто это часть стека который мы каждый день используем. Как арифметика в быту. Деньги считаем. Значит знаем.
Хотя мне кажется что в наше время зарабатывать на реверсе так-же бесполезно как и на трейдинге. Какие-то редкие случайные заказы. Вот на собственной разработке - поднимешь больше всегда.