powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключение при загрузке DLL
11 сообщений из 36, страница 2 из 2
Исключение при загрузке DLL
    #34368635
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то просмотрел это сообщение, только заметил.
maXmoкстати, посмотри зависимости, не грузится ли при её запуске лишних дллей.
Попытался смотреть остановив отладчиком сразу после отработки внедренного трэда (процесс в состоянии SUSPENDED), загружены уже все dll, которые нужны дочернему процессу.

depends показывает:
KERNEL32.DLL (куча функций)
USER32.DLL (wsprintfA())
ADVAPI32.DLL (InitializeSecurityDescriptor(), SetSecurityDescriptorDacl())

Функции InitializeSecurityDescriptor(), SetSecurityDescriptorDacl() убрал, теперь ADVAPI32.DLL не грузится. Они случайно перетащились из другого проекта, там общий блок памяти использовался для всех пользователей терминал-сервера.

KERNEL32.DLL грузит только NTDLL.DLL
USER32.DLL грузит GDI32.DLL, KERNEL32.DLL, NTDLL.DLL
GDI32.DLL грузит USER32.DLL, KERNEL32.DLL, NTDLL.DLL

От wsprintf() избавиться сложнее, но реально. Уберу, попробую.

Спасибо за совет.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34368708
Внедрить длл можно и через обычные хуки, так даже правильнее будет.
Могу дать исходники внедрения, но на асме:).
То что не успевают инициализироваться длл - очень спорно, но проверить просто - перехватить ZwResumeThread, и процес создавать без флага CREATE_SUSPENDED, а в обработчике ZwResumeThread уже внедрять свою длл.
Ещё вариант - создавайте процес с флагом DEBUG_PROCESS - и мониторь все исключения, что происходят.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34368945
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот_он_я_какойВнедрить длл можно и через обычные хуки, так даже правильнее будет.
Могу дать исходники внедрения, но на асме:). На асме пока не надо :) Внедрение через хуки у Рихтера с примерами описано. Только очереди сообщений может не быть. Тот процесс, который сегодня гадит на экран не показывается, помолотит немного и закрывается, если не зависнет.
Вот_он_я_какойТо что не успевают инициализироваться длл - очень спорно, но проверить просто - перехватить ZwResumeThread, и процес создавать без флага CREATE_SUSPENDED, а в обработчике ZwResumeThread уже внедрять свою длл.
От этой теории я уже отказался, когда Sleep(500) сделал, а оно снова вылетело и продолжало глючить на всех подряд последующих запусках до закрытия родительского процесса. Сейчас вся надежда что это из-за advapi32.dll и user32.dll которые к моей dll прилинкованы.
Вот_он_я_какойЕщё вариант - создавайте процес с флагом DEBUG_PROCESS - и мониторь все исключения, что происходят.
А это действительно вариант, если не избежать вылета, то хоть от пользователя спрятать. Поизучаю эту тему поподробнее. Я правильно понимаю: я создаю дочерний процесс, в случае исключения об этом информируется родительский, где я могу прибить дочерний и запустить его заново без внедрения?
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34369031
>>Только очереди сообщений может не быть.
А она и не нужна. Делайте все перехваты в длл майн при загрузке, а потом пусть хоть что происходит.

>>А это действительно вариант, если не избежать вылета, то хоть от пользователя спрятать. Поизучаю эту тему поподробнее. Я правильно понимаю: я создаю дочерний процесс, в случае исключения об этом информируется родительский, где я могу прибить дочерний и запустить его заново без внедрения?

В принципе да. Фактически ваш процес будет отлаживать порождаемый ->полный контроль и всё что будет происходить станет вам известно первому. Тут есть несколько моментов:
1. Процес будет под отладкой - это приемлемый вариант на стадии разработки, но имхо, в рабочей версии этого лучше избежать
2. Если вы захотите прекратить отлаживать и при этом сохранить процес в рабочем состоянии - получится только под XP и выше.

