|
|
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
Как-то просмотрел это сообщение, только заметил. 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() избавиться сложнее, но реально. Уберу, попробую. Спасибо за совет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 10:47 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
Внедрить длл можно и через обычные хуки, так даже правильнее будет. Могу дать исходники внедрения, но на асме:). То что не успевают инициализироваться длл - очень спорно, но проверить просто - перехватить ZwResumeThread, и процес создавать без флага CREATE_SUSPENDED, а в обработчике ZwResumeThread уже внедрять свою длл. Ещё вариант - создавайте процес с флагом DEBUG_PROCESS - и мониторь все исключения, что происходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 12:10 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
Вот_он_я_какойВнедрить длл можно и через обычные хуки, так даже правильнее будет. Могу дать исходники внедрения, но на асме:). На асме пока не надо :) Внедрение через хуки у Рихтера с примерами описано. Только очереди сообщений может не быть. Тот процесс, который сегодня гадит на экран не показывается, помолотит немного и закрывается, если не зависнет. Вот_он_я_какойТо что не успевают инициализироваться длл - очень спорно, но проверить просто - перехватить ZwResumeThread, и процес создавать без флага CREATE_SUSPENDED, а в обработчике ZwResumeThread уже внедрять свою длл. От этой теории я уже отказался, когда Sleep(500) сделал, а оно снова вылетело и продолжало глючить на всех подряд последующих запусках до закрытия родительского процесса. Сейчас вся надежда что это из-за advapi32.dll и user32.dll которые к моей dll прилинкованы. Вот_он_я_какойЕщё вариант - создавайте процес с флагом DEBUG_PROCESS - и мониторь все исключения, что происходят. А это действительно вариант, если не избежать вылета, то хоть от пользователя спрятать. Поизучаю эту тему поподробнее. Я правильно понимаю: я создаю дочерний процесс, в случае исключения об этом информируется родительский, где я могу прибить дочерний и запустить его заново без внедрения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 16:12 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
>>Только очереди сообщений может не быть. А она и не нужна. Делайте все перехваты в длл майн при загрузке, а потом пусть хоть что происходит. >>А это действительно вариант, если не избежать вылета, то хоть от пользователя спрятать. Поизучаю эту тему поподробнее. Я правильно понимаю: я создаю дочерний процесс, в случае исключения об этом информируется родительский, где я могу прибить дочерний и запустить его заново без внедрения? В принципе да. Фактически ваш процес будет отлаживать порождаемый ->полный контроль и всё что будет происходить станет вам известно первому. Тут есть несколько моментов: 1. Процес будет под отладкой - это приемлемый вариант на стадии разработки, но имхо, в рабочей версии этого лучше избежать 2. Если вы захотите прекратить отлаживать и при этом сохранить процес в рабочем состоянии - получится только под XP и выше. Где-то я видел опессорсные отладчики, чтобы самому не мучаться, поищите, там почти всё за вас уже сделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2007, 17:40 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
от wsprintf`а избавился, пришлось правда свой конвертер с юникода делать. Сейчас только функции из kernel32.dll. Есть еще один еще один нехороший момент с другими dll, но его я пока убрал, т.к. еще один серьезный косяк вылез: Появилась новая дочерняя прога, если в нее внедряться сразу после создания процесса, то у нее кнопки исчезают т.е. если запустить просто - кнопки есть, а если с внедрением моей dll, то вместо кнопок пустые прямоугольники. Причем оставил только внедрение, без перехватов, т.е. в дочернем процессе ничего не делается, кроме загрузки dll. Если дать дочернему процессу до конца загрузиться, а потом внедряться, то все нормально, кнопки есть. Прога написана на дельфях, кнопки класса TbitBtn (если кто с дельфями знаком) Заметил что некоторые модули в дочерней проге при внедрении грузятся по другим адресам. Пробовал разные базовые адреса для загрузки моей dll - не помогло. Как это обойти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 10:19 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
в дельфе дллки вроде как динамически подгружаются, как ком-модули. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 13:07 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
Вот_он_я_какой>>Только очереди сообщений может не быть. А она и не нужна. Делайте все перехваты в длл майн при загрузке, а потом пусть хоть что происходит.Я наверно что-то недопонимаю. Везде пишут про 2 способа внедрения: 1. Который я использую сейчас, записать в адресное пространство дочернего процесса какой-нибудь код и запустить его через CreateRemoteThread() 2. Через хуки, устанавливается хук SetWindowsHookEx(), а затем шлется сообщение, при приеме которого в дочерний процесс загружается моя dll. Т.е. если очереди сообщений нет, то и дочерний процесс его не примет и мою dll не загрузит Пишут еще, правда, про третий вариант - копирование всего кода dll из родительского процесса в дочерний и запуск dllmain(), но тут я очень смутно представляю как памятью управлять и как новый базовый адрес задать. maXmoв дельфе дллки вроде как динамически подгружаются, как ком-модули. Похоже надо менять способ внедрения. Чувствую не победить мне внедрение до начала работы процесса. Попробую все-таки через хуки, хотя тут можно внедриться после того как все интересное произошло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 16:07 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
насколько я помню, очередь сообщений есть всегда, она создаётся не для окна, а для потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 17:14 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
Dima Tпоэтому задачи этой dll: 1. Частичное шифрование базы фокса (некоторых dbf). Средствами фокса это сделать гораздо сложнее и работать будет медленнее, и сопровождать тяжелее. Это работает, но я пока все что с шифрованием связано из кода убрал для отладки. 2. Контроль изнутри за активностью "дружественных" прог, на предмет обращения к нашим dbf-кам, для своевременного реагирования в случае нововведений у них. 3. На сегодня один "шпиенский" процесс периодически виснет и оставляет держать открытыми монопольно наши dbf. Соответственно наша прога не может их открыть. Клиенту мы не можем (по политическим причинам) сказать "эти уроды даже инфу снять не могут по-человечески", поэтому приходится валить все комп клиента и просить перезагрузиться, что все равно дает минус в отношении к нашей проге. 4. Хочется решить задачу универсально с заделом на будущее, т.к. сегодня один гадит, завтра второй начнет.Вот исходя из этого, я бы пошел по пути виртуальных файлов. Перемещаешь реальные файлы куда-нибудь подальше, а в стартапе запускаешь свой процесс который создает виртуальный каталог с dbf'ками и все обращения к виртуальным файлам пропускает через себя а потом отправляет к реальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2007, 17:36 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
White OwlВот исходя из этого, я бы пошел по пути виртуальных файлов. Перемещаешь реальные файлы куда-нибудь подальше, а в стартапе запускаешь свой процесс который создает виртуальный каталог с dbf'ками и все обращения к виртуальным файлам пропускает через себя а потом отправляет к реальным. Реальные все-равно будут присутствовать и никто не мешает к ним зацепиться. Или кто мешает внедриться в мой процесс и получать правильную расшифрованную инфу. Какое-то серьезное шифрование я использовать не хочу, т.к. прога и так тяжелая, а компы у некоторых клиентов очень слабые, и частенько глючные. Планирую шифровать только полностью восстановимые данные (это несколько файлов), и то для зашиты от копирования на другой комп. Я вообще не сторонник защиты своего софта, т.к. был печальный опыт расхлебывания гемороя из-за самодельной защиты. На сегодня я пошел путем кормления шпиенов инфой похожей на правду, но попытки воспользоваться экономическим анализом собранной инфы приведут к неприятным последствиям. Сейчас надо отследить момент когда они поймут что их г...ом кормят, разберутся где правильную инфу взять, и в этот момент переделать базу так, чтобы они снова обломались. Для всего этого есть каналы связи и механизмы автообновления. Почему и хочется создать в первую очередь механизм контроля, а не защиты. И просто полностью подорвать доверие к собранной инфе, тогда и желание ее собирать исчезнет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2007, 07:54 |
|
||
|
Исключение при загрузке DLL
|
|||
|---|---|---|---|
|
#18+
>>Реальные все-равно будут присутствовать и никто не мешает к ним зацепиться. Так же им никто не мешает снять перехваты со своего процесса, что куда проще того, что вы перечислили. >>Или кто мешает внедриться в мой процесс и получать правильную расшифрованную инфу. Это хоть и довольно сложно, но сделать проще, чем захучить функции так, чтобы перехват не сняли Если всё обстоит так, что кто-то целенаправленно готов исследовать вашу прогу, для того, чтобы спереть эти файлы - хуки на апишки вам не помогут(если у того, кто хочет спереть есть хоть маленький опыт в программировании прог типа протов, или взломе) О основных способах перехвата можно почитать сдесь 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2007, 10:06 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34371848&tid=2029323]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 523ms |

| 0 / 0 |
