Обновить
32K+

Отладка *

Поиск и устранение ошибок в коде

20,9
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

OllyDbg при смерти — спасение наработок отладочной сессии

Время на прочтение45 мин
Охват и читатели19K

Если вы используете OllyDbg не для отладки собственных приложений, для которых у вас есть отладочная информация, а для реверс-инжиниринга или исследования сторонних, типичная ваша деятельность — это вникание в машинный код чужого продукта, осознание сути происходящих вещей и расстановка большого числа меток (labels) и комментариев по всему коду, а также по секциям данных. Вы планомерно разведываете суть процедур/функций и переменных и даёте им имена, отражающие ваше понимание их предназначения.


OllyDbg не нуждается в представлении для всех, кто занимается отладкой, реверс-инжинирингом приложений, исследованием или обходом механизмов защит и т.п. Это один из лучших user-modeных отладчиков для Windows, хотя нельзя замалчивать и большое число недостатков и недоработок в нём.
И вот спустя несколько часов (а то и дней) работы, когда вы разобрались и подписали сотни, а то и тысячи процедур и переменных, OllyDbg внезапно зависает или вылетает, унося в небытие все ваши наработки (в которые могут входить не только labels и comments в большом числе, но и расставленные в нужных местах брекпоинты и модификации). Это потеря времени и чудовищно демотивирующий фактор, от которого опускаются руки и бледнеет лицо.


Эта статья о том, как я в такой экстренной ситуации использовал OllyDbg для того, чтобы оперативно разреверсить OllyDbg (частично), спасти висящие на волоске данные и выработать рецепт действий на случай таких катастроф.

Читать дальше →

Особенности структурной обработки исключений в Win64

Время на прочтение11 мин
Охват и читатели4.4K

В процессе перевода своих средств программирования на платформу x86-64 потребовалось перевести и встроенный интерактивный отладчик. В отличие от подключаемых отладчиков данный отладчик находится, так сказать, непосредственно «на борту» каждой исполняемой программы. При этом он имеет сравнительно небольшие размеры (около 44 Кбайт, большую часть которых занимает дизассемблер). Я так привык к этому отладчику, что уже совершенно не могу без него обходиться, и поэтому перевод в 64-разрядную среду стал настоятельно необходимым.

Однако формальный перевод с Win32 в Win64 дал такие странные результаты, что пришлось потратить много сил и времени, чтобы разобраться, почему то, что ранее работало в Windows-XP, перестало нормально работать в Windows 7. Виной всему оказалась структурная обработка исключений, практически не задействованная ранее в среде Win32.

В процессе разбирательства я прочел множество обсуждений на эту тему на компьютерных форумах. Задаваемые вопросы (и особенно ответы) показали, что многие программисты смутно представляют конкретную реализацию структурной обработки исключений в Windows 7. Поэтому кажется полезным пояснить некоторые особенности поведения системы на примере конкретной задачи, в результате чего и появилась данная статья.

Читать далее

О реализации ввода-вывода с именами

Время на прочтение11 мин
Охват и читатели2.3K

Как-то на одном из компьютерных форумов участники делились соображениями, чего им не хватает в языках, так сказать, в повседневной деятельности. Один заявил, что ему очень не хватает оператора типа put data. Для тех, кто не слышал о таком, поясню, что в языке PL/1 был предусмотрен оператор вывода (или ввода) значений переменных вместе с их именами, т.е. вместе с идентификаторами.

Например, если обычный вывод put list(X,Y); давал что-нибудь вроде:

1280    1024

то оператор put data(X,Y); печатал:

X=   1280  Y=   1024

не заставляя писать для этого вывод в виде оператора:

put list(’X=’,X,’Y=’,Y);

Чаще всего это использовалось в отладочных целях, но не обязательно. Например, используя вывод в текстовый файл с помощью put data, а затем ввод этих же данных как исходных в другой программе с помощью «зеркального» оператора get data можно было получить удобную для чтения и редактирования форму представления исходных данных в текстовом виде.

