Доброго дня форумчанам. Пытаюсь получить стактрейс на х64 с помощью StackWalk64. На х32 всё работает, на х64 получаю стек адресов, по которым ничего не лежит: https://hastebin.com/oravicuwep.cpp И сам стактрейс слишком маленький (на х32, повторюсь, всё работает). Оптимизации отключены. Что не так?
HoShiMin, Никак вы не снимете бэктрейс на 64 в статике. Потому что это не поддерживает архитектура. Лишь при наличии дебаг символов, как делает это отладчик путём статического анализа и эвристики можно сформировать данный лог. Но это эмпирическое, вероятное решение, не удивительно что даже при не корректных адресах у вас на скрине снятие лога не прервано из за исключения. Коменты ведь есть в сурках нт, почему вы не читаете. Исходная задача какая, зачем вам стековый дамп ?
Для антиинжекта: поставить хук на LdrLoadDll и смотреть, кто его вызвал, а также периодически проверять стактрейс потоков, чтобы отслеживать смену контекста через SetThreadContext
Вообще решение есть, но требует драйвера и Intel платформы начиная с 5 Gen (лучше конечно с 6 Gen). Но со сменой контекста у вас все равно будут проблемы - PatchGuard
Очень желательно всё сделать в юзермоде, применить любую эвристику, чтобы узнать об инжекте, будь то CreateRemoteThread(LoadLibrary), APC, AppInit_DLLs, оконные хуки или ручной маппинг. Визоры - слишком хардкор (плюс, защищать надо в том числе софт без исходников), а вмп от хуков апишек не защищает. Но и аудитория у защищаемого софта не настолько продвинутая, чтобы была действительная необходимость в абсолютной защите. Нужна лишь достаточная.
Тогда вам надо забыть о трейсе, в юзере вы такое не получите, тем более, что софт без исходников. Как говорил инди - останутся только сплошные костыли, типа поставить хук на экспорты, поставить хук на аллокаторы памяти и проч, а потом в хуках, самому анализировать стек, что будет далеко не всегда точно.
HoShiMin, во первых, он не всегда такой полный во вторых - это ж саспенд состояние. + если посмотрите сорцы - берется из валиндого тред контекста, который содержит корректный стек фрейм. Я ж написал что - анализировать можно, но не всегда это будет так точно. пример явно левой хрени: