Как написать
Вставка
- Опубліковано 6 сер 2019
- #soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - t.me/softwareengineervlog
Спонсорство - donate.s0er.ru
Сайт платным контентом - soer.pro
Зеркало для видео Дзен Видео - zen.yandex.ru/id/5f578bdf22e2...
GitHub - github.com/soerdev
Чат для программистов - / discord
Группа ВК - codeartblog
Годный ролик, чтобы заинтересовать людей в ковырянии байтов. Но. Чувак, как же много неточностей и даже грубых ошибок, которые можно было сто раз заметить при монтаже.
- 1:27 include не подключает библиотеки. stdlib и stdio - части одной бибилотеки, стандартной бибилотеки C
- 1:47 очевидно, что условие когда-нибудь да сработает, потому что rand возвращает значения от 0 до RAND_MAX
- 3:30 пролог состоит из трёх команд, а не из двух
- 4:40 sub $0x10, %rsp - это не выравнивание стека, а резервирование памяти под локальные переменные
- 4:52 все наоборот jne/jnz - jump if not equal/jump if not zero, je/jz - jump if equal/jump if zero. Сравнение чисел производится вычитанием и Jxx инструкции работают с его результатом (в виде флагов). В видео все работает, потому что пропатченная команда отвечает не за прыжок внутрь then-блока, а наоборот, за прыжок к выходу из программы.
- 5:15 опкод jnz всегда обязательно 0x75, потому что так написано в intel software developers manual. Если там не 0x75, значит это другая операция (или у вас не ассемблер). А вот второй байт 0c действительно отвечает за смещение software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf (Vol. 2A 3-495)
- 5:30 ассемблерный код можно и нужно сопоставлять с бинарным кодом, потому что ассемблер переводит операции один-в-один. Другое дело, что у одной операции может быть хоть 20 опкодов, которые принимают немного разные значения или даже делают немного разные вещи
Бтв, единой спецификации вызова нет. Линукс (upd: GNU/Linux) и, вроде, макось традиционно испольуют x86-64 System V ABI uclibc.org/docs/psABI-x86_64.pdf, а на винде спецификация docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019 появилась только недавно, до этого MSVC делал "что-то", а ребята из cygwin это реверс-инженирили.
2) rand, уже задолбался объяснять, работает по псевдорандомному алгоритму, и надо просто знать алгоритмы чтобы понять, почему при seed = 1 не будет 10ки
3) Пролог состоит из двух команд + необязательное выделение фрейма в стеке (зависит от компилятора). Оно просиходит не всегда (может сделаю видео про это). Как правило если у функции нет вложенных вызовов, то и фрейм не выделяется, потому что смысла нет.
4) Если бы это было не "выравнивание", то выделилось бы 4 байта, а не 16. А выделение памяти под фрейм стэка всегда выравнивается. В данном случае это выравнивание нужно в связи с вызовом функции rand (про ABI ты уже писал), без вызова функции не будет выделения фрейма в данном примере.
5) Все так и есть, в СИ коде делает вход в условие, а асм перепрыгивание, поэтому они в инверсном отношении друг к дуруг. Возможно здесь нужно было более точно пояснить, что я говорил о сравнении в СИ
6) Это не так, jnz - это вообще мнемоника для запоминания группы опираций, и в зависимости от размерности смещения будет разный опкод (можешь сам проверить опкод 0f 85 и 75)
7) уже писал сто раз пропускаете слово "взаимооднозначно", ну и преобразования binary => asm => binary на разных ассемблерах могут дать разные результаты (упакует асм тот же jz другой инструкцией большей резмерности и досвидания)
К чему последний абзац? Я вроде про винду ни слова не говорил.
В целом хорошая попытка наброса, но просто сходи на "Compiler Explorer" (в гугле можно адрес найти), скомпилируй вот такой код:
int main() {
int a = 10;
return a;
}
и убедись что пролог гарантированно состоит только из двух команд (gcc).
@@S0ERDEVS
Про rand, это конечно мой фейл, дефолтный seed мало того что константный, так еще определен спекой (www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 7.20.2.2 The srand function). Признаю, был не прав. (В свое оправдание могу сказать, что стандартным генератором пользовался давным давно и привык, что обычно seed уже какой-то есть, как в g_rand_new)
В остальном, я воспринял некоторые фразы из видео слишком буквально ("sub - не часть пролога", "sub == выравнивание", "0x75 0x0c jnz, а может быть 0x85 0x0c jnz"). Подумал, что некоторые твои зрители могут тоже слишком буквально и неправильно понять эту информацию. Особенно те, кто только начинает заниматься такой низкоуровневой штукой.
У тебя получился интересный видос, который определенно заинтересует людей заниматься ассемблером, реверс-инженирингом и возможно какими-нибудь компиляторами.
PS: если кому интересно, то не резервируется память на стеке из-за red zone (все тот же System V ABI 3.2.2 The Stack Frame). tl;dr: это запас стека, чтобы оптимизировать листовые функции. Но размер этого запаса не очень большой, поэтому в какой-то момент sub все таки добавится gcc.godbolt.org/z/HLcl3V. (это, как и предыдущий последний абзац - просто "by the way" для мимо проходящих, чтобы облегчить им поиски информации)
Совершенно верно, все дело в красной зоне, которая составляет 128 байт. И, кстати, добавится не обязательно sub, многие компиляторы (не уверен что все), если нужно зарезервировать фрейм стека равный 128 байт сделают это через add rsp, -128, просто чтобы сэкономить два байта на инструкции. Это еще одна причина по которой я бы не относил резервирование и выравнивание фрейма к прологу.
В целом мне нравится твой конструктивный подход, считаю, что твои комменты лучшие из опубликованных здесь. Поэтому закреплю их чтобы все кому интересно могли прочитать.
По поводу оговорок и неточностей в видео, то они будут всегда, так как я пишу без сценария и с одного дубля, поэтому мозг иногда "глючит", так как думаешь сразу о нескольких вещах.
Во вы тут шарите оба 😀👍, я то вообще просто чуть чуть на питоне пишу 😅😁
Software Engineer - Soer у
8:30 Про reverse engeneering, анализ вредоносного кода и спец. тулзы хотелось бы посмотреть видео в Вашем исполнении.
Жду с нетерпением!)
То чувство когда новичок:
Нихуя не понял, но очень интересно
ага, особенно когда он на 4:16 сказал "ок, все понятно" )))
Мнение Артемов не учитывалось.
то чувство, когда зачем 20 айкью челики лезут в програмирование
@@YWNWA-ZXC то чувство, когда зачем 60 айкью челики лезут в термины, значения которых не знают даже приблизительно.
Ты не одинок:)))☺Есть куда стремится☺☺☺
Спасибо большое за ваш труд, очень познавательно. Классный стиль подачи.
Блин, если бы ты написал серию уроков по С, я мог бы купить у тебя видео. Не реально просто, спокойно, доходчиво и внятно объясняешь.
А что, C сложный язык? Вроде один из самых легких и минималистичных. Там и изучать особо нечего. Вот чтобы хорошо писать на C, надо уже хорошо знать архитектуру компьютера, принцип работы ОС и так далее. Сам по себе язык очень легкий.
@You Tube то есть не надо знать, как работает память… а чтобы писать какие-то вообще низкоуровневые вещи, не надо ничего знать про прерывания и про взаимодействие железа между собой, ну а написание какой-нибудь дисковой утилиты, естественно, не потребует никаких знаний про загрузочные области, разбиение на сектора и прочее. Ну удачи!
@You Tube На си глупо писать что-то прикладное, для этого есть другие языки. Каждый язык эффективен в своей сфере. НЕ, конечно, Си универсален и на нем можно написать, что угодно и да, даже не зная ничего об устройстве компьютера, но тогда и изучать этот язык смысла мало. Си и хорош тем, что позволяет писать практически на уровне железа.
Кстати, ассемблер не плохо изучить вторым языком после Си. Начинаешь лучше понимать, как любые программы работают под капотом.
Есть, конечно, и другой путь, изучить устаревший jQuery и считать себя крутым программистом. Какое-то время назад даже была такая мода.
@You Tube чушь пишите вы. Особенно улыбнуло, что на нем ничего писать нельзя )))) Хотелось бы почитать, что же на нем нельзя написать. Ну и по поводу железа, вы не в курсе, что куча драйверов, прошивок, низкоуровневых утилит написаны на Си? Ну изучите вопрос получше. В конце 80х, начале 90х на нем реально практически все писали. Советую почитать по тьюринг-полные языки.
Но врать не буду, задач на Си и Ассемблере у меня не было, изучал их именно с точки зрения лучшего понимания того, как работает ПО.
@You Tube Почему меня старается учить человек, который Си даже в ближайшем приближении не трогал? Я не профи в данном языке, но я хотя бы представляю его возможности.
Я жду пример того, что на Си нельзя написать и объяснение почему. Иначе все это пустой треп человека, который ни хрена ни в чем не разбирается, но почему -то хочет учить других.
В моем мире на C пишут все, от прошивок железа до графических редакторов, хоть это и не самый оптимальный для этого вариант. Если задаться целью, можно собрать комп из железа и полностью написать программное обеспечение для него на C, ну вот полностью, даже компиляторы для каких-то интерпретируемых вспомогательных языков.
А вот в вашем вымышленном мире он мало на что способен.
Очень доходчиво, жду ещё по данной тематике. И то что было озвучено про разные особенности интересно узнать, и где почерпнуть эти знания
Первый раз в жизни подписываюсь на канал с первого видео.
А то мало ли, годноту такую пропущу 🌚
сэйм шит)
Отдельное спасибо за vi(m) и linux terminal, мне, как чайнику в языках семейства C, но умеющему в, упомянутые ранее, тулзы было очень легко повторить за Вами и, на практике, пощупать эту тему. 👍
Круто, интересно, познавательно. Продолжайте в том же духе. Однозначно лайк
Круто, на более низкоуровневые темы видосы офигенно интересны
*Ты просто в 80-х с кодом не работал, иначе тебе всё это, уже в печёнку засело бы. ;)*
@@Time_Developer не работал ;) меня тогда даже в планах не было, но я этому даже рад) слишком привык к современным удобствам при разработке, смотрел сериал "Остановись и гори" там эта тема интересно раскрывается;)
@@artawowerlh7761 *, на сериалы, у меня нет времени, да и современный кинематограф, мягко говоря скатился в говно.* _Но это моё, субъективное мнение._
Да, такие дяди редко на ютубе обитают, Асемблер по буквам расписал, четенько и с расстановкой, интересную тему поднял. Это вам не javascript за час :) Лайк + подписка однозначно...хотелось бы про GDB инфы в таком формате.
отличная подача. Приятно смотреть и слушать
хорошо выглядишь, картинка и формат супер! респект!
Про реверс инжиниринг всегда интересно было почитать и посмотреть, буду ждать новых подобных видео!
Спасибо за видео. Очень понравилось.
Спасибо за ролик! Хотелось бы ещё по такой тематике !
Очень интересно. Ждём продолжение видео по данной теме.
Ну я прам в детство окунулся свое босоногое...
SoftIce, IDA, патчи)
Огромное спасибо за ролик, очень доступно и понятно!
Очень круто! Интересно было бы увидеть как выглядел бы исходных код для измененного binary файла.
Спасибо! Подписка и лайк!
20 лет объясняли не чего не понимал, а тут за 9 минут все понятно. МОЛОДЕЦ.
А вот это реально топовый контент!
Ждем видео про реверс инженеринг)
Подписка и лайк!
Очень хотелось бы более углубленного изучения темы и ссылки на источники для изучения)
Очень простой, понятный и одним словом годный пример ящетаю.
Спасибо за ролик
Про то, почему ассемблерный код нельзя однозначно сопоставлять с бинарным, хотелось бы услышать.
Поддерживаю.
Потому что ассемблер - это язык программирования, который компилируется в объектный код, а потом линкуется в машинный, точно так же, как любой другой компилируемый язык. И в результате там могут варианты, которые при разном бинарном коде делают одно и то же.
+
*
Если автор затеет все это объяснить, то за 10 -15 минут, увы, не получится. Это глубокий океан, где показали одну каплю из всего того, что на самом деле под капотом программ. Ассемблерный код должен получиться откуда-то, как вы думаете? Два варианта - исходник или дизассемблированный листинг. Исходник, это дело понятное, а вот что касается дизассемблирования, то здесь получается, что мы берем чужой код, чтобы получить его исходник - используем дизассемблер(или отладчик, хотя обычно используют два этих инструмента в паре) и вуаля. Так как дизассемблер может превратить двоичный код в листинг с инструкциями на асме? Автор имел ввиду нечто другое и , надеюсь, он это объяснит далее)
круто! Огромное спасибо! Видать не зря я ассемблер учил в инсте. С инста его не вспоминал))
В программировании полный я 0, но приятно посмотреть такие видео так как видно что человек не только рассказывает, а именно понимает цепочку взаимодействий и что откуда берется. Лайк без вариантов
Эхх, обожаю так дома одеваться, рубашка, футболочка... Круто. За видос конечно отдельное спасибо и лайк)
Очень интересная тема, и хорошая подача материала! Я за разбор более продвинутых инструментов.
Спасибо за видосы по лоу леволу. Очень познавательно!
+ за анализ двоичных файлов, интересно.
Все файлы двоичные.
@@RogovAB В спицификации файлов есть текстовые и двоичные файлы. Так что не надо тут умничать. Учите матчасть. Для этого даже предусмотрен флаг "b" для бинарных файлов. От этого флага зависит поведение многих операций с файлами.
@@serhiis_ флаги и спецификации не меняют сути. Не двоичый фаил, это например, троичный. А текстовый фаил, это двоичный фаил с ограниченным набором двоичных кодов в рамках печатных символов. И нечего тут демагогию разводить. Поведение зависит от функции файла. Двоичный нетекстовый фаил может быть исполняемым, а может таковым не быть... и т.п.
@@RogovAB ты тупой? Есть такой предмет информатика. Вот иди учи матчасть. Термины свои решил вводить - ты профессор или кто? Кто тебе право новые термины вводить дал? Если там черным по белому написано что есть 2 типа файлов. Аксиома Вася.
@@serhiis_ Не нужно быть профессором, что бы понимать столь простые вещи.
Классный и познавательный видос, спасибо!
Лайк, однозначно, теперь сравнил видеокурсы по программированию, где 1 урок это установка IDE и с этим видео. Просто батя
Спасибо Вам за видео, действительно было бы интересно услышать, почему в настоящее время нельзя однозначно сопоставлять ассемблерный код с бинарным.
Большое спасибо за полезную информацию
Спасибо.Хотим услышать...
жизнь современная преподносит такие пердимонокли, что я подписался на Ваш канал!
Вот это годнота, спасибо!
Будет очень интересно послушать про PE-format или ELF-format, спасибо, лайк.
Как насчет MACH-O? Почему обижаете MacOS?
Моему макбуку 14 лет что-то я забыл про него совсем :)
Да, это интересная идея для видео
По формату Windows PE-file есть туториалы замечательного программиста Iczelion. У него есть много примеров и детально расписаны отличия современного формата от DOS. Также вы найдете очень много его работ по программированию окон на masm. По моему даже COM-обьекты у него есть. Не пугайтесь что он очень старый, ассемблер и винапи за 30 лет ни чем не поменялись. Скорее в винапи добавили новые баги а так все ровно.
@@serhiis_ Еще по форматам полезная информация:
ua-cam.com/video/4BAuES723xI/v-deo.html
bit.ly/1cdrfel
Спасибо большое за ролик.
Почему такой прекрасный канал имеет столь мало подписчиков ?
Спасибо за ваш труд .
Ну это же не Хауди Хо и не Гоша "Стань сеньором С++ за час" Дударь. У серьезных каналов мало зрителей.
@@BoostBrainCourseабсолютно согласен с вами.
Очень интересно,уже 6000 лайков,скидывай видос про серьезные инструменты для работы с двоичным кодом
Я сначало подумал что это Линус Торвальдс!
Это он и есть... Он русский с детства учил. о_О
Александр Ярославов Рили?
Industrial dawn И это его канал? 🌚🌝
это его аватар
Ъьъыъьы Ъьъыъьыъ ого, моя мама кулхацкер, круть 😂👌
хороший голос, интересно и класно слушать, лайк подписота
Интересно, лайкнул, подписался. Жду видео про то- почему ассемблер не машинный язык 👅 ))
3001 раз нажал лайк, снимайте)
Привет, хотелось бы побольше о реверсе, с использованием ida, поиск функции их подмена и расширение. О extended как полноценная модификация приложения с новым функционалом и тд.
ну хотя бы что-то по данной тематике, а то тема вообще не мейнстрим , хотя безумно интересно для думающих людей!Спасибо за начало!
1) реверс инжиниринг программ для mac os, ios в hopper, и
2) Поиск вредоносного кода (желательно тоже mac os app).. мой топчик..
Отличный ролик! Лайк и подписка
Вспомнил своё дремучее детство. Спасибо.
Спасибо за видео!
Раньше несколько раз видел уже твои видео
Однако только сейчас понял, что твой контент - именно то что мне нужно
Лайк, подписался
Рад что на ютубе все еще есть действительно полезный контент
Жаль что такие самородки, как твой канал, очень сложно бывает найти за завесой из всего кала нынешнего потребительского поп контента
Классное видио, очень интересно.
Даешь еще ролики про ассемблер! Кстати заодно посоветую всем книжку Чарльза Петцольда - "Код". Как раз про то с чего все начинается и как устроено.
Подписка, лайк, за такой контент и донат можно
Мужик офигенное видео!
Круто. Классное видео.
Спасибо, даже шутить не хочется. Просто спасибо
Искал другое, но решил зайти посмотреть о чём Линус вещает, полезно в любом случае. Ой! А он по-русски шпрехает)))
Пять с плюсом за всё! Подписываюсь и буду пересматривать все видео.
да,пожалуйста рассказывай ,очень интересно
было бы круто послушать про все секции бинарника и в подробностях
Смотрю рекомендации, вижу превью, думаю "О! Торвальдс начал выпускать обучающие видео! Класс!"
Подписался, годнота!)))
Всё правильно рассказал, точно выдержаное содержание, полностью раскрыта тематика, и правильно сформирован ответ на тему. Очень интересно рассказано, с наглядным примером. Пока писал коментарий, досмотрел до конца. В данном ролике есть и одна существенная беда. Я ничего не понял про что здесь говорится!!! О чём всё это?
P.S. Если серьёзно, я восхищаюсь такими неординалными личностями как Вы. Мышление должно быть вероятно нестандартное. Воистину - ни..уя не понял, ну очень интересно! Для чего смотрел, тоже непонятно!
думал я зря си учил, будет что попробовать)
Как здорово, что вы все обьяснили😀, но так плохо что я ни хр.. На не понял))
Хотелось бы про динамический патчинг: хуки, патчи опкодов в памяти и т.д. Но для начала неплохой старт.
Очень приятно вновь посмотреть на извращения бурной молодости, спасибо!
Ничего не понял , но на всякий случай передернул
Такую рекламу под чаёк запустили, что я забыл что включил твой ролик.
Я тут случайно. Из web. Интересное видео. Лайк.
Больше подобных видео!
я спать, пошёл, чтобы завтра под этим видосом было 3К лайков, и соер снял годноту
Классное видео, хочу услышать о более мощных инструментах!
Оооо, ааа, офигенно) всегда было интересно, как делаются патчи
Да, расскажите, пожалуйста, почему машинный код нельзя сопоставить с бинарником?
Подписался на ваш канал. Спасибо за видео. ОЧЕНЬ интересно было бы про неоднозначное сопоставление кода на ассемблере с бинарным и почему так 5:20)
Там все просто. Некоторые однотипные комманды имеют разный код в зависимости от операнда. Например операндом может быть регистр общего назначения, и специальный регистр. Хотя сама комманда делает с ними одно и тоже, но процессору для доступа к ним необходимо использовать разные физические реализации.
ого очки очень круто дополняют твой образ
Лайкосик с меня 👍
Оценил отсылку к Торвальдсу в превью! 👍
Посмотрел до конца.Сразу вспомнил COUB с ютуба: Ни..я не понял, но очень интересно.
Ничего не понял, но очень интересно. Поставил лукас.
крутой чувак подписка сразу
Годный контент
спасибо, теперь я понял как делают крэки )
это офигенно. Давай про реверс-инженеринг.
Вот же ты хищник. Терь все твои видосы посмотрю
Ok. Всё понятно!
умница!
в начале видео мой взгляд упал на книги, на заднем фоне. Я пригляделся и увидел книгу, что в тот же момент лежит у меня на столе)) Книжка Макконнелла))) Значит не зря я ее купил)
Годнота
из всего понял только два слова - код и патч ,но слушать было интререстно ))))
Кому интересно, то про декодирование процессорных инструкций и как меняется опкод в зависимости от операнда коротко и понятно написано в главе 12.3 книги "Assembly language for x86 processors"(книга есть и на русском языке).
Круто!
Ем пельмени и смотрю этот ролик, не знаю зачем :)
спасибо!
интересно спасибо
Да тебе просто повезло!
какая годнота!
быстрее бы 3 тыс лайков!!!
Вы уже рассказывали о других программах подобных objdump?
Прикольно. Та часть меня, что ещё помнит магистратуру, говорит "а, ну чувак элементарные вещи про асм чуток расскажет, следующий". Вторая часть, помнящая, что я работаю в вебе и что половина коллег не знает что такое выделять и чистить за собой память - "круто". А потом до кучи ещё и что-то новое узнаю - про одинаковое наименование в асме разных команд, что действительно даёт ещё одну причину не ожидать точного соответствия между ним и бинарником на выходе.
Здорово. Больше комментов богу комментов, помогаем распространению видосов, повышающих уровень компьютерной грамотности.
Побольше про утилиты для декомпиляции и анализа бинариз пожалуйста :-)