Задать вопрос
  • Можно ли повредить ОЗУ программой?

    wataru
    @wataru
    убить процессор (выставив слишком высокое напряжение питания)


    Это вряд ли. Современные процессоры сами довольно быстро отключаются. Их можно без куллера запустить и они не сгорят.
    Написано
  • Сценарии применения Splay Tree?

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322, В зависимости от того, что вам на самом деле надо делать со структурой данных, она может быть строго O(1), а не чуть лучше логарифма в среднем на некоторых данных.
    Написано
  • Сценарии применения Splay Tree?

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322,
    но в дереве отрезков запрос именно можно сказать по 2-му параметру узлов - порядковому номеру,


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

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322, Ну, открытый с одной стороны интервал - тоже интервал.
    Написано
  • Сценарии применения Splay Tree?

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322, для запросов на интервалы скорее всего лучше будет работать дерево отрезков.
    Написано
  • Как вернуть значение на которое указывает указатель?

    wataru
    @wataru Куратор тега C++
    232321fdsa, auto - это "мне лень писать тип, выведи сам". Но все равно, во время компиляции! Это будет один конкретный тип.
    Написано
  • Как хукнуть функцию из другого приложения?

    wataru
    @wataru Куратор тега C++
    Дмитрий, Тогда можно использовать FF. Оно, вроде, есть и там и там. Правда, там не так просто адрес будет указать. его надо куда-то в память или регистры сначала засунуть и уже вот это указывать в команде.

    Наверное, вы правы и ret будет попроще, хоть и как-то уж вывернуто.
    Написано
  • Как хукнуть функцию из другого приложения?

    wataru
    @wataru Куратор тега C++
    w3w3w3w3w3, Ну тогда делайте примерно то, что и делали. Только проблема похоже в том, что у вас не тот jmp используется. E9 - это Jump near. Не факт, что разница адресов укладывается в огрангичения. Попробуйте jump far, который с EA начинается.
    Написано
  • Почему clang выдает такой ассемблерный код?

    wataru
    @wataru
    djEban, На си все тоже самое. Без оптимизации выдает с константой. С оптимизацией
    все хорошо.

    Так что мой ответ в силе: Он выдает кривой код, потому что его не просили код оптимизировать. Ну вот такой дефолт у него сделать "на отвали". Имеет право.
    Написано
  • Почему clang выдает такой ассемблерный код?

    wataru
    @wataru
    djEban, Разве в c не надо писать struct Point?

    Действительно clang 15 выдает плохой код. Но только если отключить оптимизацию (-O0). Если же оптимизацию включить, то константа исчезает.

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

    wataru
    @wataru Куратор тега C++
    8iKS, В настоящем, не игрушечном исполняемом файле, если функция вам важна для взлома, то она вряд ли будет заинлайнена. В крайнем случае, вам придется патчить ту функцию, куда проверка аутентификации вставлена.
    Написано
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    8iKS, А вы код auth ассемблерный тоже покажите - интересно.

    А найти вы его не могли именно из-за инлайнинга функции, как я и говорил пару комметариев назад. Компилятор видит, что функция мелкая, вызывается в одном месте. Можно тупо ее код вставить вместо вызова и сэкономить ресурсы. Все-таки вызов - не бесплатное удовольствие. Очень много чего надо сохранить и восстановить после. Отключение оптимизаций дало бы такой же результат.

    А потом, поскольку компилятор заинлайнил все вызовы функции, можно ее и не генерировать вообще в исполняемом файле.

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

    wataru
    @wataru Куратор тега C++
    8iKS, Пробовали вывести адрес auth() в main и сравнить его с адресом auth из dll-ки?
    Написано
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    8iKS, Прокрутите вниз дизассемблерный код. Там, вроде, выводится "CALLED FUNCTION auth()" в 00007FF60BFA112D. Но до этого есть какие-то циклы, вызов методов класса и еще какие-то выводы.

    Вам не кажется странным, что ваша элементарная функция auth() вышла вот такой вот портянкой? Это уже пропатченная функция что ли?

    Дайте-ка еще полный код main. Всего файла. И напишите, каким компилятором и версией оно у вас собирается. Хочу посмотреть ассемблерный выхлоп у себя.

    Я все еще 100% уверен, что по смещению +140 у вас совсем не auth(), а что-то другое. И оно ждет параметров функции - какие-то указатели на классы. Вы их не передаете, поэтому эта функция и падает.

    Вы пробовали без оптимизации компилировать?
    Написано
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    8iKS, Да, точно, адрес же можно тупо вывести. Например из main() и из dllmain(). Не вызывая функцию вообще.

    В дизассемблере видно, что это начало какой-то функции, но я не вижу там никакого вывода в cout. Это точно auth() из поста? Еще, не видно, что там ниже происходит.

    Я вижу, что функция по A1040 ожидает что-то полезное в rcx, кажется указатель на указатель на структуру, положенное туда вызывателем. Но там оказывается что-то не то. По смыслу, это какой-то указатель должен быть в параметрах функции. Но auth() не принимает никаких параметров! Сдается мне, что оптимизатор заинлайнил auth() и ее в екзешнике тупо нет. А нашли вы и вызываете что-то не то.

    Попробуйте сначала без оптимизаций auth скомпилировать (-O0), тогда ассемблерный код будет понятнее и ее не заинлайнит.

    P.s. Вы, вижу, вопрос отредактирвали. Ваш дизассемблер main() показывает, что auth точно заинлайнена. Там нет ее вызова, а сразу вызвыаются функции cout. Удивительно, что там что-то по A1040 вообще есть. Вряд ли это ваша auth().

    Кстати, добавив вывод адреса auth в main вы, вероятно, тоже добъетесь, что оптимизатор ее не выкинет.
    Написано
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    rPman,
    а ну это же не принципиально

    Принципиально. Вы совсем не в теме, а копируете вывод булшит-машины. Тут разница как между "как зарядить телефон он пауер-банка?" и "как зарядить пауер-банк от телеофна?". Ни один пункт из скопированной вами инструкции тут не применим вообще.
    Написано
  • Чем вызван краш программы?

    wataru
    @wataru Куратор тега C++
    rPman, На вопрос я ответил. А проблема в отрыжке GPT, что он объясняет, как использовать функцию из библиотеки в экзешнике, а автору надо, наоборот, из dll-ки запустить функцию основного процесса.
    Написано
  • Когда целесообразно использовать именно такую реализацию DSU?

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322,
    лично в моём понимании как раз dsu и должен давать ощутимый выигрыш, когда прилетают рандомные union'ы и добавляются новые элементы через makeSet :)


    Ну, такой паттерн dfs-ом сделать сложно. Только если все union'ы заранее известны. И там эти два подхода не различимы по скорости, в общем-то. Кому что нравится. А если заранее все неизвестно, и надо именно по одному union делать, то DSU - лучше всего.
    Написано
  • Когда целесообразно использовать именно такую реализацию DSU?

    wataru
    @wataru Куратор тега Алгоритмы
    floppa322,
    те реализации, которые я видел, на вики, например, обычно не имели списка всех элементов одного множества, вот, например, та, которую для leetcode/codeforces использую DisjointSetUnion


    Ну так это у вас DSU тарьяна и есть. Вы же процитировали описание "тривиальной" альтернативы. Список элементов в множестве нужен будет для перекраски, чтобы не проходиться по всем n элементам, а только по элементам множества. Иначе объединение будет O(n) а не O(log n) и DSU окажется еще лучше.

    если по какой-то причине не удалось сжать координаты (id элементов множеств), то придётся хеш таблицы использовать, а не плотные массивы


    Ну да, вместо массивов будут хешмапы. Но тогда и в DSU будет хешмап.

    люди зачем-то использовали disjoint set, там где можно было обойтись обычным dfs'ом, и на этой почве как раз и возник вопрос :)


    Я бы в этой задаче тоже dfs использовал. Но, может, кому-то dsu первым в голову придет. Кому-то dsu может показаться проще dfs. Проще писать, проще осмыслить, короче код.
    Написано