Доброго времени суток. Сплайсю функции записи в реестр, путем внедрения в адресные пространства процессов своего DLL через ключ "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs". При загруженном компе прописываю в этот ключ свою DLL и она начинает автоматически подгружаться ко всем создаваемым процессам и при получении DLL_PROCESS_ATTACH идет перехват. Все пашет отлично и в файлик складывается инфа кто куда чего пишет. При перезагрузке же комп просит выбрать имя пользователя и ввести пароль (хотя раньше такого не было), потом выдает следущее: "Не удается войти в систему из-за следующей ошибки: Операция несовместима с состоянием транзакции для ветки реестра". Пользую XP SP3. Так же стоит Daemon Tools, который устанавливает sptd.sys, который перехватывает те же функции работы с реестром. Причем, если не перехватывать функции во всех этих процессах: smss.exe, csrss.exe, winlogon.exe и lsass.exe, то загрузка проходит успешно. Глючит какой-то из них. Какой не знаю - перезагружаться задолбался! Приходится пропускать основные процессы, в которые обычно и внедряются всякие интересности. А это не гуд. В чем может быть причина? Все процессы обрабатываются на ура, а какие-то из этих глючат. Есть какие-нибудь идеи? Может кто уже сталкивался? Спасибо.
Возможно ваша библиотека крошит реестр (или приложение). если выносите библиотеку то загружается нормально?
Приходится загружаться с диска и очищать ключ реестра. Тогда грузится нормально. Если уже в загруженном компе подключать DLL, то тоже все нормально Что такое?
h0t, сплайсю с трамплином NtSetValueKey. Даже в трамплине корректирую относительные jmp и call. Использую функции GetModuleHandle, GetModuleFileName, GetProcAddress, VirtualProtect, WideCharToMultiByte, wsprintf и в исключительных случаях MessageBox. Смысл: отслеживание изменения ключей реестра, ответственных за автозагрузку.
Частая ошибка, когда человек импортирует функции из библиотек, которые ЕЩЕ НЕ ЗАРГРУЖЕНЫ. Например из User32.dll. Сперва посмотрите ваш импорт и уберите все высокоуровневые апи. После того, как система прогрузилась, все длл уже загружены и ошибка не возникает.
Magnum, user32.dll действительно используется. Но линковка статическая. Разве загрузчик не должен подгружать все необходимые DLL до запуска DllMain?
Локализуйте до процесса одного. возможно в этом процессе уже установлен аналогичный перехват слегка кривее Или слегка несовместим с вашим перехватом)
Должен. Но некоторые модули можно загрузить только после полной загрузки системы. К примеру user32.dll, т.к. он тянет за собой всю высокоуровневую обертку графической подсистемы. Да ту же gdi32.dll. Вся эта байда при попытке загрузки на начальном этапе старта ОС закрешит smss.exe и csrss.exe. Либо инжектируйте после авторизации и полного старта системы, либо отказывайтесь от user32
Код (Text): push NewProc ret Что может быть слегка несовместимым? Да и AVZ видит перехват только в ядре. Может sptd.sys перехватывает эти функции в ядре, а их номера берет из ntdll.dll? Может такое быть?
Спасибо всем! Пошлю к черту user32.dll. Вот засада... Вот еще: где можно надыбать ХОРОШИЙ справочник Native API?
Fedor666 Вы можете использовать kernel32.dll, ntdll.dll, advapi32.dll Апи из этих модулей документированы в MSDN.