Мануалы описывают создание ReflectiveDll как "а теперь выкидываете свою DllMain и добавляете вот эти хидер и код". Зачем они вообще нужны, если весь код, который должен отработать, вызывается из DllMain/DLL_PROCESS_ATTACH? Какая магия содержится в Код (C++): case DLL_QUERY_HMODULE: if( lpReserved != NULL ) *(HMODULE *)lpReserved = hAppInstance; break; case DLL_PROCESS_ATTACH: hAppInstance = hinstDLL; break; ? Кто-нибудь в вопросе разбирался?
ormoulu, https://github.com/stephenfewer/ReflectiveDLLInjection/blob/master/dll/src/ReflectiveLoader.c Код (Text): if( !pDllMain( NULL, DLL_QUERY_HMODULE, &hResult ) ) --> Код (Text): ((DLLMAIN)uiValueA)( (HINSTANCE)uiBaseAddress, DLL_PROCESS_ATTACH, lpParameter ); --> Код (Text): uiBaseAddress = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)uiValueA)->DllBase; --> Код (Text): uiValueA = ((PIMAGE_NT_HEADERS)uiHeaderValue)->OptionalHeader.SizeOfHeaders; --> Код (Text): uiHeaderValue = uiLibraryAddress + ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew; --> Код (Text): // STEP 0: calculate our images current base address // we will start searching backwards from our callers return address. uiLibraryAddress = caller(); // loop through memory backwards searching for our images base address // we dont need SEH style search as we shouldnt generate any access violations with this while( TRUE ) { if( ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_magic == IMAGE_DOS_SIGNATURE ) { uiHeaderValue = ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew; // some x64 dll's can trigger a bogus signature (IMAGE_DOS_SIGNATURE == 'POP r10'), // we sanity check the e_lfanew with an upper threshold value of 1024 to avoid problems. if( uiHeaderValue >= sizeof(IMAGE_DOS_HEADER) && uiHeaderValue < 1024 ) { uiHeaderValue += uiLibraryAddress; // break if we have found a valid MZ/PE header if( ((PIMAGE_NT_HEADERS)uiHeaderValue)->Signature == IMAGE_NT_SIGNATURE ) break; } } uiLibraryAddress--; } - зачем искать начало своего же кода по сигнатуре хз, а затем есчо и вызывать dll.EP после загрузки для получения известной базы.. Короче это серия каких то не понятных извратов. Видимо автор этого кода сам не понимал что делает. В общем самая примитивная настройка образа в памяти, таких поделок навалом.
Тоже когда-то думал над этим, так и не разобрался, чем "обычная" загрузка дллки в память (без сброса на диск) отличается от рефлектив. Мб это одно и тоже, просто более модное название, как все эти "red team". Без DLL_QUERY_HMODULE все также норм грузится и выполняется.
Если кому-то вдруг интересно. Dll с подключенным Reflective кодом экспортирует декорированную ReflectiveLoader(x) процедуру, которую находит загрузчик метасплойта при копировании dll в память процесса. Без экспорта этой процедуры вызов inject_dll_into_process падает с ошибкой "Exploit failed: NoMethodError undefined method `entries' for nil:NilClass". Сама процедура ReflectiveLoader(x) вызывается уже при создании первого потока (process.thread.create) и выполняет необходимую настройку модуля в памяти, она же вызывает DllMain. Решение конечно неоднозначное, необходимость включать один и тот же код в каждую библиотеку вызывает сомнения, почему было не включить этот код для настройки в стандартную функциональность. Впрочем, msf чуть менее чем полностью состоит из сомнительных решений
вот, без этого: https://github.com/DarthTon/Blackbone (уже рекламировал), но у конфуция там от ++фанатизма код порой заоверинжинирен, и чтобы позаимствовать чтото - придётся много чего переписывать в си. *я кстати тоже хз что такое рефлективдлл
У мню кучка самописных сишников, которые можно компилить шестой студией безо всяких сдк, делает примерно все то же самое что по вашей ссылке анонсировано. Короче благодарю покорно.