Можно возразить, что современные «оболочки» систем программирования легко позволяют вывести значения (и имена) любых объектов программы в интерактивном режиме безо всяких put data и поэтому в нем больше нет необходимости.

Я тоже использую встроенный интерактивный отладчик, с помощью которого можно посмотреть любые, даже сложные (составные) данные. Однако потребность в возможностях put data не исчезла. Иногда нужен и анализ данных «на распечатке», (т.е. в логе) с возможностью быстрого и удобного добавления вывода для отладки. К тому же для работы отладочных интерактивных систем используется дополнительная информация, которая обычно в выполняемом exe-файле отсутствует. В этом же случае все имена переменных «зашиты» в самой программе. Таким образом, удобства, предоставляемые языком в виде оператора, подобного put data, не заменяют, а дополняют возможности отладчиков. Кстати, в стародавние времена так называемая «посмертная» выдача на печать после ошибки иногда включала в себя и вывод полного списка всех имен переменных вместе с их текущими значениями. Некоторым программистам так нравился такой вывод, что они специально в конце своей программы ставили деление на ноль.

Читать далее

Шпаргалка полезных команд GDB

Время на прочтение3 мин
Охват и читатели89K

Для кого она нужна?


1) начинающих реверсеров, знающих особенности обратного проектирования, и желающих изучить такой отладчик как GDB


2) как подсказка тем кто постоянно работает с IDA, Ghidra или любым другим мощным и надежным инструментом, но в силу тех или иных обстоятельств решить задачу проще и быстрее с помощью GDB, и не очень хочется залезать в официальную документацию и снова все вспоминать

Читать дальше →

Легкие обновления

Время на прочтение2 мин
Охват и читатели1.9K
Напоследок немного новостей о «смотрелке» для логов chipmunk. Ничего особенного, никаких кардинальных изменений или же заметных фитч, а скорее работа над ошибками, да и просто хочется сказать пару слов о прошедшем, настоящем и будущем.
Читать дальше →

pprof в golang: Исправляем утечку памяти

Время на прочтение6 мин
Охват и читатели22K

После весеннего "локдауна" (тогда у меня внезапно появилось время и xswitcher расписать и статью выпустить, да ещё и детей учить "на удалёнке"), моё время опять как-то всё быстро закончилось. Только сейчас, перед НГ получилось зачистить кое-какой тех. долг. И опять про golang (хотя я не сильно много на нём пишу).

"Зачистка" неожиданно заняла заметное время. Как оказалось, профилирование на go — не такая уж и разработанная тема. "Среднему" специалисту не так-то и просто найти подходящий материал. По такому случаю, нет повода не поделиться. Кому интересно максимально "прижатое" к задаче изложение (я старался), добро пожаловать под кат.

Читать далее

Типы в инженерных задачах

Время на прочтение17 мин
Охват и читатели5.9K

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

Несмотря на разнообразие задач, все их, пожалуй, можно отнести к одному классу, который я условно называю «инженерный», поскольку большей частью они оперируют понятиями научно-технического характера. При решении всех этих задач я не видел пользы в применении таких понятий, как «абстрактный» тип, т.е. назначению некоторого произвольного свойства объектам программы. Обычно эти свойства при трансляции имеют внутреннее представление в виде целых чисел.

Могут возразить, что я не вижу смысла в таких типах потому, что в старых языках (вроде используемого мною PL/1) вообще не было типизации в современном понимании. Нет, понятие типа все-таки было. Например, если в том же PL/1 описать два несовпадающих объекта пусть даже одинакового объема и попытаться присвоить один другому, то при компиляции получится предсказуемое сообщение об ошибке (рис. 1).

Читать далее

Опыт использования gRPC в Почте Mail.ru

Время на прочтение8 мин
Охват и читатели9.6K

