Иньекция и ...

Тема в разделе "LANGS.C", создана пользователем _Demon_, 13 авг 2007.

  1. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    Доброго времени суток всем!
    У меня такая проблема:
    // Пишу в Borland C++ Builder 6.0
    Хочу внедрить свою DLL в чужой процесс. И хочу, чтобы код в DllEntryPoint выполнился. Вот код DLL:
    Код (Text):
    1. #include <vcl.h>
    2. #include <windows.h>
    3. #pragma hdrstop
    4.  
    5. // в дальнейшем я хочу показывать форму из DLL, но пока здесь только сообщение
    6.  
    7. #pragma argsused
    8. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    9. {
    10.         ShowMessage("Hello from DLL");
    11.         return 1;
    12. }
    Вот код внедрения:

    Код (Text):
    1.         DWORD dwProcessId = StrToInt(PIDEdit->Text);
    2.         HWND hProcess = OpenProcess(
    3.          PROCESS_QUERY_INFORMATION |   // Required by Alpha
    4.          PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
    5.          PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
    6.          PROCESS_VM_WRITE,             // For WriteProcessMemory
    7.          FALSE, dwProcessId);
    8.         if(hProcess == NULL)
    9.         {
    10.                 ShowMessage("ERROR: Process not opened");
    11.         };
    12.  
    13.         int iDllNameSize = 30;
    14.         LPVOID lpvRemouteDllStringAddr = VirtualAllocEx(
    15.                 hProcess,
    16.                 NULL,
    17.                 iDllNameSize,
    18.                 MEM_COMMIT,
    19.                 PAGE_READWRITE);
    20.         if(lpvRemouteDllStringAddr == NULL)
    21.         {
    22.                 ShowMessage("ERROR: lpvRemouteDllStringAddr is NULL");
    23.         };
    24.  
    25.         LPVOID lpBuffer = "G://PROJECTS//CPP//HelloFromDll//dllhello.dll";
    26.         bool boolWritedInProcess = WriteProcessMemory(
    27.                 hProcess,                       // handle to process whose memory is written to
    28.                 lpvRemouteDllStringAddr,        // address to start writing to
    29.                 lpBuffer,                       // pointer to buffer to write data to
    30.                 iDllNameSize,                   // number of bytes to write
    31.                 NULL                            // actual number of bytes written
    32.                 );
    33.         if(!boolWritedInProcess)
    34.         {
    35.                 ShowMessage("ERROR: DLL name not writed in Process memory");
    36.         };
    37.  
    38.         HMODULE hModuleHandle = GetModuleHandle(TEXT("Kernel32"));
    39.         if(hModuleHandle == NULL)
    40.         {
    41.                 ShowMessage("GetModuleHandle Kernel32 ERROR");
    42.         };
    43.  
    44.         PTHREAD_START_ROUTINE pThreadFunction = (PTHREAD_START_ROUTINE)
    45.         GetProcAddress(hModuleHandle, "LoadLibraryA");
    46.         if(pThreadFunction == NULL)
    47.         {
    48.                 ShowMessage("GetProcAddress LoadLibraryA ERROR");
    49.         };
    50.  
    51.         HANDLE hThread = CreateRemoteThread(
    52.                 hProcess,               // handle to process to create thread in
    53.                 NULL,                   // pointer to thread security attributes
    54.                 0,                      // initial thread stack size, in bytes
    55.                 pThreadFunction,        // pointer to thread function
    56.                 lpvRemouteDllStringAddr,// pointer to argument for new thread
    57.                 0,                      // creation flags
    58.                 NULL);                  // pointer to returned thread identifier
    59.         if(hThread == NULL)
    60.         {
    61.                 ShowMessage("CreateRemoteThread ERROR");
    62.         };
    Всё гладко. Ошибок не выдает. В диспетчере занимаемая процессом память увеличивается примерно на размер файла dll. Но как добиться выполнения кода в Dll ?

    Буду рад любой помощи, ссылкам и так далее.
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    _Demon_
    Код (Text):
    1. static DWORD dwTlsIndex; // address of shared memory
    2.  
    3. // DllMain() is the entry-point function for this DLL.
    4.  
    5. BOOL DllMain(HINSTANCE hinstDLL,  // DLL module handle
    6.     DWORD fdwReason,              // reason called
    7.     LPVOID lpvReserved)           // reserved
    8. {
    9.     LPVOID lpvData;
    10.     BOOL fIgnore;
    11.  
    12.     switch (fdwReason)
    13.     {
    14.         // The DLL is loading due to process
    15.         // initialization or a call to LoadLibrary.
    16.  
    17.         case DLL_PROCESS_ATTACH:
    18.  
    19.             // Allocate a TLS index.
    20.  
    21.             if ((dwTlsIndex = TlsAlloc()) == TLS_OUT_OF_INDEXES)
    22.                 return FALSE;
    23.  
    24.             // No break: Initialize the index for first thread.
    25.  
    26.         // The attached process creates a new thread.
    27.  
    28.         case DLL_THREAD_ATTACH:
    29.  
    30.             // Initialize the TLS index for this thread.
    31.  
    32.             lpvData = (LPVOID) LocalAlloc(LPTR, 256);
    33.             if (lpvData != NULL)
    34.                 fIgnore = TlsSetValue(dwTlsIndex, lpvData);
    35.  
    36.             break;
    37.  
    38.         // The thread of the attached process terminates.
    39.  
    40.         case DLL_THREAD_DETACH:
    41.  
    42.             // Release the allocated memory for this thread.
    43.  
    44.             lpvData = TlsGetValue(dwTlsIndex);
    45.             if (lpvData != NULL)
    46.                 LocalFree((HLOCAL) lpvData);
    47.  
    48.             break;
    49.  
    50.         // DLL unload due to process termination or FreeLibrary.
    51.  
    52.         case DLL_PROCESS_DETACH:
    53.  
    54.             // Release the allocated memory for this thread.
    55.  
    56.             lpvData = TlsGetValue(dwTlsIndex);
    57.             if (lpvData != NULL)
    58.                 LocalFree((HLOCAL) lpvData);
    59.  
    60.             // Release the TLS index.
    61.  
    62.             TlsFree(dwTlsIndex);
    63.             break;
    64.  
    65.         default:
    66.             break;
    67.     }
    68.  
    69.     return TRUE;
    70.     UNREFERENCED_PARAMETER(hinstDLL);
    71.     UNREFERENCED_PARAMETER(lpvReserved);
    72. }
    from SDK. Переделай только на создание потка, а не на инициализацию ТЛС.
     
  3. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    dead_body, спасибо.
     
  4. xh4ck

    xh4ck New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2005
    Сообщения:
    60
    Адрес:
    Russia
    может в удаленном процессе нет user32.dll? и месадж бокс тупо не запускается
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    xh4ck
    может. тогда буетисключение. Но никто не мешает эту юзер загрузить.
     
  6. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    Он там есть (смотрел в оле). Да я и к эксплореру атачил длл-ку. Он полюбому запускает юзер32.
    Надо как-то стартовать внедряемую библиотеку что ли. Передать ей управление. Или еще что-то.
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    так ты понял как это сделать или нет?
     
  8. xh4ck

    xh4ck New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2005
    Сообщения:
    60
    Адрес:
    Russia
    dead_body

    да раз библиотека грузится, то DllMain полюбому исполняется, не важно идет там проверка DWORD fdwReason или нет.

    только я не помню подружаются ли либы который нужны этой библиотеке... тут ведь не винАПИ-шная функция вызывается (тока щас заметил).

    _Demon_

    ты попробуй не ShowMessage, а нормальную апишную функцию вызывать MessageBoxA
    да и проверяй нормально, грузится она или нет, через бряк на создание нового потока
    (аттач к процессу в который внедряешься и галку на "break on new thread"
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    бугага, внедрять VCL-функционал в эксплорер, а после удивляться чего ж не работает :)
     
  10. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    Переделал DLL вот так:

    Код (Text):
    1. #include <windows.h>
    2. #pragma argsused
    3.  
    4. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    5. {
    6.         LPCSTR lpText = "Hello From DLL";
    7.         LPCSTR lpCaption = lpText;
    8.         UINT uType = 2;
    9.         HWND hHandle;
    10.         MessageBoxA(hHandle, lpText, lpCaption, uType);
    11.         return 1;
    12. }
    Только не знаю как получить хэндл dll. Попробовал через GetModuleHandle:
    Код (Text):
    1. HMODULE hHandle = GetModuleHandle(TEXT("dllhello"));
    dllhello - это имя без расширения самой длл, которая внедряется. Не получается.
     
  11. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    Я думал что она получает управление как дополнительный поток к приложению после её загрузки. Видимо это не так. Сейчас ищу информацию по этой теме..
     
  12. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    _Demon_
    CreateThread ?
     
  13. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    dead_body, ведь когда подключаешь библиотеку, то она как-то инициализируется вызывающим процессом. Уже при загрузке в память. Я в этом убедился когда нажимаю в проводнике на скомпилированной dll которую приводил выше. Когда нажимаю правой кнопкой на этой библиотеке то её код в DllEntryPoint тут же выполняется. То есть на экране появляется сообщение (значит с получением хендла нет проблемы). Когда я нажимаю на ОК, то уже потом контекстное меню проводника появляется. Я читал в книге Г. Хоглунда "Руткиты. Внедрение в ядро Windows", что можно свою dll внедрить в другой процесс посредством CreateRemoutThread. Но больше там ничего по этому поводу не сказано. Моя цель не сделать руткит, это вобще моя курсовая (сделать программу невидимую в диспетчере и выгружающую из памяти заданные приложения). Все сделано. Сейчас я добиваюсь скрытия процесса из диспетчера задач. Вернее dll-ки. Перехват и замена API-функции, которой пользуется диспетчер задач для получения списка, не катит. Нужно именно внедрением. Сейчас всё вроде сделано как нужно, но код в dll не выполняется. Вот я и думаю, что не учел какой-то мелочи. Может библиотеке не знает что она загружена. Или процесс в который она внедрена не знает о её существовании.. Может еще что-то. Подобные вещи должны быть известны людям, которые пишут программы с поддержкой плагинов. Но я к сожалению не нашел такой информации пока.
     
  14. xh4ck

    xh4ck New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2005
    Сообщения:
    60
    Адрес:
    Russia
    блин как многа букаф то -( я бы с радостью прочел если было поменьше ))
     
  15. lamer2k

    lamer2k New Member

    Публикаций:
    0
    Регистрация:
    14 май 2006
    Сообщения:
    88
    Ёбта...

    // dll
    Код (Text):
    1. #include <windows.h>
    2.  
    3.  
    4. #pragma comment(linker,"/ignore:4078")
    5. #pragma comment(linker,"/nodefaultlib")
    6. #pragma comment(linker,"/entry:DllMain")
    7. #pragma comment(linker,"/filealign:0x200")
    8. #pragma comment(linker,"/subsystem:windows")
    9. #pragma comment(linker,"/section:.text,rwx")
    10. #pragma comment(linker,"/merge:.rdata=.text")
    11.  
    12. DWORD WINAPI RunMessageBox(LPVOID lpVoid)
    13. {
    14.     for (DWORD i = 0; i < 10; i++)
    15.     {
    16.         MessageBox(NULL, "Hello from hell", "Information", MB_OK);
    17.     }
    18.     return 0;
    19. }
    20.  
    21. BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved)
    22. {
    23.     if (dwReason == DLL_PROCESS_ATTACH)
    24.     {
    25.         CreateThread(NULL, 0, RunMessageBox, NULL, NULL, &dwReason);
    26.      
    27.     }
    28.        
    29.     return TRUE;
    30. }
    // внедрение
    Код (Text):
    1. #include <windows.h>
    2. #include <Tlhelp32.h>
    3.  
    4. #pragma comment(linker,"/merge:.rdata=.text")
    5. #pragma comment(linker,"/filealign:0x200 /section:.text, rwx /ignore:4078")
    6. #pragma comment(linker,"/entry:entry")
    7. #pragma comment(linker,"/nodefaultlib")
    8. #pragma comment(linker,"/subsystem:windows")
    9.  
    10. #define szProcessName "you_process_name.exe"
    11. #define szDllName "C:\\path_to_you_dll.dll"
    12.  
    13.  
    14.  
    15. DWORD FindProcess()
    16. {
    17.     DWORD dwProcessId = 0xFFFFFFFF;
    18.  
    19.     PROCESSENTRY32 pe;
    20.     pe.dwSize = sizeof( PROCESSENTRY32 );
    21.  
    22.  
    23.    
    24.     HANDLE hSnapshot = CreateToolhelp32Snapshot(2, 0);
    25.  
    26.     if (hSnapshot != INVALID_HANDLE_VALUE)
    27.     {
    28.         if (Process32First(hSnapshot, &pe))
    29.         {
    30.             do
    31.             {
    32.  
    33.                 if (!lstrcmpi(pe.szExeFile, szProcessName))
    34.                 {
    35.                     dwProcessId = pe.th32ProcessID;
    36.                     break;                   
    37.                 }
    38.             }   while (Process32Next(hSnapshot, &pe));
    39.         }
    40.     }
    41.     return dwProcessId;
    42. }
    43.  
    44. void entry(void)
    45. {
    46.     DWORD dwProcessId = FindProcess();
    47.  
    48.     HANDLE hProcess;
    49.  
    50.     if ((hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcessId)) !=NULL)
    51.     {
    52.         LPVOID lpBase = VirtualAllocEx(hProcess, 0, 16, MEM_COMMIT+MEM_RESERVE, PAGE_READWRITE);
    53.  
    54.         if (lpBase !=NULL)
    55.         {
    56.             if (WriteProcessMemory(hProcess, lpBase, szDllName, 9, 0))
    57.             {
    58.                 CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE) &LoadLibrary, lpBase, 0, 0);
    59.                 CloseHandle(hProcess);
    60.             }
    61.         }
    62.  
    63.     }
    64.  
    65. }
     
  16. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    lamer2k, спасибо, буду разбираться.
     
  17. _Demon_

    _Demon_ Demon

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    8
    Адрес:
    earth
    lamer2k, твой код DLL работает c моим кодом внедрения. Но не могу понять почему твой код внедрения выдаёт ошибку. Да это уже и не важно. Всем спасибо за помощь.