Ограничения накладываемые rundll32 на LdrLoadDll (креш)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by slesh, 13 Jan 2013.

  1. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Суть ошибки: при загрузке dll через rundll32 перестает работать функция LdrLoadDll, при тех же действиях в любой другой программе - всё норм. Причем перестает работать не в текущем процессе, а в дочернем процессе.
    В общем идея проста - загрузка DLL в запускаемый процесс, но так чтобы DLL загрузилась раньше кода запускаемой программы. т.е.
    CreateProcess(CREATE_SUSPENDED) + WriteProcessMemory(шелкод) + QueueUserApc(шелкод) + ResumeThread. Шелкод вызывает LdrLoadDll.

    И такс, кому хочется покопаться, накидал тестилку. Смысл тестилки таков:
    1) Тестовая DLL загружается или через тестовую прогу или через rundll32 и выполняется TestProc
    2) В TestProc запускается через CreateProcessA процесс child.exe с флагом CREATE_SUSPENDED
    3) Далее в АП запущенного процесса закидывается шелкод
    4) Ставится APC на шелкод
    5) Запускается главный поток программы.

    В аттаче все тестовые проги/dll и их исходники.


    И так, запускаю первый тест (тестовая программа делает LoadLibrary("test.dll") + GetProcAddress("TestProc") и выполняет TestProc).
    DebugView показывает [PID][FROM:pID] Message

    Далее загружаем DLL через rundll32.exe test.dll,TestProc
    И ловим падение дочернего процесса еще до загрузки DLL. на разный ОС стек вызовов чуть отличается.


    Win Vista X32 SP2 (видно что образ DLL не погружен)
    Win 7 X32 (видно что образ DLL не погружен)
    Win 7 X64 SP1 (видно что образ DLL уже погружен)
    В общем-то, для x64 систем, ошибка там же происходит, только этого не видно из-за WOW64.
    На XP SP3 бага нет.

    Причем если под отладчиком в rundll32 убрать вызов ActivateActCtx, то всё работает нормально.
    т.е. реально какой-то баг в винде который не дает нормально функционировать LdrLoadDll.

    Как бороться с этим - хз, может у кого-то есть предположения? Была идея делать DeactivateActCtx, но не прокатит по причине того что нельзя узнать Cookie.
     

    Attached Files:

    #1 slesh, 13 Jan 2013
    Last edited: 13 Jan 2013