Все потоки
Поиск
Написать публикацию
Обновить
89.48

Системное программирование *

Обеспечение работы прикладного ПО

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

Пишем на С++ вектор, умеющий расширяться без копирования элементов

Время на прочтение9 мин
Количество просмотров25K

В языке С есть функции malloc, free и realloc. При использовании последней вы можете написать этакий расширяющийся массив из примитивных типов или структур (классов-то нет), который, можно надеяться, не будет копировать все данные при каждом расширении. В С++ есть встроенный класс vector, который представляет из себя расщиряющийся массив, но он так не умеет: при каждом расширении вектора выделяется новый участок памяти и все элементы перемещаются на него (по возможности, с использованием move-семантики). Но ведь, если можно каждый раз не копировать все старые элементы на новое место, вектор должен работать быстрее? В этой статье я попробую написать вектор, который умеет расширяться без копирования элементов.

Код приведён здесь.

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

Читать далее

Как расширить возможности runtime KPHP

Время на прочтение14 мин
Количество просмотров2.7K

Всем доброго дня, уважаемые читатели. В данной статье вы узнаете как добавить новые функции в runtime KPHP, чтобы ими можно было пользоваться как ни в чём не бывало.

В качестве задачи - добавления функций для парсинга файлов и строк в формате env.

Рассмотрим этапы сборки KPHP, реализациий функций, написание тестов.

Читать далее

Инструментирование ассемблерного кода для сборки данных о динамическом покрытии

Время на прочтение14 мин
Количество просмотров2.9K

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

Читать далее

Port Knocking для Windows

Время на прочтение9 мин
Количество просмотров12K

Мне довольно часто приходится настраивать "одинокие" терминальные сервера(и не только терминальные) в "Облаках", с "легким, быстрым" доступом к нему по RDP.

Все объяснения для пользователей\заказчиков, что такие сервера должны быть доступны только с доверенных IP или через VPN воспринимаются "в штыки" и тогда приходится рисковать...

Конечно сервер защищается от Bruteforce(а), используются парольная политика, нестандартный порт, но все равно сервер постоянно под угрозой, в среднем в месяц можно увидеть по 15000 попыток подобрать пароль.

Такое обстоятельство дел заставило меня подумать о простом и действенном способе защиты сервера и в то же время этот способ не должен усложнить пользователям подключение к серверу.

Первое что пришло в голову - Port Knocking, использую его на RouterOS, но беглое гугление показало что для Windows не существует подобного штатного функционала, поиск сторонних средств которые могли бы помочь организовать задуманное не дал результата,  больше покопавшись нашел только странные и страшные поделки на Java не внушавшие доверия.

Тогда решил написать PortKnocking для Windows. Написать его решил на PowerShell, чтоб не пришлось устанавливать на сервер дополнительно Java или Python.

Т.к. есть опыт c телеграм ботами(@SuperMon_Bot), решил добавить и информирование о работе PortKnocking через телеграм.

Определился, что вся задумка должна состоять из нескольких скриптов.

Читать далее

Rust 1.65.0: GAT, let-else, break от помеченных блоков, отказ от RLS

Время на прочтение5 мин
Количество просмотров7.6K

Команда Rust рада сообщить о новой версии языка — 1.65.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.65.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.65.0 на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

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

Пошаговая GDB отладка ARM процессора из консоли в Win10

Время на прочтение7 мин
Количество просмотров12K

Иногда бывает ситуация когда надо срочно что-то пошагово отладить. При этом нет времени и желания ставить какие-то тяжелые IDE. В таких случаях может помочь пошаговая GDB отладка ARM Cortex M33 из командной строки Windows. В этом тексте я расписал пошаговое руководство того как это сделать.

Читать далее

Как работает Wine

Время на прочтение10 мин
Количество просмотров87K


Wine — это свободное программное обеспечение для запуска Windows-приложений на нескольких POSIX-совместимых операционных системах, включая Linux, macOS и BSD.

Если вы любите Linux, то наверняка когда-то запускали Wine. Возможно, для какой-то «важной» программы Windows, у которой нет аналога под Линуксом, или поиграться. Забавный факт: даже Steam Deck от Valve запускает игры через оболочку на основе Wine (она называется Proton).

За последний год я намучился с отладчиком, который позволяет одновременно дебажить и Wine, и Windows-приложение в нём. Разобраться во кишочках Wine оказалось очень интересно! Я-то раньше много им пользовался, но никогда не понимал механику целиком. Можно взять файл Windows — и просто запустить его в Linux без каких-либо изменений. Если вы хотите знать, как это сделано, добро пожаловать под кат.
Читать дальше →

DIY-одноплатник или OrangePi на минималках

Время на прочтение14 мин
Количество просмотров20K

Некоторое время назад Arduino казалось какой-то непонятной магией когда только узнал про нее. Потом быстро перешел к самим микроконтроллерам. Позже, работая программистом микроконтроллеров, захотелось чего-то большего и я уже смотрел в сторону линукса и одноплатных компьютеров. В руки попал Raspberry Pi, но это готовый продукт с определенной периферией (не хочу HDMI, хочу RGB LCD) и некоторое время спустя я уже думал как сделать что-то подобное самому.

Читать далее

Сегментная адресация памяти

Время на прочтение7 мин
Количество просмотров10K

Наиболее распространенная модель адресации памяти - плоская, когда у каждого элемента памяти есть глобальный адрес. Но это не единственный способ работы с памятью, в данной статье я хочу рассмотреть одну из альтернатив - сегментную адресаци. Будут расмотрены несколько исторических систем, реализующих этот подход, преимущества сегментной адресации с точки зрения масштабирования и безопастности, а также высказаны гипотезы о причинах, по которым он не прижился (спойлер: буду ругать язык C и операционную систему Unix).

В подавляющем большинстве компьютерных систем для работы с некоторой ячейкой памяти необходимо как-то указать ее адрес, как правило 16-, 32- или 64-разрядное число. Количество бит в адресе часто называют разряностью системы. Часто дополнительно используется механизм "трансляции страниц", который отображает области виртуальной памяти пользовательского приложения в физическую память, которой управляет операционная система. Но в каждый момент времени активна отлько одна "таблица страниц" и с точки зрения приложения (а во многом и с точки зрения ядра ОС) память остается плоской.

Рассмотрим старый процессор Intel 86/88/186. Размер регистров этих процессоров всего 16 бит, что позволяет адресовать всего 64 килобайта памяти. Когда эти микросхемы разрабатывались, такого размера памяти уже не хватало для многих приложений, а 32-разрядные процессора были слишком дороги. Проблему решили добавив в архитекруту сегментные регистры. При обращении к памяти к 16-битному адресу (хранящемуся в реристре общего назначения или прямо в коде команды) прибавлялось значение сегментного регистра, сдвинутое на 4 бита (что тоже самое, умноженное на 16) и полученное значение использовалось как физический адрес. Такой подход позволял адресовать до одного гигабайта памяти. В архитектуре персональных компьтерах IBM PC, созданных на базе этих процессров, часть адресного пространства было зарезервировано для системных нужд, а пользовательским приложениям и ОС было доступно до 640 килобайт. Но не все так просто.

Читать далее

Как завладеть сетью /16 с помощью libpcap и libdnet

Время на прочтение16 мин
Количество просмотров14K

Всем привет. Сегодня я попытаюсь рассказать про сетевое программирование на довольно низком уровне, с библиотеками libpacp и libdnet. Про последнюю многие наверное и не слышали, т.к. информации о ней в сети фактически нет. А ведь её использует сам Fyodor :)
Читать дальше →

Rust 1.64.0: rust-analyzer в rustup, IntoFuture, ffi-типы в core и alloc, улучшения в Cargo

Время на прочтение6 мин
Количество просмотров6K

Команда Rust рада сообщить о новой версии языка — 1.64.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.


Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.64.0 вам достаточно выполнить команду:


rustup update stable

