Страница: 1 |
Страница: 1 |
Вопрос: Снова SEH, или задачка обратная тривиальной.
Добавлено: 22.11.06 18:40
Автор вопроса: LamerOnLine | ICQ: 334781088
В очередной раз делаю заход да VBшную беспомощьность при возникновении исключений. Задача продолжения работы уже не стоит, цель - залогировать сам факт и основные параметры необработанного исключения, после чего завершить программу в обычном для gpf порядке.
Столкнулся с одной проблемой - имея адрес возникновения исключения я не могу получить хендл модуля, размешенного по нему и, как следствие, имя этого модуля.
АПИ в данном случае не помогают, полномасштабную ручную раскрутку стека проводить желания нет. Ищу варианты.
Ну в этом и, собственно, вопрос. Кстати, юбилейный :)
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #1
Добавлено: 22.11.06 19:31
Без приколов - честно, на VB такое, снимаю шляпу
Первое что голову пришло,- при старте проги
разблокировать от read-only немножко места в PE-загруженого заголовка
и сохранить там хендл модуля(ей).
Т.е. что-то типа
hModule=GetModuleHandle(""
hModuleKeeped=hModule+&h200 ' там все равно всякая ненужная чушь
VirtualProtect(hModuleKeeped, &h100,%PAGE_READWRITE,BYREF OldProtect)
WriteProcessMemory(GetCurrentProcessID(),hModuleKeeped, BYREF hModule,4,0)
ну и при возникновении SEH, вытаскивать от туда хэндл.
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 23.11.06 10:50
На самом деле это ActiveX библиотека на C++. Просто подключаю её к VB проекту, в котором нет кода, только создание объекта. В сяшном конструкторе класса задаю через SetUnhandledExceptionFilter свою функцию-фильтр, в которой сохраняю время и код ошибки в файл. Но! Задача именно в том, как, имея Eip, получить того хендл модуля. По правде говоря, не вижу как WriteProcessMemory тут поможет
Номер ответа: 3
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #3
Добавлено: 24.11.06 19:41
ToolHelp (вроде так называется) апи используй. я этого не делал, но дамперы умеют читать какие модули по каким адресам загружены. используй эти апи и сравнивай eip с положением модулей в памяти.
Номер ответа: 4
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #4
Добавлено: 25.11.06 01:59
Ra$cal, судя по всему, имеет ввиду Module32First/Module32Next и MODULEENTRY32.modBaseAddr, modBaseSize и hModule
Номер ответа: 5
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #5
Добавлено: 25.11.06 13:11
Дада, именно это и имел ввиду.