Написал свой лоадер pe (dll в часности) он: 1) мапит так как надо в памяти 2) восстанавливает таблицу импорта 3) экспорт пока не трогаю (пока!) 4) корректирую релоки далее беру Address Of Entry Point и делаю call [addr] (правильно ли это?) Взял простенький свой серверок реализовал как DLL в DllMain - старт загружаю - всё ок - работает! - ТЕСТИЛ - УРА НО, беру и в начале DllMain вставляю int * p; p = new int[100]; delete [] p; и всё выскакивает дебагер!!! Хотя вызовы new и delete полно по программе делал выделение в отдельной функции и вызывал её в начале - то же самое Помогите! Заранее Благодарен!
Rustem не понял, можно поподробнее что сделать с олей, я ставил int 3 и оно мне вываливалось именно когда отрабатывало new но глубоко очень так что интересно если он не стоит в начале, куда я его поставил, а там где в вызовах функций - всё ок, я ведь писал выше что крутится нормальный хоть и маленький сервачок
В оле File\Attach Выбираешь свой процесс. Потом вроде F9\F12 нажать надо типа Run\Pause Должен остановится на команде jmp
И так! секция .data я в после восстановления наблюдаю в ней результат, т.е. куда надо прыгать для вызова какой-то АПИ Но на дне этой секции лежит какие-то данные, которых небыло в pe-файле! а после LoadLibrary появляется! что это зха инфа именно из-за неё моя прога валится, т.е. у меня там 0-ли, а после LoadLibrary данныё - что это SEH???
Что именно или хотя бы наводящее о Run-Time ??? Я понимаю что это во время Run-Time - а именно во время LoadLibrary
Во время LoadLibrary вызывется EntryPoint библиотеки, где инициализируется RunTime (поэтому меняется ряд значений в секции .data). Если он проинициализировался как-то неграмотно (или вобще не проинициализировался), то может возникать такая ошибка. Вобщем, надо отлаживать, смотреть доходит-ли дело до HeapAlloc, например, во время вызова new.
доходит до ntdll.rtlAllocateHeap а в ней читает из памяти, которая расположена в конце секции .data ( а там 0 у меня), потом пытается по этому адресу чегото выбрать ну и завал! значить у меня EntryPoint чего-то не так делает как мне посмотреть на выполнение EntryPoint во время LoadLibrary!? Я туда дебагером немогу добраться!
Можно хотя-бы в IDA со встроенным Debugger-ом: открываешь свою длл, выбираешь Debugger\Process Options В качестве Application выбираешь свое приложение. Ставишь бряк на EntryPoint, запускаешь и смотришь что там происходит. На худой конец можно в длл-ке первый байт (куда EntryPoint указывает) на 0xCC поменять, запустить приложение под отладчиком и потом пофиксить этот байт обратно и выполнять все пошагово.