Проблема с жесткой загрузкой DLL в процесс

Тема в разделе "WASM.BEGINNERS", создана пользователем Rel, 6 окт 2009.

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.375
    Делаю функцию загрузки DLL в процесс, альтернативу LoadLibrary. В краце алгоритм - загружаю библиотеку в память, настраиваю релоки, настраиваю таблицу импорта, передаю управление на точку входа. Для тестов сделал DLL, которая просто выводит MessageBox, оптимизацию отключил, зависимость от msvcr80.dll тоже. Все проходит нормально, до того момента, как серия вызовов функций не доходит до 0x7C809100 инструкции (уже в kernel32.dll), вываливается исключение, мол "привелигированная инструкция":
    Код (Text):
    1. 7C8090F8 44               inc         esp  
    2. 7C8090F9 4C               dec         esp  
    3. 7C8090FA 4C               dec         esp  
    4. 7C8090FB 2E 52            push        edx  
    5. 7C8090FD 74 6C            je          7C80916B
    6. 7C8090FF 41               inc         ecx  
    7. 7C809100 6C               ins         byte ptr es:[edi],dx
    8. 7C809101 6C               ins         byte ptr es:[edi],dx
    9. 7C809102 6F               outs        dx,dword ptr [esi]
    10. 7C809103 63 61 74         arpl        word ptr [ecx+74h],sp
    11. 7C809106 65 48            dec         eax  
    12. 7C809108 65 61            popad            
    13. 7C80910A 70 00            jo          7C80910C
    Не могу понять в чем дело. Цикл вызовов проходит нормально, проверял дизассемблером/отладчиком (то есть ситуация, что произошел jmp/call на середину инструкции и все инструкции "поплыли", отпадает). Фактически в ольке проходит эта инстукция нормально, а когда я гружу DLL в любой другой процесс, например в notepad.exe, бедный блокнот валится с таким исключением. Как Вы думаете, в чем может быть дело?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.375
    Приходит он сюда прышком на адрес 0x7C8090F6 (это HeapAlloc), если эта информация поможет канеш))
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Rel
    Это не HeapAlloc, а адрес строки RtlAllocateHeap. В своей dll неверно настраиваете импорт сквозного экспорта kernel32.