внедрение в iexplore.exe на Vista/7

Тема в разделе "WASM.WIN32", создана пользователем sumson, 30 июн 2011.

  1. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    если установлена настройка для IE запускаться в нескольких процессах, то после запуска IE со стартовой страничкой стартует GUI процесс IE(c IEUI.dll) и далее он создаёт процесс для стартовой странички и т д.
    у меня задача предотвратить выгрузку данных из IE(печать,просмотр печати,просмотр кода страницы,сохранение в файл содержимого страницы). я внедряюсь в каждый процесс где обрабатывается страничка. собственно обработка страницы происходит в процессе запускаемом для каждой новой вкладки, там я и делаю нужную работу, перехватываю команды на печать, сохранение и т д, запрещаю их и всё хорошо. скажу что всё работает в ХП, а вот на WIN 7 есть проблемы с этим самым процессом iexplore, создаваемом для каждой вкладки, незнаю может он сделан как protected process in vista, но мою длл я в него закидываю через CreateRemoteThread без ошибок, проблема в том что после загрузки моей dll в адресное пространство iexplore, не происходит вызова DllMain моей dll, ну и соответвенно dll висит в процессе c счётчиком 1 и молчит). ладно, может я неправ в чём, взял для эксперимента вот эту тулзу http://www.securityxploded.com/remotedll.php, сделал простейшую dll без никто, даже отвязался от рантайма для чистоты эксперимента, в DllMain моей dll просто вывожу строку в outputdebugview. В результате таже самая картина что и у меня...dll грузится но DllMain не вызывается, причём GUI процесс iexplore всё работает и DllMain вызывается как обычно. Видится мне что это какой то заговор от мелкомягких). Ну и вопрос в том что с этим делать, внедряться то надо. Точнее хотелось бы обойти эту проблему ибо не сильно охота менять щас механизм внедрения, надо этот оставить как есть, только заставить выполняться DllMain. Причём у меня тута не поделка какая а коммерч продукт и интересно более менее документированный путь, без сильных извратов.
    Ещё мне подумалось, что раз мелкомягкие такую поставили бяку, значит могли и ещё както защитить этот процесс от API Hooking или ещё каких техник перехвата функциональности, что кто думает по сабж?
     
  2. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    обсуждалось и не раз, гуглите =)
     
  3. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    а вы думаете чем я уже 2 дня занимаюсь?
    да, этот форум прошерстил, гугл тоже насколько смог.
    ну конкретно этой проблемы не видел.
    видел проблемы с CreateRemoteThread, но чтобы не вызывалось DllMain, но библиотека корректно грузилилась в процесс - нема такой инфы.
    создание удалённого потока - без ошибок
    загрузка dll в процесс, смотрю в оповещении в ядре - без ошибок
    а вызов DllMain - ни фига не происходит
    эксепшены тоже не кидаются, просто молчание и всё.
    неужто никто не фиксил ИМЕННО такое поведение?

    киньте что ли ссылкой, если уже где то было и я пропустил...
     
  4. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    а битность модулей одинаковая у вас? семерка х86 или х64?
     
  5. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    да, всё действие происходит на x86, причём всё работает с первый GUI процессом iexplore, а вот со вторым такая вот проблема...и причём на ХП работает ведь.

    проверить можно очень просто, берём тулзу http://www.securityxploded.com/remotedll.php
    делаем длл типа
    Код (Text):
    1. extern "C" __declspec(dllexport) BOOL WINAPI DllMain( HMODULE hModule,
    2.                        DWORD  ul_reason_for_call,
    3.                        LPVOID lpReserved
    4.                      )
    5. {
    6.     wchar_t str[MAX_PATH];
    7.     wsprintf(str,L"DllMain[%d] ul_reason_for_call %d\n",GetCurrentProcessId(),ul_reason_for_call);
    8.     OutputDebugString(str);
    9.     return TRUE;
    10. }
    и пробуем грузить эту длл в процессы iexplore

    смотреть логи в DebugView
     
  6. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    sumson
    Аргументы(флажки) для LdrLoadDll() в студию.
     
  7. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    вот рабочий код который занимается непосредственно внедрением в процесс известным способом от Рихтера.
    отрабатывает без ошибок, но DllMain подгруженной dll не вызывается на Windows 7, если внедряемся в iexplore.exe соответвующего вкладке IE.

    Код (Text):
    1. int load_dll(const DWORD dwProcessId, const std::wstring& dllPath)
    2. {
    3.     int result = -1; // Assume that the function fails
    4.     HANDLE hProcess = NULL, hThread = NULL;
    5.     PWSTR pszLibFileRemote = NULL;
    6.    
    7.     do
    8.     {
    9.         // Get a handle for the target process.
    10.         hProcess = OpenProcess(
    11.             PROCESS_QUERY_INFORMATION |   // Required by Alpha
    12.             PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
    13.             PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
    14.             PROCESS_VM_WRITE          |   // For WriteProcessMemory
    15.             PROCESS_VM_READ,            
    16.             FALSE, dwProcessId);
    17.         if (hProcess == NULL)
    18.         {
    19.             result = GetLastError();
    20. #ifdef _LOG_OUTPUT
    21.             TCHAR str[MAX_PATH];
    22.             swprintf_s(str,MAX_PATH,L"load_dll OpenProcess id %d error:%d\n",dwProcessId,result);
    23.             OutputDebugString(str);
    24. #endif
    25.             break;
    26.         }
    27.  
    28.         // Calculate the number of bytes needed for the DLL's pathname
    29.         int cch = 1 + (int)dllPath.size();
    30.         int cb  = cch * sizeof(std::wstring::value_type);
    31.  
    32.         // Allocate space in the remote process for the pathname
    33.         pszLibFileRemote = (PWSTR)
    34.             VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
    35.         if (pszLibFileRemote == NULL)
    36.         {
    37.             result = GetLastError();
    38. #ifdef _LOG_OUTPUT
    39.             TCHAR str[MAX_PATH];
    40.             swprintf_s(str,MAX_PATH,L"load_dll VirtualAllocEx cb %d error:%d\n",cb,result);
    41.             OutputDebugString(str);
    42. #endif
    43.             break;
    44.         }
    45.  
    46.         // Copy the DLL's pathname to the remote process's address space
    47.         if (!WriteProcessMemory(hProcess, pszLibFileRemote,
    48.             (PVOID) dllPath.c_str(), cb, NULL))
    49.         {
    50.             result = GetLastError();
    51. #ifdef _LOG_OUTPUT
    52.             TCHAR str[MAX_PATH];
    53.             swprintf_s(str,MAX_PATH,L"load_dll WriteProcessMemory dllPath %s cb %d error:%d\n",dllPath.c_str(),cb,result);
    54.             OutputDebugString(str);
    55. #endif
    56.             break;
    57.         }
    58.  
    59.         // Get the real address of LoadLibraryW in Kernel32.dll
    60.         PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
    61.             GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryW");
    62.         if (pfnThreadRtn == NULL)
    63.         {
    64.             result = GetLastError();
    65.             break;
    66.         }
    67.  
    68.         // initialize security attributes
    69.         SECURITY_DESCRIPTOR sd = {0};
    70.         SECURITY_ATTRIBUTES sa = {0};
    71.        
    72.         if(!InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION))
    73.         {
    74.             result = GetLastError();
    75.             break;
    76.         }
    77.  
    78.         if(!SetSecurityDescriptorDacl(&sd, true, NULL, false))
    79.         {
    80.             result = GetLastError();
    81.             break;
    82.         }
    83.  
    84.         sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    85.         sa.bInheritHandle = true;
    86.         sa.lpSecurityDescriptor = &sd;
    87.        
    88.         // Create a remote thread that calls LoadLibraryW(DLLPathname)
    89.         hThread = CreateRemoteThread(hProcess, &sa, 0,
    90.             pfnThreadRtn, pszLibFileRemote, 0, NULL);
    91.         if (hThread == NULL)
    92.         {
    93.             result = GetLastError();
    94. #ifdef _LOG_OUTPUT
    95.             TCHAR str[MAX_PATH];
    96.             swprintf_s(str,MAX_PATH,L"load_dll CreateRemoteThread error:%d\n",result);
    97.             OutputDebugString(str);
    98. #endif
    99.             break;
    100.         }
    101.        
    102.         // Wait for the remote thread to terminate
    103.         DWORD ret = WaitForSingleObject(hThread, INFINITE);
    104.         if(ret != WAIT_OBJECT_0)
    105.         {
    106.             result = ret;
    107.             break;
    108.         }
    109.  
    110.         result = ERROR_SUCCESS; // Everything executed successfully
    111.  
    112.     } while (false);
    113.  
    114.     // Free the remote memory that contained the DLL's pathname
    115.     if (pszLibFileRemote != NULL)
    116.         VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);
    117.  
    118.     if (hThread  != NULL)
    119.         CloseHandle(hThread);
    120.  
    121.     if (hProcess != NULL)
    122.         CloseHandle(hProcess);
    123.  
    124.     return result;
    125. }
     
  8. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    нашёл похожую проблему с внедрением в IE на Windows 7
    http://wasm.ru/forum/viewtopic.php?id=39948

    похоже дело в Internet Explorer protected mode, отключил его в браузере, проверил - да, при выключенном всё прекрасно внедряется.

    соответвенно вопрос по преодолению Internet Explorer protected mode, может кто решал подобные вопросы?
     
  9. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    попробуй потокам кинуть APC для загрузки твоей длл.
    Смотри: QueueUserAPC, ZwQueueApcThread
     
  10. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    как вариант надо будет попробовать, но
    боюсь что результат будет отрицательный в силу того что в данном случае таки проблема в protected mode в IE на Windows 7, вкратце суть в том что из за того что IE запускает нужный мне процесс с integrity level меньше чем мой(iexplore.exe - low integrity level, мой процесс делающий инжект - medium(если юзер) или high(если админ)) низя преодолеть границы процессов. Сделано для того чтобы BHO работающие в данном iexplore процессе получили ограничение по работе с файловой системой и причими ресурсами компа. По ходу некая песочница.
    Ну и пока что я накопал что для решения вопроса может подойти понижение integrity level у процесса внедряющего модуль в iexplore до integrity level у iexplore, что при включённом protected mode будет low.
    Соответвенно алгоритм внедрения может быть такой:
    - открываем процесс IE
    - определяем integrity level процесса IE и сравниваем со своим.
    - если надо делаем integrity level у нас аналогичным процессу IE.
    - внедряемся

    ну и тут есть 2 вопроса:
    - кажется всё подозрительно простым
    - попав в процесс IE сможем ли сделать подмену API вызовов или ещё что нить касаемо данного процесса или low integrity делает любые действия запрещёнными?
     
  11. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Варианты:
    1. Хук в explorer.exe на создание процессов, изнего инжектится в ИЕ ?
    2. Закрыть ИЕ, после занового создать внедрив в него свой код?
    3. Если можешь писать в память ИЕ то перезапиши указатель по адрессу FS:[C0](для вин 7 и возможно Vista) или 7FFE0300 для ХР на свой код. Постарайся их как можно быстрее вернуть обратно, чтоб ИЕ не упал.
     
  12. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
  13. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8
    знать бы где и как задаётся protected mode для создаваемого процесса в IE...
    можно попробовать так:
    - внедряемся в gui процесс IE и перехватываем ф-цию создания процессов, допустим это CreateProcessW(в импорте iexplore.exe видно что эта ф-ция используется).
    - при вызове данной функции смотрим что можно сделать, может поменять integrity level или ешё чего, чтобы процесс создался не в protected mode.

    предлагаю набрать вариантов и потом решить что лучше)
     
  14. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    sumson
    У Verizon есть такая статейка "Escaping from Microsoft's Protected Mode Internet Explorer", гуглится легко.
    Не уверен, что это именно то, что тебе нужно, но там есть пару любопытных вещей, авось поможет.
     
  15. sumson

    sumson New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2011
    Сообщения:
    8