Metasploit ReflectiveDll - зачем вообще нужен весь reflective код?

Тема в разделе "WASM.RESEARCH", создана пользователем ormoulu, 22 фев 2020.

  1. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Мануалы описывают создание ReflectiveDll как "а теперь выкидываете свою DllMain и добавляете вот эти хидер и код".
    Зачем они вообще нужны, если весь код, который должен отработать, вызывается из DllMain/DLL_PROCESS_ATTACH?
    Какая магия содержится в
    Код (C++):
    1.         case DLL_QUERY_HMODULE:
    2.             if( lpReserved != NULL )
    3.                 *(HMODULE *)lpReserved = hAppInstance;
    4.             break;
    5.         case DLL_PROCESS_ATTACH:
    6.             hAppInstance = hinstDLL;
    7.             break;
    ?

    Кто-нибудь в вопросе разбирался?
     
  2. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    ormoulu,

    https://github.com/stephenfewer/ReflectiveDLLInjection/blob/master/dll/src/ReflectiveLoader.c

    Код (Text):
    1. if( !pDllMain( NULL, DLL_QUERY_HMODULE, &hResult ) )
    -->
    Код (Text):
    1. ((DLLMAIN)uiValueA)( (HINSTANCE)uiBaseAddress, DLL_PROCESS_ATTACH, lpParameter );
    -->
    Код (Text):
    1. uiBaseAddress = (ULONG_PTR)((PLDR_DATA_TABLE_ENTRY)uiValueA)->DllBase;
    -->
    Код (Text):
    1. uiValueA = ((PIMAGE_NT_HEADERS)uiHeaderValue)->OptionalHeader.SizeOfHeaders;
    -->
    Код (Text):
    1. uiHeaderValue = uiLibraryAddress + ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew;
    -->
    Код (Text):
    1. // STEP 0: calculate our images current base address
    2.  
    3.     // we will start searching backwards from our callers return address.
    4.     uiLibraryAddress = caller();
    5.  
    6.     // loop through memory backwards searching for our images base address
    7.     // we dont need SEH style search as we shouldnt generate any access violations with this
    8.     while( TRUE )
    9.     {
    10.         if( ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_magic == IMAGE_DOS_SIGNATURE )
    11.         {
    12.             uiHeaderValue = ((PIMAGE_DOS_HEADER)uiLibraryAddress)->e_lfanew;
    13.             // some x64 dll's can trigger a bogus signature (IMAGE_DOS_SIGNATURE == 'POP r10'),
    14.             // we sanity check the e_lfanew with an upper threshold value of 1024 to avoid problems.
    15.             if( uiHeaderValue >= sizeof(IMAGE_DOS_HEADER) && uiHeaderValue < 1024 )
    16.             {
    17.                 uiHeaderValue += uiLibraryAddress;
    18.                 // break if we have found a valid MZ/PE header
    19.                 if( ((PIMAGE_NT_HEADERS)uiHeaderValue)->Signature == IMAGE_NT_SIGNATURE )
    20.                     break;
    21.             }
    22.         }
    23.         uiLibraryAddress--;
    24.     }
    - зачем искать начало своего же кода по сигнатуре хз, а затем есчо и вызывать dll.EP после загрузки для получения известной базы.. Короче это серия каких то не понятных извратов. Видимо автор этого кода сам не понимал что делает. В общем самая примитивная настройка образа в памяти, таких поделок навалом.
     
  3. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Тоже когда-то думал над этим, так и не разобрался, чем "обычная" загрузка дллки в память (без сброса на диск) отличается от рефлектив. Мб это одно и тоже, просто более модное название, как все эти "red team".
    Без DLL_QUERY_HMODULE все также норм грузится и выполняется.
     
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Если кому-то вдруг интересно.
    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 чуть менее чем полностью состоит из сомнительных решений :resent:
     
    UbIvItS нравится это.
  5. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    вот, без этого:
    https://github.com/DarthTon/Blackbone (уже рекламировал), но у конфуция там от ++фанатизма код порой заоверинжинирен, и чтобы позаимствовать чтото - придётся много чего переписывать в си.

    *я кстати тоже хз что такое рефлективдлл
     
  6. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    У мню кучка самописных сишников, которые можно компилить шестой студией безо всяких сдк, делает примерно все то же самое что по вашей ссылке анонсировано. Короче благодарю покорно.