Хобрук: Ваш путь к мастерству в программировании

Определение того, была ли инициализация CRT выполнена во внедренном процессе


Я работаю над приложением, которое внедряет dll при запуске процесса (Suspend --> Inject --> Resume) Самый первый вызов в DllMain с DLL_PROCESS_ATTACH (во внедренной dll) – это вызов MessageBox( ) (только для целей отладки). Однако этот вызов MessageBox() иногда выдает ошибку и приводит к сбою внедренного процесса.

Ошибка выполнения!
Программа: C:\Program Files\Microsoft Office\Office14\OUTLOOK.EXE

R6030
- CRT не инициализирован

Это воспроизводимо, например, с Outlook и Winword. Хотя Блокнот, IE, CMD, Calc и многие другие - распечатайте окно сообщения и продолжайте нормально.

Печать окна сообщения для меня не обязательна, поэтому я просто хочу иметь возможность проверить, выполнила ли CRT инициализацию или нет, чтобы я мог продолжить как обычно:

case DLL_PROCESS_ATTACH:
     if (IsCRTInitialized())
        MessageBox(...);

Пожалуйста, дайте мне знать, если какая-то информация отсутствует. Спасибо!

22.11.2011

Ответы:


1

Kernel32.dll гарантированно загружается в адресное пространство процесса, когда функция точки входа DLLMain. MessageBox находится в user32.dll и согласно Рекомендации по созданию DLL, вызывающие функции из user32.dll, категорически запрещены.

Вы также можете

  1. Вызовите OutputDebugString для любой трассировки отладчика. Эта функция находится в kernel32.dll и должна быть безопасной для вызова.

  2. Прежде чем ваше приложение загрузит какие-либо другие библиотеки DLL, вызовите MessageBox самостоятельно. Это гарантирует, что user32.dll и его зависимости уже загружены. Таким образом, вызов MessageBox в DllMain может иметь больше шансов на успех. Но ваш пробег может отличаться.

22.11.2011
  • Спасибо @parapura. Я знаю о OutputDebugString (на самом деле он уже используется). Однако это не решает данную проблему. Основная цель этого окна сообщения — не просто показать мне какой-то текст, а иметь возможность отладки-присоединения к любому созданию процесса на самых первых его шагах. Большинство процессов могут вызывать MessageBox() на этой самой ранней стадии. 22.11.2011
  • Продолжить: я не пытаюсь найти способ форсировать наличие окна сообщения (я знаю, что не могу), но, по крайней мере, знать, что ЭЛТ не была инициализирована, будет достаточно. Я подумал, что могу попытаться проверить это, используя GetModuleHanlde для user32.dll (а не LoadLibrary), но на самом деле я получаю действительный дескриптор HMODULE для user32.dll... Я не хочу загружать user32.dll в мою внедренную dll, поскольку она может быть не нужна. 22.11.2011
  • Если вашей целью является отладка создания процесса прикрепления. Используйте параметры выполнения файла изображения 22.11.2011
  • Еще раз спасибо. Выполнение файла изображения приятно и полезно, но это все же не то, что мне нужно. С его помощью любое выполнение выбранного процесса будет запускаться в отладке (даже когда моей внедренной dll там нет) + запускается другой экземпляр VisualStudio вместо того же самого + я не могу использовать код-правила (например, я хочу чтобы иметь возможность отлаживать-присоединять только для exe (ов), у которых есть подстановка (outlook.exe / Shout.exe ...) , Вы случайно не знаете, действительно ли можно узнать, инициализирован ли CRT уже? 22.11.2011
  • @Elad Я думаю, вам может повезти, если кто-то ответит на ваш вопрос, если вы спросите, как я могу сделать бла, а не как найти CRT инициализирован. Запуск exe из DllMain - это не то, что обычно делают люди. 22.11.2011

  • 2

    Проблема не в ЭЛТ. Вам не разрешено вызывать MessageBox или любую другую нетривиальную функцию из DllMain.

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

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

    мои январские чтения по программированию
    Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

    Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
    Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

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

    Введение в машинное обучение для обнаружения аномалий (часть 1)
    Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

    Начало работы с Pulumi в Digital Ocean
    Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..

    #Day68 из #100days_of_coding
    Вчера был мой 68-й день кодинга. я решил один вопрос Проблема: Разбить двоичную строку на подстроки с равным количеством нулей и единиц Дана двоичная строка str длины N . Задача состоит..