Ответы пользователя по тегу Программирование
  • Путь становления Реверс инженера?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    TrueBers
    @TrueBers
    Гуглю за еду
    Какая разница? Насмы, ясмы, масмы, фасмы, тасмы. Язык то один и тот же, в чём проблема? Что скачалось и запустилось, там и компилируйте.
    Ответ написан
  • Где и как хранится имя переменной?

    TrueBers
    @TrueBers
    Гуглю за еду
    Имена переменных пишутся для человека-разработчика для удобства чтения и восприятия. Железке-процессору нужен только адрес этой переменной, имя ему ни к чему.
    Ответ написан
  • Хочу стать программистом. Какой факультет выбрать(Санкт-Петербург)?

    TrueBers
    @TrueBers
    Гуглю за еду
    Знаю пару отличных факультетов:

    Вот оф сайт главного https://www.google.ru
    Ещё есть у них филиал — https://stackoverflow.com/

    Бесплатно и без СМС!
    Ответ написан
  • Создание вектор массивов C++? И как добавлять туда данные?

    TrueBers
    @TrueBers
    Гуглю за еду
    Какие массивы, какие элементы? Что вам скажет ваш код через год-другой, когда вы увидите массив из шести "чего-то"?
    Почему бы не объявить обычную структуру вида
    struct Point { // понятно, что это координаты точки, а не абстрактные буквы в вакууме
      double x, y;
    };

    и дальше для каждой группы создать тоже структуру
    // имена, конечно, надо заменить на что-то, имеющее отношение к вашей задаче
    struct Bundle { // здесь понятно, что это какая-то композиция из трёх точек
      Point p1, p2, p3;
    };

    ну, и вектор этих структур
    std::vector<Bundle> v; // а здесь — вектор из этих композиций из трёх точек
    // добавляем
    v.emplace_back(Bundle{{ 0.0,  0.1},
                          {0.15, 0.05},
                          { 1.0,  0.5}});
    Ответ написан
  • Что использовать для автоматической генерации диаграмм состояний UML?

    TrueBers
    @TrueBers
    Гуглю за еду
    Современные C++11, 14, 17 не поддерживаются нигде. По крайней мере, я не встречал ещё таких продуктов. Какой-нибудь С++98, только если, всякие монстры типа Enterprise Architect, Visual Paradigm вроде худо-бедно умеют.
    Ответ написан
  • Хватит ли ультрабука НЕ для веб программирования?

    TrueBers
    @TrueBers
    Гуглю за еду
    Основная проблема большинства ультров — невозможность расширить память, она тупо распаяна и не меняется.

    У меня ASUS UX31A, имеет 4 гига оперативы, это главный его косяк. Если у вас от скорости кодинга не зависит прибыль, то можете брать, всё отлично работает. Но, если в том же андроиде не хотите по 1-2 минуты ждать сборки проекта даже в Instant Run, то лучше взять в 2017-м году что-нибудь с 16 гигами, либо со сменным модулем.

    В C++ всё неплохо, даже если собирать проект жрущим gradle'ом, с открытой IDE при этом, то 4 гига иногда не хватает, 8 будет достаточно, но ничего параллельно особо не запустите. Лучше сразу 16 брать.

    Это всё про дефолт ОС 10-й редакции. Если ставить минималистичные линуксы типа Арча, работать во всяких мелких окружениях типа i3, awesome, то здесь всё немного получше.
    Ответ написан
  • Получить handle и размер файла С++?

    TrueBers
    @TrueBers
    Гуглю за еду
    Код
    #include <iostream>
    #include <numeric>
    #include <fstream>
    #include <filesystem>
    namespace fs = std::filesystem;
    
    using file_buffer_ptr  = std::unique_ptr<std::vector<char>>;
    using file_buffer_iter = std::istreambuf_iterator<file_buffer_ptr::element_type::value_type>;
    using file_list        = std::vector<file_buffer_ptr>;
    
    static file_buffer_ptr fillBuffer(const fs::path &currentFile)
    {
        auto fileBuf = std::make_unique<file_buffer_ptr::element_type>();
        fileBuf->reserve(fs::file_size(currentFile));
    
        std::ifstream fileStream(currentFile, std::ios::binary);
        fileBuf->assign(file_buffer_iter(fileStream), file_buffer_iter());
    
        return fileBuf;
    }
    
    int main()
    {
        file_list files;
        auto directory = "/tmp";
    
        try {
            for (auto& currentFile: fs::recursive_directory_iterator(
                                        directory,
                                        fs::directory_options::skip_permission_denied
                                    )) 
            {
                if (!fs::is_regular_file(currentFile))
                    continue;
    
                files.emplace_back(fillBuffer(currentFile));
            }
        } catch (const std::exception &e) {
            std::cerr << "Error: " << e.what() << std::endl;
        }
    
        std::clog << "Found " << files.size() << " files, total size " << 
            std::accumulate(files.begin(), files.end(), 0,
                [] (file_buffer_ptr::element_type::size_type total, const file_buffer_ptr &b) {
                    return total + b->size();
                })
        << " bytes" << std::endl;
    
        return 0;
    }


    А handle никак не относится к C++, это фича конкретной операционной системы.
    Ответ написан
  • AMD Ryzen и эмулятор в Android Studio?

    TrueBers
    @TrueBers
    Гуглю за еду
    Расширения для виртуализации эмулятора пишет Интел. Вы от него ждёте поддержки AMD-V?
    Используйте kvm, как пишут на реддите. Винда вообще с трудом подходит для разработки под Андроид. А под линуксами всё отлично летает.
    Ответ написан
  • Где найти пример UDP сервера на асинхронных сокетах?

    TrueBers
    @TrueBers
    Гуглю за еду
    Так, а в чём принципиальная разница с TCP то? Там же ещё проще должно быть: не нужны никаких обработки коннектов, отваливаний, стриминга. Шлёшь себе втупую датаграммы, когда сокет свободен, и принимаешь — когда буфер не пустой, и не паришься.
    И почему не нравятся библиотеки? В них же за вас уже все косяки и баги порешали. А их там, поверьте, хватает. Где-то poll тупит, где-то нет epoll, где-то файловый IO ещё вешается нормальный. В винде вообще IOCP вместо всего этого используется, и тот через жопу.
    И, разве, в man epoll нет примера? В своё время мне хватило его, насколько я помню.
    Ответ написан
  • Почему в более современных версиях Microsoft Visual Studio не поддерживается класс WindowsForm?

    TrueBers
    @TrueBers
    Гуглю за еду
    Вы в ланчере студии просто не выбрали этот компонент для установки.
    А лучше, используйте WPF.
    Ответ написан
  • Как пробивать НАТ?

    TrueBers
    @TrueBers
    Гуглю за еду
    Стандартных методов нет, ибо провайдеры конфигурируют свои железки как им вздумается. А у довольно большого их количества используется симметричный НАТ, который пробить невозможно.

    Есть несколько RFC на эту тему, сама процедура называется Interactive Connectivity Establishment. Самому писать реализацию крайне не советую, там столько тонкостей, что можно пару лет исследовать. Лучше взять что-то готовое.

    Если нужно из коробки на винде, из пакетов на линуксе, и, вроде бы как, кто-то портировал на Андроид — используйте Teredo/Miredo. Там всё довольно просто, в современных версиях пробиваются все типы ната. В случае симметричного, трафик идёт через релей, реализации которого тоже есть в виде демона. Единственное, что может не устраивать из коробки — там IPv6, если нужен v4, придётся реализовывать маппинг.

    Более тяжёлая артиллерия — это реализация от гугла. Сейчас она входит в кодовую базу Хромиум, в реализацию стандарта WebRTC. Там всё довольно сильно завязано на фреймворк хрома, очень тяжеловесно, довольно долго собирается, используется непривычная терминология из RFC. Зато эта библиотека самая действенная, огромный опыт гугла даёт о себе знать, демоны релеев (TURN) также есть, за вас написан reliable транспортный протокол, может взаимодействовать с браузерами через WebRTC Data Channel и прочие плюшки.

    Есть ещё, конечно, много других библиотек, но они что-то у меня не взлетали, сильно глючили, не всегда правильно тип НАТа определяли и т. п.
    Ответ написан
  • Как определять ответственность функций?

    TrueBers
    @TrueBers
    Гуглю за еду
    По своему опыту могу сказать:
    Всё это бесполезный треш, все эти описания как надо, как правильно, как делают гуру, как делают в НАСА, солиды, банды четырёх, десяти, трёхсот спартанцев и т. д. Но, ровно до того времени, пока вы сами до этого не дойдёте. А дойти до этого можно только с опытом. Когда вы пишете что-то относительно не крупное, эти все вещи можно опускать. А когда приходите к огромному проекту, всё идёт само по себе, ибо иначе вы просто не можете с этим взаимодействовать, либо если система уже достаточно хорошо спроектирована, вам приходится писать правильно, т. к. по-другому либо не получится, либо вам дадут по шапке ревьюверы.

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

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

    Я не хочу сказать, что все эти гофы и солиды не имеют смысла, они созданы для того, чтобы для начала просто с ними ознакомиться, отложить в подсознание и... благополучно забыть! Но потом, когда вдруг что-то писал и внезапно осенило: Да это же паттерн медиатор/обсервер/репозиторий/anyPattern! Вот тут и пригодится та самая книга трёх танкистов и собаки, которая просто направит в нужное русло, объяснит остальное, что не успел понять сам, и т. п.

    Всё это моё понимание, работает для меня, может не работать для кого-то другого, кто, например, запоминает 95% прочитанной книги и может уже сразу же адекватно оценить где какой подход использовать, где нужно будет масштабироваться и т.д.

    Но, я пока что таких людей не видел...
    Ответ написан
  • Как прочитать указатель из памяти чужого процесса?

    TrueBers
    @TrueBers
    Гуглю за еду
    Хватит плодить вопросы. Ответ на них не поместится на десяток страниц. Почитай лучше про адресацию памяти, что такое абсолютный адрес, относительный, что такое базовый адрес процесса, что такое рандомизация базового адреса. Просто так взять и прочитать память не получится.

    1. Этот адрес работает только для текущего процесса.
    2. Во-вторых, он будет другим при каждом запуске и выделении памяти из кучи.
    3. Он так же может меняться из-за ASLR

    Чтобы докопаться до реальной структуры данных с информацией о персонаже, нужно найти то место в коде, где эта структура выделяется на куче. Т. е. там должно быть что-то типа
    CharInfo info = new CharInfo();
    (_thiscall) CharInfo::CharInfo(info)

    Вот этот кусок кода тебе нужно найти, только так ты сможешь определить статическое место, откуда потом уже будешь плясать. Для поиска кода нужно знать хотя бы основы Ассемблера. Поможет в этом декомпилятор IDA Pro с плагином Hex-Rays.
    Но и этих мест может быть не одно, а десятки и сотни в случае с шаблонными классами и функциями. Тут уже нужен отладчик, чтобы поставить точки останова на чтение или запись памяти, и от них уже отталкиваться.

    Обычным чтением из памяти ты ничего не добьёшься, чтобы пойти по цепочке вызовов с необходимым адресом, тебе нужно самому внедрять свой код в клиент игры, либо пользоваться фреймворками для динамической инструментации, например, DynamoRIO, Intel PIN, Frida.

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

    Начать можно, кстати, с курса Рикардо Нарвахи "Введение в крекинг с нуля, используя OllyDbg". Это огромный курс статей, в которых разбирается всё, что нужно для понимания основ. Там 50 с чем-то глав различной сложности, погугли. Есть ещё на ютубе целый плейлист с видео-разборами этого курса.
    Ответ написан
  • Как исправить неправильное отображение кириллицы в Visual Studio Code?

    TrueBers
    @TrueBers
    Гуглю за еду
    На русском никто в 2017-м году и здравом уме не документирует, только, может, одинэсники. Документируйте на английском, заодно, и вы и препод, язык подтянете :D

    А чтобы русский отображался, сначала сохраните исходник в UTF8, а не в непонятной русской кодировке. Тогда он будет открываться везде, хоть с китайским, хоть с греческим.
    Ответ написан
  • Почему не работает libcurl?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ну, так скомпилируйте с его поддержкой, в чём проблема то?
    Ответ написан