Если у вас ещё нет rustup, то можете установить его со страницы на нашем веб-сайте, а также ознакомиться с подробным описанием выпуска 1.64.0 на GitHub.


Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать beta (rustup default beta) или nightly (rustup default nightly) канал. Пожалуйста, сообщайте обо всех встреченных вами ошибках.

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

Simics: Забиваем гвозди сваебоем

Время на прочтение9 мин
Количество просмотров3.2K

Любите ли вы отзывчивые программы так, как люблю их я? Любовь эта привела меня к Колибри ОС - невероятно шустрой операционной системе, которая запускает программу до того, как вы осознаете, что кликнули по ней. И недавно у неё нашли уязвимость: ping of death.

Так получилось, что моя первая работа была связана с симуляцией компьютерных систем – от серверов до мобильных устройств. И там мы использовали симулятор Simics. Этой системой пользуются крупные производители железа для опережающей разработки драйверов.

Если бы только можно было использовать Simics для отладки любительской ОС...

Читать далее

Жизнь выдающихся программистов. Джей Фриман (saurik)

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров13K

Прошлая серия про талантливую программистку Джастин Танни не оставила равнодушной хабрасообщество. Поэтому продолжаем заполнять нижние строчки хит-парада выдающихся программистов 21 века. Это особенные личности, которым карьера как будто не важна. В силу высокого IQ, врождённой любознательности и особого характера они не способны выполнять скучные, рядовые задания. Только интересные или важные. И только по своей воле, не по указанию сверху.

Следующий герой — более публичный и известный персонаж, про него даже есть статья в Википедии. Гений реверс-инжиниринга Джей Фриман известен под ником saurik, а славу ему принёс каталог «запрещённых» приложений Cydia (для взломанных айфонов).
Читать дальше →

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

Клонируем сами, своими руками

Время на прочтение7 мин
Количество просмотров13K
Картина маслом: Опытный сисадмин ищет четырёхлетний бэкап на файл-сервере

Задача: Вася летел на самолёте. Из-за неисправности двигателя самолёт упал на необитаемом острове. Вася был единственным выжившим. После осмотра уцелевшего багажа Вася понял, что в его распоряжении есть несколько лаптопов и Wi-Fi роутер. Теперь для того, чтобы выжить, Вася решил поднять ЦОД. Для нормальной работы ЦОДа Васе нужно уметь клонировать Debian Linux. Но под рукой нет никаких средств клонирования. Даже старый диск Clone Zilla куда-то запропастился. Что делать Васе?

Итак, для начала посмотрим на кое-какие условия ТЗ, не описанные в первом абзаце.
Читать дальше →

Примеры кошмарного программирования вокруг нас. Выученная беспомощность

Время на прочтение6 мин
Количество просмотров40K

Нет в мире совершенства. Куда ни глянь — всюду костыли и компромиссы. Вроде каждый в отдельности хочет сделать как лучше, но чем больше участников — тем сильнее хаос…

Возьмём классический пример — реестр Windows. Этот странный артефакт инженерной мысли представляет некое подобие иерархической БД для хранения абсолютно всех настроек — и системных, и приложений, и драйверов. Центральное бинарное хранилище заменило массу файлов .ini, разбросанных по всей системе и должно было упростить жизнь. Но вышло наоборот. И глядя на монструозный тормозящий конструкт, возникает только один вопрос: как это исправить? Ответ тоже простой: «Если вкратце, то никак». И так во всём. Мы создаём монстров, а потом не можем от них избавиться.
Читать дальше →

Memcached: установка сервиса, мониторинг вручную и с помощью Zabbix

Время на прочтение8 мин
Количество просмотров10K

Большинство высоконагруженных сервисов, к которым, без сомнения, относится сервис SAAS интернет-магазинов, используют Memcached как высокопроизводительное хранилище данных в оперативной памяти сервера. В этой статье мы расскажем о том, как установить Memcached, как контролировать работу сервиса Memcached вручную, а также с помощью Zabbix.

Читать далее

IopReadyDeviceObjects: медвежья услуга от ядра и как с ней сосуществовать

Время на прочтение5 мин
Количество просмотров1.8K

Всем привет! Столкнулся я недавно с одной интересной и не вполне понятной с первого взгляда проблемой в KMDF драйвере, разработкой которого я в данный момент занимаюсь. Опыта в этой сфере у меня не много - это первый проект на KMDF которым я занимаюсь. В деталях описывать проект не могу (всё-таки частная собственность), да это и не нужно, но идея такова: есть 2 драйвера, один из них становится в стек устройств определённого класса и предоставляет интерфейс через который второй драйвер может подписаться на добавление новых и уже подключенных устройств (несколько callback-ов), получать обратные вызовы на определённых операциях и так далее. Таким образом первый драйвер находится в системе постоянно и для своей замены требует перезагрузки и содержит минимальную логику, а второй может свободно обновляться на ходу (без перезагрузки) и принимает решения. Логика этого драйвера подразумевает создание control device для каждого устройства-фильтра, установленного в стек (нужен дополнительный функционал без коллизий с функционалом стека) - и вот тут у меня возникла проблема, на определение причин которой и дальнейшее решение я потратил довольно много времени. Статью об этом решил написать именно сегодня - как-никак это неплохой способ сделать что-то полезное на свой профессиональный юбилей - 10 лет в разработке :-)

Читать далее

Как не быть программистом, раскурить eBPF за сутки и начать мониторить DNS

Время на прочтение22 мин
Количество просмотров12K

Представим: сервер может отправлять легитимные запросы, но IP, на которые он будет их слать, неизвестны. В журнале сетевого фильтра видно что запросы таки да, идут. Но не ясно - это как раз легитимные или информация уже утекает к злоумышленникам? Было бы проще если бы был известен домен на который сервер посылает данные. Увы, но PTR не в моде, а securitytrails показывает или ничего, или слишком много по этому IP.

Можно запустить tcpdump. Но кто захочет постоянно смотреть в монитор? А если сервер не один? Есть packetbeat. Это чудовище, которое выжрало процессор на всех серверах. Брр… Не хочу о нём вспоминать. Osquery - неплохой инструмент который многое знает о сетевых подключениях и ничего - о DNS-запросах. Соответствующее предложение было просто закрыто. Zeek - о нём я узнал когда начал искать как отслеживать DNS-запросы. Похоже он неплох, но меня смутило два момента: он следит не только за DNS, а значит ресурсы будут тратиться на работу результат которой мне не нужен (хотя, возможно, в настройках можно выбрать протоколы); а ещё он ничего не знает о том какой процесс послал запрос.

Неужели это всё? Я вроде бы что-то слышал про eBPF…

Читать далее

Правим QEMU железным кулаком

Время на прочтение14 мин
Количество просмотров14K

Виртуализация, на мой взгляд, всё ещё остаётся одной из самых важных технологий в администрировании ЦОД. Да, конечно “все” будут рассказывать, что контейнеры намного более удобные, и всё надо запихивать в Кубер, и всё такое… Но после гигантского нагромождения никому не нужных конфигов, в какой-то момент ты начинаешь понимать, что зашёл слишком далеко.

И действительно. Мы пишем ПО для обслуживания целого ЦОДа. Изначально всё должно было быть контейнером, и всё должно было распространяться через CI/CD, но когда дело доходит до дела, ты начинаешь понимать, что нет ничего проще установленного линукса, на котором напрямую запускается твоя утилита, написанная на golang.

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

Под катом, давайте окунёмся в мир работы с QEMU и подёргаем сам эмулятор. Конечным результатом должна быть клонированная через golang Debian Linux.
Читать дальше →

Как разместить переменную по определенному адресу в Keil

Время на прочтение4 мин
Количество просмотров13K

Иногда возникает задача сохранить во flash памяти контрольную сумму, картинку, строчку текста, настройку. А ещё иногда возникает задача сохранить переменную не просто в ОЗУ, а в определенных адресах. Или например иметь функцию, исполняемую из ОЗУ чтобы можно было присылать по UART и сразу исполнять новый код функции. Рассмотрим эти задачи на примерах.

Читать далее

Вклад авторов