Привет, Хабр! Я работаю в команде Антиспама Почты Mail.ru. В этой статье я бы хотел рассказать про наш опыт запуска сервиса с пропускной способностью около 3 миллионов запросов в минуту на базе технологии gRPC. Это современная технология передачи данных по сети, которая реализует подход к удаленному вызову процедур. Разберу, с каким проблемами мы столкнулись при использовании этой технологии под высокой нагрузкой. Все описанное в статье касается реализации gRPC для языка С++.
Читать дальше →

Отладка Makefile /часть 2/

Время на прочтение6 мин
Охват и читатели22K

Методы отладки


В этой части поговорим об общих методах и проблемах отладки. В конечном итоге, отладка — это солянка из всего, что работает в данной конкретной ситуации. Эти методы работают для меня и мне приходится полагаться на них даже в случае проблем с простейшими makefile. Может быть, они помогут и тебе тоже.

Читать дальше →

Отладка Makefile /часть 1/

Время на прочтение11 мин
Охват и читатели25K

Отладка makefile - это что-то из черной магии. К несчастью, не существует такой вещи как makefile отладчик, чтобы изучить ход выполнения конкретного правила или как разворачивается переменная. Большую часть отладки можно выполнить с помощью обычных print’ов и проверкой makefile. Конечно, GNU make немного помогает своими встроенными методами и опциями командной строки. Один из лучших методов отладки makefile это добавить отладочные перехваты (hooks) и использовать техники безопасного программирования, на которые можно будет опереться, когда дела пойдут совсем плохо. Далее представлено несколько основных техник отладки и практик безопасного программирования, которые будут, на мой взгляд, наиболее полезными.

Дай две!

Коды ошибок — это гораздо медленнее, чем исключения

Время на прочтение12 мин
Охват и читатели23K
На современных 64-битных PC-архитектурах использование C++-исключений означает всего лишь добавление к функциям недостижимого кода с вызовами деструктора и ухудшение производительность менее чем на 1%. Такие небольшие ухудшения производительности сложно даже измерить. Обработка редких ошибок с использованием возвращаемых значений требует дополнительных операций ветвления, которые, в реалистичных сценариях, замедляют программы примерно на 5%. Такой подход, кроме того, менее удобен, чем использование исключений. Если выбрасывается исключение, то на «раскрутку» каждого кадра стека тратится примерно 2 мкс.



C считается самым быстрым языком программирования. В C++ есть возможности, которые лишь повышают удобство работы, не влияя на производительность, в сравнении с C, и возможности, которые на производительность влияют. Эти возможности очень помогают в деле улучшения качества кода. В результате ими, несмотря ни на что, достаточно часто пользуются. Полиморфизм времени выполнения — это буквально вездесущая возможность, а вот исключения распространены меньше.
Читать дальше →

Лучшие методики журналирования enterprise-приложений (с точки зрения инженера поддержки)

Время на прочтение15 мин
Охват и читатели14K

Журналы приложений раскрывают информацию о внешних и внутренних событиях, которые видит приложение в ходе исполнения. Когда при деплое возникает баг, взлом или аномалия, журналы — самое полезное и надёжное доказательство для проведения анализа причин инцидента.

Давайте разберемся, как писать в журнал полезные сообщения, которые всем понравятся.
Читать дальше →

Устраняем старый баг в NVIDIA GeForce Experience

Время на прочтение7 мин
Охват и читатели17K

Предыстория


Несколько месяцев назад я решил попробовать сыграть в Microsoft Flight Simulator 2020. Копия нашей планеты, созданная Asobo при помощи фотограмметрии и машинного обучения, казалась подходящим местом для отдыха в эти трудные времена.

Я подключил свой верный беспроводной джойстик Logitech Freedom 2.4 и поднялся в небеса.



Спустя несколько часов полётов вокруг моей альма-матер и дома, в которой я провёл детство, настало время закругляться. Я настроил свой компьютер так, чтобы мониторы отключались через несколько минут неактивности, поэтому быстро понял, что больше они не отключаются.
Читать дальше →

Ближайшие события

Intel ControlFlag — система машинной отладки человеческих ошибок кода

