pe loade - прошу помощи

Тема в разделе "WASM.BEGINNERS", создана пользователем vovka, 17 авг 2006.

  1. vovka

    vovka New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    45
    Написал свой лоадер 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 полно по программе
    делал выделение в отдельной функции и вызывал её в начале - то же самое

    Помогите!

    Заранее Благодарен!
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    AddressOfEntryPoint - это RVA.

    mov eax, ImageBase
    add eax, AddressOfEntryPoint
    call eax
     
  3. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Пример в студию.
     
  4. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    Поставь в начало DllMain jmp $
    Потом подключись к ней олей и протрейси, все узнаешь...
     
  5. vovka

    vovka New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    45
    Rustem
    не понял, можно поподробнее что сделать с олей,

    я ставил int 3 и оно мне вываливалось именно когда отрабатывало new
    но глубоко очень

    так что интересно если он не стоит в начале, куда я его поставил,
    а там где в вызовах функций - всё ок, я ведь писал выше
    что крутится нормальный хоть и маленький сервачок
     
  6. Rustem

    Rustem New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    429
    Адрес:
    Russia
    В оле File\Attach
    Выбираешь свой процесс.
    Потом вроде F9\F12 нажать надо типа Run\Pause
    Должен остановится на команде jmp
     
  7. vovka

    vovka New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    45
    И так!
    секция .data
    я в после восстановления наблюдаю в ней результат, т.е. куда надо прыгать для вызова
    какой-то АПИ

    Но на дне этой секции лежит какие-то данные, которых небыло в pe-файле!
    а после LoadLibrary появляется!

    что это зха инфа именно из-за неё моя прога валится, т.е. у меня там 0-ли,
    а после LoadLibrary данныё - что это
    SEH???
     
  8. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Все дело в RunTime-е.
     
  9. vovka

    vovka New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    45
    Что именно или хотя бы наводящее о Run-Time ???
    Я понимаю что это во время Run-Time - а именно во время LoadLibrary
     
  10. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Во время LoadLibrary вызывется EntryPoint библиотеки, где инициализируется RunTime (поэтому меняется ряд значений в секции .data). Если он проинициализировался как-то неграмотно (или вобще не проинициализировался), то может возникать такая ошибка. Вобщем, надо отлаживать, смотреть доходит-ли дело до HeapAlloc, например, во время вызова new.
     
  11. vovka

    vovka New Member

    Публикаций:
    0
    Регистрация:
    23 май 2006
    Сообщения:
    45
    доходит до ntdll.rtlAllocateHeap а в ней читает из памяти, которая расположена
    в конце секции .data ( а там 0 у меня), потом пытается по этому адресу чегото выбрать
    ну и завал!

    значить у меня EntryPoint чего-то не так делает

    как мне посмотреть на выполнение EntryPoint во время LoadLibrary!?
    Я туда дебагером немогу добраться!
     
  12. Dimson

    Dimson New Member

    Публикаций:
    0
    Регистрация:
    7 июл 2005
    Сообщения:
    59
    Адрес:
    Russia
    Можно хотя-бы в IDA со встроенным Debugger-ом: открываешь свою длл, выбираешь Debugger\Process Options
    В качестве Application выбираешь свое приложение. Ставишь бряк на EntryPoint, запускаешь и смотришь что там происходит.

    На худой конец можно в длл-ке первый байт (куда EntryPoint указывает) на 0xCC поменять, запустить приложение под отладчиком и потом пофиксить этот байт обратно и выполнять все пошагово.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    надо не забывать что у такого loader'а есть определенные ограничения, может
    из-за этого и проблемы