Будет ли ASLR вызывать трение для адреса с DLL инъекцией? - PullRequest
3 голосов
/ 20 декабря 2011

Я читал о технике внедрения 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 );

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

Ответы [ 2 ]

7 голосов
/ 20 декабря 2011

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

0 голосов
/ 30 июня 2012

он может использовать GetModuleHandle (и GetProcAddress) напрямую из таблицы импорта инжектора, которая будет перенаправлять вызов GetModuleHandle ON KERNEL32, чтобы получить адрес LoadLibraryA ON KERNEL32, который можно использовать в любом процессе

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

можно спросить: «почему это не так?перевести таблицу импорта вместо вызова GetModuleHandle и GetProcAddress? ".Таблица импорта - это всего лишь таблица указателей, полученных исполняемым загрузчиком с использованием ЖЕ GetModuleHandle и GetProcAddress (на самом деле не то же самое, но похожее)

...