Будет ли ASLR вызывать трения для адреса с внедрением DLL?

Я читал о технике внедрения DLL, и у меня был этот вопрос.

Предположим, мы хотим внедрить DLL в процесс назначения в Windows 7, в котором включен ASLR для kernel32.dll.

Таким образом, любая часть внедренного кода не может использовать какой-либо winapi или любой системный вызов, поскольку адрес, скажем, функции loadLibrary в коде инжектора будет отличаться от адреса loadLibrary в целевом процессе, не так ли?

Так что такой вызов CreateRemoteThread не сработает:

CreateRemoteThread(hProcess,
                   NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
                                                             "LoadLibraryA" ),
                   pLibRemote,
                   0,
                   NULL );

::WaitForSingleObject( hThread, INFINITE );

Поправьте меня, если я ошибаюсь в этих рассуждениях.


person CnativeFreak    schedule 19.12.2011    source источник


Ответы (2)


Нет, я считаю, что это неправильно. Адреса таких модулей, как kernel32.dll, рандомизируются при загрузке машины, но одинаковы для всех процессов.

person hmjd    schedule 19.12.2011
comment
так это означает, что такие модули, как kernel32.dll, загружаются только один раз? и когда исполняемый файл загружается и он есть в таблице импорта, он просто получает указатель на уже загруженную dll? тогда не могли бы вы объяснить раздел ASLR и LoadLibrary в этой ссылке insecure.in/papers/vista_dll_injection.pdf почему GetModuleHandle находится по тому же адресу, а LoadLibraryA — нет?? - person CnativeFreak; 20.12.2011
comment
@CnativeFreak, это говорит об этом. Поскольку при каждой перезагрузке (или двух) адрес kernel32.dll (который содержит процедуру LoadLibrary) может меняться, мы используем GetModuleHandle для получения адреса LoadLibraryA, который будет одинаковым в адресном пространстве удаленного потока. в этом документе. Не сказано, что GetModuleHandle() находится по тому же адресу. - person hmjd; 20.12.2011
comment
мы используем GetModuleHandle для получения адреса LoadLibraryA, который будет таким же в адресном пространстве удаленного потока, почему GetModuleHandle будет таким же в адресном пространстве удаленного потока, а LoadLibraryA - нет? - person CnativeFreak; 20.12.2011
comment
@CnativeFreak, они оба одинаковы. Он просто указывает, как это делается, и что адрес любой функции, экспортируемой kernel32.dll, не может быть жестко запрограммирован. - person hmjd; 20.12.2011
comment
GetModuleHandle также экспортируется из ядра32, почему он может быть жестко запрограммирован, а LoadLibraryA не может быть?? что я не могу понять, почему он может напрямую использовать GetModuleHandle и не может напрямую использовать LoadLibraryA - person CnativeFreak; 20.12.2011
comment
О .. теперь я понял .. Я очень извиняюсь за вопрос неудобства .большое спасибо @hmjd - person CnativeFreak; 20.12.2011
comment
Адрес модуля может не измениться, но это не делает то, что делает OP, безопасным! Рассмотрим случай, когда ваше приложение работает с включенными прокладками (что-то, что вы не контролируете!) или даже случай, когда некоторые другие части программного обеспечения, которые также выполняют перехватчики EAT, работают в вашем процессе (опять же, это не то, что вы контролируете). В этом случае GetProcAddress может вернуть указатель на функцию в другом модуле того, что вы ожидаете/спрашиваете, включая ту, которая не загружена в процессе, для которого вы собираетесь вызвать CreateRemoteThread, в этом случае цель выйдет из строя . - person RaptorFactor; 17.12.2013

он может использовать GetModuleHandle (и GetProcAddress) напрямую, ИЗ ТАБЛИЦЫ ИМПОРТА ИНЖЕКТОРА, которая перенаправит вызов GetModuleHandle ON KERNEL32, чтобы получить адрес LoadLibraryA ON KERNEL32, который можно использовать в любом процессе

если бы он передал жестко закодированный адрес LoadLibraryA напрямую, он передал бы адрес LoadLibraryA В ТАБЛИЦЕ ИМПОРТА ИНЖЕКТОРА, который не совпадает с целевым процессом.

можно спросить: "почему он не переводит таблицу импорта вместо вызова GetModuleHandle и GetProcAddress?". Таблица импорта — это просто таблица указателей, полученных исполняемым загрузчиком с помощью ТАКИХ же GetModuleHandle и GetProcAddress (на самом деле не одинаковых, но похожих)

person Tulio150    schedule 30.06.2012