Время на прочтение2 мин
Охват и читатели1.8K
Человеку, как известно, свойственно ошибаться. Самые вопиющие ошибки попадают в учебники, а с миллионами остальных нам приходится как-то жить и тратить свой рабочий ресурс на их исправление. По подсчетам исследователей из Университета Пенсильвании, на отладку кода уходит порядка 50% бюджета разработки ПО. Это чудовищно много, но надежда у человечества все-таки есть — будущее за машинными дебаггерами. На прошедшей совсем недавно конференции Intel Labs Day Intel представила ControlFlag — аналитическую систему машинного программирования, способную самостоятельно обнаруживать ошибки в программном коде.


Читать дальше →

Debugging в Julia — два способа

Время на прочтение9 мин
Охват и читатели3.4K


скришнот из metal slug 3


2020 год — это определенно год странностей. Мой код тоже часто включает в себя некоторые странные ошибки. И в данном посте я хочу показать вам несколько методов отладки кода на языке julia.

Читать дальше →

Баг в ESP-IDF: MDNS, Wireshark и при чём тут единороги

Время на прочтение5 мин
Охват и читатели7.2K

Всем привет. Я занимаюсь коммерческой разработкой в IoT, в основном мы используем модули от Espressif - ESP8266 и ESP32.

В рамках "догфудинга" мы иногда берём свои продукты домой и используем в повседневной жизни. И вот, однажды, от одного из сотрудников поступила жалоба: после установки новой тестовой прошивки на устройстве, его домашняя сеть сначала начала жестоко глючить и зависать, а потом ситуация нормализовалась, но наш девайс более не был виден ни в локальной сети, ни в облаке.

Налицо какой-то коллапс. Но какой? На других сетях мы такого поведения не наблюдали, так что было решено высадить к сотруднику развед-десант в лице меня, экипированного всем необходимым.

Разведка

BPF для самых маленьких, часть вторая: разнообразие типов программ BPF

Время на прочтение26 мин
Охват и читатели19K

Продолжаем серию статей про BPF — универсальную виртуальную машину ядра Linux — и в этом выпуске расскажем о том, какие типы программ BPF существуют, и как они используются в реальном мире капиталистического чистогана. Кроме этого, в конце статьи приведено некоторое количество ссылок, в частности, на две с половиной существующие книжки про BPF.


В ядре Linux версии 5.9 определено больше тридцати разных типов программ BPF, и про некоторые из этих типов я собираюсь написать по несколько статей, так что эта статья, поневоле, обзорная и не содержит такого количества технических деталей, как предыдущие. Но, тем не менее, мы постараемся, наконец-то, ответить на вопрос, зачем все это нужно и почему вокруг BPF так много шума.


Если вы хотите узнать, как именно BPF помогает эффективно решать задачи защиты от DDoS атак, распределения нагрузки на серверы, реализации сетевого стека kubernetes, защиты систем от нападения, эффективной трассировки систем 24x7 прямо в проде и многие другие, то добро пожаловать под кат.


image

Читать дальше →

Дизассемблируем циклы, написанные на Си

Время на прочтение4 мин
Охват и читатели16K

Доброго времени суток.

Сегодня мы будем смотреть дизассемблированный код инструкций if, for, while, swich, которые написаны на языке Си. Воспользуемся radare2.

Дизассемблировать код

История о желании думать, работать и творить

Время на прочтение3 мин
Охват и читатели4.1K

Тестировщик детских конструкторов... Слышали о такой работе?! Кто-то скажет – работа мечты для мальчика первых 45-ти лет жизни. Собирай конструкторы и получай деньги. Но всё не так просто… Да и история не только об этом.

Читать далее

Обновления в смотрелке логов

Время на прочтение2 мин
Охват и читатели4.1K
Хотел бы поделиться с Вами рядом обновлений «смотрелки» для логов chipmunk. Описание займет не больше 2-х минут Вашего времени, но меж тем новые возможности могут оказаться весьма полезным подспорьем в Вашей повседневной работе.
Читать дальше →