Как выгрузить DLL из чужого процесса

Тема в разделе "WASM.WIN32", создана пользователем coocky, 21 авг 2007.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет.Смог внедрить dll с помощью библиотеки Detours. Но вот беда-выгрузить ее не получается.....
    Через CreateRemouteThread и FreeLibrary не получается.Только выгружаются те,кого загрузил в процесс с помощью
    CreateRemouteThread и LoadLibrary.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А что пишет?
     
  3. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    А ничего.Все ок!
    Код (Text):
    1. BOOL fOk = FALSE; // Assume that the function fails
    2.   HANDLE hthSnapshot = NULL;
    3.   HANDLE hProcess = NULL, hThread = NULL;
    4.  
    5.     // Grab a new snapshot of the process
    6.     hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
    7.     if (hthSnapshot == NULL)
    8.     {
    9.  
    10.       if (hthSnapshot != NULL)
    11.         CloseHandle(hthSnapshot);
    12.  
    13.       if (hThread     != NULL)
    14.         CloseHandle(hThread);
    15.  
    16.       if (hProcess    != NULL)
    17.         CloseHandle(hProcess);
    18.       return FALSE;
    19.     }
    20.  
    21.     // Get the HMODULE of the desired library
    22.     MODULEENTRY32W me = { sizeof(me) };
    23.     BOOL fFound = FALSE;
    24.     BOOL fMoreMods = Module32FirstW(hthSnapshot, &me);
    25.     for (; fMoreMods; fMoreMods = Module32NextW(hthSnapshot, &me)) {
    26.       fFound = (lstrcmpiW(me.szModule,  pszLibFile) == 0) ||
    27.         (lstrcmpiW(me.szExePath, pszLibFile) == 0);
    28.       if (fFound) break;
    29.     }
    30.     if (!fFound)
    31.     {
    32.  
    33.       if (hthSnapshot != NULL)
    34.         CloseHandle(hthSnapshot);
    35.  
    36.       if (hThread     != NULL)
    37.         CloseHandle(hThread);
    38.  
    39.       if (hProcess    != NULL)
    40.         CloseHandle(hProcess);
    41.       return FALSE;
    42.     }
    43.  
    44.     // Get a handle for the target process.
    45.  
    46.     hProcess = OpenProcess(
    47.       PROCESS_QUERY_INFORMATION |   // Required by Alpha
    48.       PROCESS_CREATE_THREAD     |
    49.       PROCESS_VM_OPERATION,  // For CreateRemoteThread
    50.       FALSE, dwProcessId);
    51.     if (hProcess == NULL)
    52.     {
    53.  
    54.       if (hthSnapshot != NULL)
    55.         CloseHandle(hthSnapshot);
    56.  
    57.       if (hThread     != NULL)
    58.         CloseHandle(hThread);
    59.  
    60.       if (hProcess    != NULL)
    61.         CloseHandle(hProcess);
    62.       return FALSE;
    63.     }
    64.  
    65.     // Get the real address of LoadLibraryW in Kernel32.dll
    66.     PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
    67.       GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");
    68.     if (pfnThreadRtn == NULL)
    69.     {
    70.  
    71.       if (hthSnapshot != NULL)
    72.         CloseHandle(hthSnapshot);
    73.  
    74.       if (hThread     != NULL)
    75.         CloseHandle(hThread);
    76.  
    77.       if (hProcess    != NULL)
    78.         CloseHandle(hProcess);
    79.       return FALSE;
    80.     }
    81.  
    82.     // Create a remote thread that calls LoadLibraryW(DLLPathname)
    83.     hThread = CreateRemoteThread(hProcess, NULL, 0,
    84.       pfnThreadRtn, me.modBaseAddr, 0, NULL);
    85.     if (hThread == NULL)
    86.      
    87.     {
    88.  
    89.       if (hthSnapshot != NULL)
    90.         CloseHandle(hthSnapshot);
    91.  
    92.       if (hThread     != NULL)
    93.         CloseHandle(hThread);
    94.  
    95.       if (hProcess    != NULL)
    96.         CloseHandle(hProcess);
    97.       return FALSE;
    98.     }
    99.  
    100.     // Wait for the remote thread to terminate
    101.  DWORD ww= WaitForSingleObject(hThread, INFINITE);
    102.  
    103.     fOk = TRUE; // Everything executed successfully
    104. //////////////////////////////////////////////////////////////
    105.    
    106.  
    107.     /////////////////////////////////
    108.  
    109.     if (hthSnapshot != NULL)
    110.       CloseHandle(hthSnapshot);
    111.  
    112.     if (hThread     != NULL)
    113.       CloseHandle(hThread);
    114.  
    115.     if (hProcess    != NULL)
    116.       CloseHandle(hProcess);
    117.  
    118.  
    119.   return fOk;
    Ни одного исключения.Все отлично... Блин,уже запарился..
     
  4. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Но либо сидит..Я вижу..
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Раз либа сидит, значит что-то не верно.
    Ты перечисляешь либы с помощью тулхелп - если нужная либа подгружалась не с помощью обычной LoadLibrary, а с помощью какого либо изврата, то перечисляться она, скорее всего, не будет.
     
  6. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Нет..Либа перечисляется.. Т.е. в списке модулей она есть. А догружалась она с помощью библиотеки и мелкософтовский DetourCreateProcessWithDll
     
  7. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Посмотрел исходники DetourCreateProcessWithDll.Пишет стандартно,через WriteProccessMemory
    Интересно,если таким образом внедрит длл,то можно будет ее выгрузить через CreateRemoteThread?
     
  8. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    А так?
    Код (Text):
    1. while(FreeLibrary(hDll));;;
     
  9. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Хм...Как же я в своем процессе получу левый HMODULE ? :)
     
  10. DMD

    DMD Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2005
    Сообщения:
    56
    это не сложно.. если не прерывать контроль над этим процессом.
     
  11. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Имелось в виду:
    Код (Text):
    1. while (1) {
    2.  
    3.     CreateRemoteThread();
    4.  
    5.     WaitXXXX
    6.  
    7.     if (status == SUCCESS)
    8.        continue;
    9.     else
    10.        break;
    11.  
    12. }
    FreeLibrary(lib) нужно делать столько же, сколько было LoadLibrary(lib).
    Возможно её кто-то ещё подгружал, потому с первого раза она и не выгружается.
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    кстати да.. счетчик ссылок надо учитывать..
     
  13. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Погляди это. Там жёстко зашиты адреса апишек (XP SP2, энтузиасты пишут динамику (а мне было лень), мне статики хватает, тулза только для ознакомления и усовершенствования).
     
  14. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    asmfan
    Спасибо,но в асме я полный ноль.. Но увидел,что выгружаешь ты через CreateRemoteThread.
    Я тоже так выгружаю. Только проблема в том,что выгружаюсь из тех приложений, в которые загрузился через
    CreateRemoteThread.А если через WriteProccessMemory-тогда полный голяк.Хотя все отрабатывает по функциям..
    Пробывал на глаз цикл из 20 шагов.Бестолку..... while сделать не могу,т.к. все функции возвращают ОК,и тогда петля...
     
  15. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Ага..Стоп..А у тебя есть в коде WriteProcessMemory.. Или это ты загружаешь..?
    Вообще тяжело..Я на С++ пишу..
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    короче стоит сделать примерно так

    Код (Text):
    1. struct ThreadArgs {
    2.     BOOL (WINAPI *FreeLibrary)(HMODULE);
    3.     HMODULE BaseAddress;
    4. };
    5.  
    6. DWORD CALLBACK UnloadLibraryThread( LPVOID Args )
    7. {
    8.     while( ((ThreadArgs*)Args)->FreeLibrary(((ThreadArgs*)Args)->BaseAddress) );
    9.  
    10.     return 0;
    11. }
    12. void EndThread(){}
    13.  
    14.  
    15. void yourcode()
    16. {
    17.   ... open process etc. ...
    18.  
    19.   void* Thread = VirtualAllocEx( hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
    20.   WriteProcessMemory( hProcess, Thread, UnloadLibraryThread, (ULONG)EndThread-(ULONG)UnloadLibraryThread, 0 );
    21.  
    22.   ThreadArgs Args;
    23.  
    24.   *(FARPROC*)&Args.FreeLibrary = GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "FreeLibrary");
    25.   Args.BaseAddress = me.modBaseAddr;
    26.  
    27.   DWORD id;
    28.   hThread = CreateRemoteThread( hProcess, 0, 0, Thread, Args, 0, &id );
    29.  
    30.   .. wait for thread ...
    31. }
     
  17. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Great
    Единственное отличие от Рихтера (я приводил выше его код), так то, что при ВЫГРУЗКЕ ты делаешь опять же WriteProcessMemory,а функция UnloadLibraryThread-у тебя CALLBACK и в ней цикл..
    Ну что ж,ок..Сейчас попробую..
     
  18. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Great
    при выполнении этого кода все приложения выпали в AccessViolation :)
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я не проверял)) попробуй отладить
     
  20. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Да я даже немного подредактировал..Этот код не выгружает вообще ничего.. :dntknw: