Nano Hash - криптовалюты, майнинг, программирование

Как отличить импортированную функцию от импортированной глобальной переменной в PE-заголовке DLL?

Я пишу небольшой инструмент, который должен иметь возможность проверять произвольный интересующий процесс и проверять, была ли какая-либо из его статически связанных функций батут. (примером батута может быть то, что Microsoft Detours относится к процессу.)

Для этого я анализирую заголовок PE. целевого процесса и получить все его импортированные библиотеки DLL со всеми импортированными функциями в них. Затем я могу сравнить следующее между библиотеками DLL на диске и библиотеками DLL, загруженными в память целевого процесса:

А. Записи в Import Address Table для каждой импортированной функции.

B. Первые N байтов машинного кода каждой функции.

И если что-то из вышеперечисленного не совпадает, это наверняка будет означать, что к конкретной функции (или WinAPI) был применен trampoline.

Это работает хорошо, за исключением одной ситуации, когда целевой процесс может импортировать глобальную переменную вместо функции. Например, такой глобальной переменной является _acmdln. Вы все еще можете найти его в msvcrt.dll и использовать как таковой:

//I'm not sure why you'd want to do it this way,
//but it will give you the current command line.
//So just to prove the concept ...
HMODULE hMod = ::GetModuleHandle(L"msvcrt.dll");
char* pVar = (char*)::GetProcAddress(hMod, "_acmdln");
char* pCmdLine = pVar ? *(char**)pVar : NULL;

Итак, для моего инструмента проверки трамплинов это означает, что мне нужно различать импортированную функцию (WinAPI) и глобальную переменную. Есть идеи как?

PS. Если я этого не сделаю, мой алгоритм, который я описал выше, будет сравнивать «байты кода» глобальной переменной, как если бы это была функция, которая является просто указателем на командную строку, которая наверняка будет другой, а затем пометит ее. как батутная функция.

PS2. Не совсем мой код, но аналогичный способ анализа заголовка PE можно найти здесь< /а>. (Найдите функцию DumpImports для извлечения импорта DLL.)


  • Вероятно, это невозможно на 100%, но проверка того, является ли память исполняемой или нет, должна быть закрыта. 20.12.2017
  • @DavidHeffernan: Спасибо. Это была и моя мысль. Однако я надеялся, что в самом заголовке PE есть что-то, что могло бы отличить их друг от друга, но я упустил из виду. 20.12.2017
  • Должно быть достаточно надежно отображать разделы памяти каждой целевой DLL и проверять диапазоны ваших указателей на эти диапазоны. Глобальные переменные, скорее всего, будут находиться в разделе .data или его эквиваленте. Кроме того, как указал @DavidHeffernan, вы можете проверить эти характеристики раздела (флаги, такие как чтение/запись/выполнение), а не имена разделов жесткого кодирования. Я не могу представить, чтобы сгенерированный компилятором код помещал экспортированные глобальные переменные в какой-либо раздел кода. Быстро взглянув на DLL CRT MSVC 10, я обнаружил, что _acmdln действительно находится в диапазоне раздела .data. 04.01.2018

Ответы:


1

Глобальные переменные будут находиться в разделе .data, а не в разделе .text, кроме того, у раздела не будет прав на выполнение, если это не функция. Поэтому вы можете использовать обе эти характеристики для фильтрации.

18.04.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..