Задать вопрос
  • Что изучать дальше?

    TrueBers
    @TrueBers
    Гуглю за еду
    то делать дальше?
    1. перечитать книгу
    2. Прочитать новую
    3. Начать ещё одну

    Вы чтением книг зарабатывать будете? Или это хобби такое?

    Техническую литературу не нужно читать. Читать нужно Войну и Мир, например, Мастера и Маргариту.
    А на языке нужно писать, практиковаться, делать что-то конкретное. Вы можете прочитать и 20 книг, но при этом точно так же ничего не сможете сделать. Нужна практика, книги — это справочники, в основном. Когда что-то непонятно, идёт и смотришь, как это решает автор. А просто читать это абсолютно бессмысленная трата времени.

    Возьмитесь уже за дело и начните реализовывать одну из ваших задумок проектов, параллельно заглядывая в книгу по необходимости. Будет намного больше пользы.
    Ответ написан
    2 комментария
  • Как заменить символы в текстовом файле?

    TrueBers
    @TrueBers
    Гуглю за еду
    Подскажите как это лучше всего сделать с использованием только стандартных библиотек C++?

    Если прям true C++ way, то вам нужно использовать std::fstream. Для него нужно реализовать стандартный std::streambuf и во время записи в файл, когда буфер сбрасывается, у std::streambuf вызывается виртуальный метод overflow(), вот его перегружаете, проходите по буферу, делаете нужные вам изменения и сбрасываете буфер дальше на запись. Примерно, как тут.
    Это если важна архитектура, гибкость, переиспользование кода и трушность C++.

    А если более-менее простой вариант, то недо-true C++ way выглядит
    примерно так
    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    
    int main() {
    
      std::ofstream out_file( "out.txt" );
      std::ifstream in_file( "in.txt" );
      std::string/*stream*/ some_buffer;
    
      using char_type = decltype(out_file)::char_type;
      using in_iter = std::istream_iterator< char_type >;
    
      if ( !in_file.is_open() || !out_file.is_open() )
        return EXIT_FAILURE;
    
      std::transform(in_iter(in_file), in_iter(), std::ostream_iterator< char_type >(out_file),
                     [&some_buffer] (const char_type &c) {
    
                       if ( !std::isalpha( static_cast<unsigned char>(c) ) || c == '\n' || c == '\r' )
                         return ' ';
    
                       // if шило, then мыло, буферизуем если надо, и т. п.
    
                       return c;
                     });
    
      return EXIT_SUCCESS;
    }
    Ответ написан
    3 комментария
  • Почему в Си допускается переполнение массива?

    TrueBers
    @TrueBers
    Гуглю за еду
    Потому что это проверка на переполнение даёт лишние накладные расходы при выполнении. Изначально язык разрабатывался с расчётом на эффективность, с девизом что-то типа: «не нужно платить за то, чем не пользуешься».

    По сути, Си — это просто высокоуровневый ассемблер. В ассемблере нет понятия ошибок вообще, всё на плечах разработчика. Если ему нужно проверять на переполнение, он сам должен реализовать этот функционал, а не терять на этом производительность, когда ему это не нужно.
    Ответ написан
    Комментировать
  • Как действуют графические модификации игр?

    TrueBers
    @TrueBers
    Гуглю за еду
    Чтобы их делать, нужно уметь проводить вот такие вот исследования. Соответственно, нужно на зубок знать то графическое апи, на котором написана игра. А про реверс-инжиниринг уже сказали.
    Ответ написан
    Комментировать
  • Поиск слов в векторе c++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ответ написан
    Комментировать
  • Почему нельзя использовать указатель без объявления переменной?

    TrueBers
    @TrueBers
    Гуглю за еду
    А потому что, учите ассемблер, вот почему.
    Разработчика на C/C++ не бывает без базовых знаний ассемблера.
    Можно взглянуть сюда и понять очень многое.

    На 6-й строке ассемблерного кода у вас происходит выделение стекового фрейма. Это та область памяти, где будут храниться ваши локальные переменные, которые вы объявляете в текущей функции, т. е. в нашем случае это int var; int *pvar;. Несмотря на то, что сумма размеров этих переменных на стеке sizeof(int) + sizeof(int*) = 12 для x86_64, выделяется 16 байт согласно пункту 3.2.2 SystemV ABI AMD64, который говорит, что стековый фрейм должен быть выровнен по границе 16 байт. На другой архитектуре здесь может быть другое правило.

    Стек растёт вниз по адресам, т. е. выделение памяти на нём — это просто вычитание (инструкция SUB) из адреса его вершины (регистр RSP) числа, равного тому количеству памяти, которое мы хотим выделить. К вам как бы «всплывает» кусок памяти «откуда-то снизу». Эта память скорее всего использовалась предыдущими вызовами функций и осталась не затёрта! Соответственно, вы должны инициализировать этот поюзаный кем-то кусок под себя.
    Что-то типа аналогии со школы или универа, когда в аудитории есть такая раздвигающаяся доска из двух или трёх частей, видели наверное, когда выдвигаешь одну часть, а другая задвигается. Так вот, когда вы приходите на лекцию, выдвигаете доску, а там, внезапно, предыдущая группа не стёрла за собой свои творения, и вам придётся это стирать и писать вещи, относящиеся к вашему предмету. Естественно, если вы попытаетесь использовать для вашего предмета то, что осталось от предыдущей группы, получится бред в большинстве случаев.

    Когда адрес вашего указателя где-то используется без инициализации (7-я строка асм кода), он возьмёт тот самый мусор, который к нам пришёл при выделении фрейма.
    Получается лотерея: если этот мусор случайно оказывается действующим указателем на память, доступную для записи, ОС не выбрасывает исключение и пишет куда-то в непонятное место, ломая тем самым случайное место в вашей программе. Т. е. вы попадаете на тот случай, когда во фрейме попался до сих пор действующий указатель из мусора предыдущей функции, которая использовала этот кусок фрейма и не затёрла. А когда лотерея проиграна, и попали не на указатель, а на не пойми что, ОС бросает исключение. Поэтому ошибка не всегда проявляется.

    Это всё частный случай реализации языка Си для конкретной архитектуры. Конечно, в терминах стандарта таких вещей не бывает вообще, а объявлено просто как неопределённое поведение, которого нужно избегать.
    Ответ написан
    1 комментарий
  • Что означает этот кусок кода?

    TrueBers
    @TrueBers
    Гуглю за еду
    По уму это делается так:
    #include <ctype.h>
    
    if( isdigit( c ) )
      ++ndigit[c - '0'];
    else if( isspace( c ) )
      ++nwhite;
    Ответ написан
    2 комментария
  • Путь становления Реверс инженера?

    TrueBers
    @TrueBers
    Гуглю за еду
    Рецепт прост до безобразия:
    Если вам хочется разбираться в каждой фиче, каждую новую программку ковырять, разбирать формат её файлов, каждую новую игру пытаться взломать, написать для неё бота, чит и т. п. Значит это ваше, просто продолжайте делать то, что делаете.

    Если нет, то никакие книги не помогут. В этом деле нужна страсть и огромное терпение.

    Матан никому не нужен в реверсе. Максимум решение систем линейных уравнений понадобится.
    Важно скорее нестандартное мышление, умение брутфорсить в голове множество вариантов, подходов. Для этого нужно знать технологии. Т. е. буквально, знать нужно как можно больше. Чем больше вы знаете, тем быстрее будет решена задача. Это абсолютно различные области: ОС, сети, способы шифрования, компрессии, хеширования, сериализации; знание баз данных и их языков запросов; знание компиляторов в плане, как они генерируют код; знание реализации той же стандартной библиотеки, понимание как компилируется один и тот же код разными компиляторами, понимать, как работают интерпретаторы байткода, виртуальные машины, и т. п.

    Это, что касается общих технологий. А есть ещё такая штука, как архитектурные паттерны. Они обычно применяются в прикладных приложениях, малварь редко такое применяет. Т. е. нужно видеть в коде, например, паттерн Event, различные варианты паттерна MVC, и т. п. Например, вы реверсите продукт на Qt. Чтобы его понимать, вам нужно знать... Qt, и уметь на нём разрабатывать, читать его исходный код, знать что такое метаобъекты, как они хранятся, используются, вызываются. А если, внезапно, оно юзает что-то интерпретируемое, типа питона или луа, то вам, мало того, что нужно знать сами языки, так ещё и реализацию их интерпретаторов. А ещё бывает JIT...

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

    Короче, для реверсера нужно учить всё. Не нужно фильровать определённые технологии, вам понадобятся все они без исключения. Ибо всё, что было создано для вычислительных систем, в них используется, а соответственно, вам придётся это знать, чтобы реверсить.

    Кстати, чуть не забыл.

    Самая лучшая книга по реверсу на русском.

    И ещё есть классический курс статей от Рикардо Нарвахи: «Введение в крэкинг с нуля, используя OllyDbg». Погуглите его. Если осилите книгу Юричева и этот курс, то сможете спокойно собеседоваться в Касперский. Хотя, поверьте, есть вещи поинтереснее касперского.
    Ответ написан
    1 комментарий
  • Для чего доменное имя начинают с www?

    TrueBers
    @TrueBers
    Гуглю за еду
    Причина сугубо историческая. Сейчас это не имеет смысла. Только лишние проблемы создаёт. Обычно просто CNAME делают на него да и всё.
    Ответ написан
    1 комментарий
  • Где найти литературу по разработке виртуальных машин?

    TrueBers
    @TrueBers
    Гуглю за еду
    Во-первых. Существует 2 основных производителя х86_64 процессоров — это Intel и AMD. У них совершенно разные технологии виртуализации (если не считать VIA, которая лицензировала интелловскую виртуализацию). Так что, решите, для какой платформы вообще хотите разрабатывать.

    Во-вторых, как у Интела, так и у АМД есть SDM (software developer's manual) — такие здорооовые PDF'ки по 5 тысяч страниц. Вот в них можно найти практически подробнейшее описание технологии.

    В-третьих. Существует множество различных видов виртуализаций: паравиртуализция, программная, аппаратная, виртуализация отдельных устройств, шин, ввода-вывода, памяти, виртуализация графических карт или сетевых устройств, шины PCI-e. И ещё чёртова куча всяких технологий. Только интелловские процы поддерживают с полтора десятка различных фич и расширений. Это всё описано у них в мануалах.

    В-четвёртых, живём в век интернета вроде, не? Разрабатывается активно несколько промышленных гипервизоров с открытым кодом. Берёте мануал на 5 тыщ страниц, открываете, например, kvm и курите, курите. При отличных знаниях ОС, за несколько месяцев можно осилить базовый гипервизор.

    В-пятых, написать гипервизор ничуть не легче, чем написать целую ОС. Т. е. нужно знать об операционных системах и железе буквально всё.

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Напишите udev-правило. И запретите эпловские vid'ы.
    https://unix.stackexchange.com/questions/63199/how...
    Ответ написан
    Комментировать
  • C++. Как происходит возвращение локального объекта функциями?

    TrueBers
    @TrueBers
    Гуглю за еду
    samp *ob;
        ob = &func();


    Да, верно вы предполагаете, вы получаете адрес на временный объект, который будет уничтожен после выполнения деструктора и указатель будет указывать на мусор в стеке. ОС ошибку вам и не выдаст, это не её дело, что вы пишете неправильный код, это дело статического анализатора или адекватного компилятора.

    Включите все уровни предупреждений в вашем компиляторе и он вам скажет, что вы неправильно делаете. По крайней мере clang и gcc об этом скажут по умолчанию. Думаю, что и вижуал студия справится.
    Ответ написан
    Комментировать
  • Кто знает хороший учебник по ассемблеру и справочник по командам (windows)?

    TrueBers
    @TrueBers
    Гуглю за еду
    Справочник по командам никто лучше, кроме производителя процессоров вам не даст. Заходите за сайт интел/амд и качайте референс.
    А учебник для ассемблера не имеет смысла. Ибо всё, что относится к ассемблеру — это команды. Остальное — платформозависимые вещи, которые будут различаться в каждой системе, архитектуре, и т. п. Соответственно, в этих учебниках вас будут учить вещам, которые уже либо почти не используются, либо про них уже забыли.

    В ассемблере половина команд это mov, lea и call. Прочитайте, что они делают, и уже половину поймёте. Ещё 45% сверху — около 20 команд всего. Остальные 5% занимают сотни и тысячи других инструкций, которые никто в живую в глаза не видел. Это можно взять за 10% от "знания ассемблера". Остальное зависит от архитектуры, системы, компилятора, разрядности, и ещё кучи факторов.

    Сейчас нет такого учебника, чтоб научил вас ассемблеру. Если хотите основы с 16 бит, то берите любой. По современным вещам информации нет нигде, кроме официальных документов производителей процессоров.
    Ответ написан
    Комментировать
  • С или modernC++ для IoT?

    TrueBers
    @TrueBers
    Гуглю за еду
    Так говорите, как будто С++ это 2 вещи: shared_ptr и исключения :D

    Вы смутно понимаете, похоже, в чём их назначение.

    Эксепшены и атомики в плюсах использовались всегда. Просто, нужно понимать, для чего они вам.
    Исключения, на то они и исключения, что используются в исключительных ситуациях. Если вы их пихаете везде, и жить без них не можете, значит, с вашей архитектурой приложения что-то не так. Это раз.

    Два. Любые эксепшены, rtti, наследования, диспетчеризация и т. п. в embed'е это дикий оверхед. Но при этом, почему-то многие софтовые компании, включая гугл, просто выключают у себя в проектах поддержку исключений и rtti. И на этом "огрызке" всё работает почему-то. К тому же, размер бинарника для имбеда довольно важен и не на последнем месте. Выпилив исключения и rtti, можно очень хорошо выкинуть мусор.

    shared_ptr — не серебряная пуля. Как уже сказал fshp, они используются в, ну просто, очень ограниченном количестве случаев. Их, как и исключения, нельзя пихать куда попало. Посмотрите выступления Шона Парента, почитайте его пейперы. Очень толковый мужик из Adobe, один из главных инженеров Фотошопа. Он там хорошо описывает и показывает на примерах, что shared_ptr — это просто хорошо замаскированная глобальная переменная, по сути, да ещё и с оверхедом от атомиков. И перед тем, как его использовать, сто раз подумайте, зачем он вам здесь нужен. В 99% случаев, можно обойтись без него, так же как и без RTTI. При этом, unique_ptr — очень удобная и полезная штука.

    Вам современный C++ предлагает множество сишных способов возврата значения вместо эксепшенов. Вы можете возвращать тот же tied tuple, optional, variant, any, error_condition, error_code. Хоть они и сами любят повыбрасывать исключения, но код намного чище и легче отлаживать и понимать, чем миллион вложенных исключений с дикой иерархией и оверхедом.

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

    Если вы из всего вышеперечисленного, пользуетесь только shared_ptr и исключениями, то C++ вам не нужен.
    Ответ написан
    1 комментарий
  • Как использовать make?

    TrueBers
    @TrueBers
    Гуглю за еду
    Там же один файл в исходниках. Просто запустите компиляцию руками. Там какой-то древний Makefile.
    $ gcc -march=native -O2 -lz afsctool.c -o afsctool
    Ответ написан
    Комментировать
  • Как уговорить провайдера подключить частный сектор?

    TrueBers
    @TrueBers
    Гуглю за еду
    Попробуйте пообщаться с этими ребятами, может чего посоветуют.
    Ответ написан
    Комментировать
  • Объясните: какую базу нужно иметь для изучения Dirext X [C++]?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вам нужны знания графики. Понимания, как оно всё там работает под капотом. Без этого всего DirectX будет казаться чем-то космическим и непонятным. DirectX никак не завязан на чистый WinAPI. Он базируется на технологии COM. Это посложнее для понимания, чем WinAPI. Ну и, соответственно, это всё работает только на Windows.
    OpenGL чуть проще, там чистое Сишное API. Можно писать для множества операционных систем, в том числе, для мобильных платформ.

    Оба API используют конечный автомат для рендеринга, все состояния которого тоже нужно отлично понимать. У OpenGL, на мой взгляд, он более лёгок для понимания.
    Но для всего этого вам нужно знать, что используется там под капотом. Бездумно искать строки кода и копипастить их к себе не получится. Нужно знать что делает каждая функция, какие состояния конечного автомата меняют, и т. п.

    Если хотите начать учить всё это дело, советую начать с отличных статей на Хабре. Если вы осилите весь этот курс, то сможете писать хоть на OpenGL, хоть на DirectX, хоть на Unity/Unreal/CryEngine.
    Ответ написан
    Комментировать
  • C++ fstream. Не работает чтение из бинарного файла, почему?

    TrueBers
    @TrueBers
    Гуглю за еду
    Т.е по сути моя i должна быть равна 3
    Не должна она вам ничего, пока документацию не прочитаете.

    Зачем вы добавили ios::trunc при открытии файла?
    trunc от слова truncate, переводится как: обрезать, усекать, урезать, сокращать.

    В документации ясно написано же: trunc discard the contents of the stream when opening. Что переводится как, отбрасывает содержимое потока при открытии.
    Он же вам его очищает и открывает новый пустой файл, вы его читаете, а там нечего читать. Вот и результат.
    Ответ написан
    1 комментарий
  • Что использовать для даты?

    TrueBers
    @TrueBers
    Гуглю за еду
    С чего это он deprecated? У него deprecated конструктор без локали, а сам класс живёт и здравствует.
    Создаётся через поиск в гугле... тьфу ты, через java.util.Calendar
    Ответ написан
    3 комментария