Где-то я видел опессорсные отладчики, чтобы самому не мучаться, поищите, там почти всё за вас уже сделано.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34370478
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от wsprintf`а избавился, пришлось правда свой конвертер с юникода делать. Сейчас только функции из kernel32.dll. Есть еще один еще один нехороший момент с другими dll, но его я пока убрал, т.к. еще один серьезный косяк вылез:

Появилась новая дочерняя прога, если в нее внедряться сразу после создания процесса, то у нее кнопки исчезают т.е. если запустить просто - кнопки есть, а если с внедрением моей dll, то вместо кнопок пустые прямоугольники. Причем оставил только внедрение, без перехватов, т.е. в дочернем процессе ничего не делается, кроме загрузки dll. Если дать дочернему процессу до конца загрузиться, а потом внедряться, то все нормально, кнопки есть.
Прога написана на дельфях, кнопки класса TbitBtn (если кто с дельфями знаком)
Заметил что некоторые модули в дочерней проге при внедрении грузятся по другим адресам. Пробовал разные базовые адреса для загрузки моей dll - не помогло.

Как это обойти?
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34371156
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в дельфе дллки вроде как динамически подгружаются, как ком-модули.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34371848
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот_он_я_какой>>Только очереди сообщений может не быть.
А она и не нужна. Делайте все перехваты в длл майн при загрузке, а потом пусть хоть что происходит.Я наверно что-то недопонимаю. Везде пишут про 2 способа внедрения:
1. Который я использую сейчас, записать в адресное пространство дочернего процесса какой-нибудь код и запустить его через CreateRemoteThread()
2. Через хуки, устанавливается хук SetWindowsHookEx(), а затем шлется сообщение, при приеме которого в дочерний процесс загружается моя dll. Т.е. если очереди сообщений нет, то и дочерний процесс его не примет и мою dll не загрузит
Пишут еще, правда, про третий вариант - копирование всего кода dll из родительского процесса в дочерний и запуск dllmain(), но тут я очень смутно представляю как памятью управлять и как новый базовый адрес задать.
maXmoв дельфе дллки вроде как динамически подгружаются, как ком-модули.
Похоже надо менять способ внедрения. Чувствую не победить мне внедрение до начала работы процесса. Попробую все-таки через хуки, хотя тут можно внедриться после того как все интересное произошло.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34372080
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я помню, очередь сообщений есть всегда, она создаётся не для окна, а для потока.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34372166
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tпоэтому задачи этой dll:
1. Частичное шифрование базы фокса (некоторых dbf). Средствами фокса это сделать гораздо сложнее и работать будет медленнее, и сопровождать тяжелее. Это работает, но я пока все что с шифрованием связано из кода убрал для отладки.
2. Контроль изнутри за активностью "дружественных" прог, на предмет обращения к нашим dbf-кам, для своевременного реагирования в случае нововведений у них.
3. На сегодня один "шпиенский" процесс периодически виснет и оставляет держать открытыми монопольно наши dbf. Соответственно наша прога не может их открыть. Клиенту мы не можем (по политическим причинам) сказать "эти уроды даже инфу снять не могут по-человечески", поэтому приходится валить все комп клиента и просить перезагрузиться, что все равно дает минус в отношении к нашей проге.
4. Хочется решить задачу универсально с заделом на будущее, т.к. сегодня один гадит, завтра второй начнет.Вот исходя из этого, я бы пошел по пути виртуальных файлов. Перемещаешь реальные файлы куда-нибудь подальше, а в стартапе запускаешь свой процесс который создает виртуальный каталог с dbf'ками и все обращения к виртуальным файлам пропускает через себя а потом отправляет к реальным.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34372974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВот исходя из этого, я бы пошел по пути виртуальных файлов. Перемещаешь реальные файлы куда-нибудь подальше, а в стартапе запускаешь свой процесс который создает виртуальный каталог с dbf'ками и все обращения к виртуальным файлам пропускает через себя а потом отправляет к реальным.
Реальные все-равно будут присутствовать и никто не мешает к ним зацепиться. Или кто мешает внедриться в мой процесс и получать правильную расшифрованную инфу. Какое-то серьезное шифрование я использовать не хочу, т.к. прога и так тяжелая, а компы у некоторых клиентов очень слабые, и частенько глючные. Планирую шифровать только полностью восстановимые данные (это несколько файлов), и то для зашиты от копирования на другой комп.
Я вообще не сторонник защиты своего софта, т.к. был печальный опыт расхлебывания гемороя из-за самодельной защиты.
На сегодня я пошел путем кормления шпиенов инфой похожей на правду, но попытки воспользоваться экономическим анализом собранной инфы приведут к неприятным последствиям. Сейчас надо отследить момент когда они поймут что их г...ом кормят, разберутся где правильную инфу взять, и в этот момент переделать базу так, чтобы они снова обломались. Для всего этого есть каналы связи и механизмы автообновления.
Почему и хочется создать в первую очередь механизм контроля, а не защиты. И просто полностью подорвать доверие к собранной инфе, тогда и желание ее собирать исчезнет.
...
Рейтинг: 0 / 0
Исключение при загрузке DLL
    #34373331
>>Реальные все-равно будут присутствовать и никто не мешает к ним зацепиться.
Так же им никто не мешает снять перехваты со своего процесса, что куда проще того, что вы перечислили.

>>Или кто мешает внедриться в мой процесс и получать правильную расшифрованную инфу.
Это хоть и довольно сложно, но сделать проще, чем захучить функции так, чтобы перехват не сняли

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

О основных способах перехвата можно почитать сдесь
http://www.wasm.ru/article.php?article=apihook_1
http://www.wasm.ru/article.php?article=apihook_2
http://www.wasm.ru/article.php?article=apihook_3
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Исключение при загрузке DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]