Не выгружается dll из целевого процесса

Тема в разделе "WASM.BEGINNERS", создана пользователем maverick, 14 апр 2009.

  1. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    День добрый!
    Целевой процесс и dll произвольные, я пробовал для explorer.exe и correct.dll Библиотеку пытаюсь выгрузить путем создания удаленного потока, в который передаю адрес FreeLibrary и хэндл дллки в качестве параметра. При работе программы ошибок не возникает, но dll из процесса не выгружется... Не понимаю, что не так. Пробовал для других dll, результат тот же.

    Код (Text):
    1. format PE GUI 4.0
    2.  
    3. include 'win32a.inc'
    4.  
    5. MAX_PATH equ 260
    6. MAX_MODULE_NAME32 equ 256
    7. TH32CS_SNAPMODULE equ 8
    8.  
    9. struct  TProcessEntry32
    10.       dwSize              dd 0
    11.       cntUsage            dd 0
    12.       th32ProcessID       dd 0
    13.       th32DefaultHeapID   dd 0
    14.       th32ModuleID        dd 0
    15.       cntThreads          dd 0
    16.       th32ParentProcessID dd 0
    17.       pcPriClassBase      dd 0
    18.       dwFlags             dd 0
    19.       szExeFile           TCHAR MAX_PATH dup (0)
    20. ends
    21.  
    22. struct  TModuleEntry32
    23.      dwSize dd ?
    24.      th32ModuleID  dd ?
    25.      th32ProcessID dd ?
    26.      GlblcntUsage  dd ?
    27.      ProccntUsage  dd ?
    28.      modBaseAddr   dd ?
    29.      modBaseSize   dd ?
    30.      hModule       dd ?
    31.      szModule      TCHAR MAX_MODULE_NAME32 dup (0)
    32.      szExePath     TCHAR MAX_PATH dup (0)
    33. ends
    34.  
    35. entry start
    36.  
    37. start:
    38.       ; получаем хэндл kernel32.dll
    39.       invoke GetModuleHandle, libName
    40.              test eax, eax
    41.              jz go_out
    42.  
    43.       mov [hLibKernel32], eax
    44.  
    45.       ; получаю адрес FreeLibrary
    46.       invoke GetProcAddress, [hLibKernel32], procName
    47.              test eax, eax
    48.              jz go_out
    49.  
    50.       mov [procAddr], eax
    51.  
    52.       ;================== Ищем процесс ========================
    53.  
    54.       invoke CreateToolhelp32Snapshot, 2, 0
    55.       mov [fSnapshotHandle], eax
    56.  
    57.       mov [fProcessEntry32.dwSize], sizeof.TProcessEntry32
    58.  
    59.       invoke Process32First, [fSnapshotHandle],fProcessEntry32
    60.             test eax, eax
    61.             jz go_out
    62.  
    63.       searching:
    64.            invoke lstrcmpi, ProcessName, fProcessEntry32.szExeFile
    65.                test eax, eax
    66.                jz pid_found
    67.  
    68.            invoke Process32Next,[fSnapshotHandle], fProcessEntry32
    69.                test eax, eax
    70.                jz go_out
    71.       jmp searching
    72.  
    73.       ; если нашли
    74.       pid_found:
    75.                  push [fProcessEntry32.th32ProcessID]
    76.                  pop [PID]
    77.  
    78.       invoke CloseHandle, [fSnapshotHandle]
    79.                test eax, eax
    80.                jz go_out
    81.  
    82.       ;===================== Ищем dll ========================
    83.  
    84.       invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, [PID]
    85.       mov [fSnapshotHandle], eax
    86.  
    87.       mov [fModuleEntry32.dwSize], sizeof.TModuleEntry32
    88.  
    89.       invoke Module32First, [fSnapshotHandle],fModuleEntry32
    90.             test eax, eax
    91.             jz go_out
    92.  
    93.       searching_dll:
    94.            invoke lstrcmpi, ModuleName, fModuleEntry32.szModule
    95.                       test eax, eax
    96.                       jz dll_found
    97.  
    98.            invoke Module32Next,[fSnapshotHandle], fModuleEntry32
    99.                       test eax, eax
    100.                       jz go_out
    101.       jmp searching_dll
    102.  
    103.       ; если нашли
    104.       dll_found:
    105.                  ; сохраняем хэндл
    106.                  push [fModuleEntry32.hModule]
    107.                  pop [hModule]
    108.  
    109.       invoke CloseHandle, [fSnapshotHandle]
    110.                  test eax, eax
    111.                  jz go_out
    112.  
    113.        ;===== Выгружаем dll из целевого процесса =====
    114.  
    115.       invoke OpenProcess, PROCESS_ALL_ACCESS, 0, [PID]
    116.              test eax, eax
    117.              jz go_out
    118.  
    119.       mov [hProcess], eax
    120.  
    121.       invoke CreateRemoteThread, [hProcess]   ,\
    122.                                   NULL        ,\
    123.                                   NULL        ,\
    124.                                   [procAddr]  ,\
    125.                                   hModule     ,\
    126.                                   NULL        ,\
    127.                                   lpThreadId
    128.  
    129.       test eax, eax
    130.       jz go_out
    131.  
    132.  
    133.       _ok:
    134.           invoke MessageBox, NULL,lpTextOk, lpCaption, MB_OK
    135.           jmp exit_
    136.  
    137.       go_out:
    138.           invoke MessageBox, NULL,lpTextNo, lpCaption, MB_OK
    139.  
    140.       exit_:
    141.               invoke ExitProcess, eax
    142.  
    143.  
    144. section '.data' data readable writeable
    145.         hLibKernel32     dd ?
    146.         procAddr         dd ?
    147.         procName         db 'FreeLibrary',0
    148.         libName          db 'kernel32.dll',0
    149.         PID              dd ?
    150.         ProcessName      db 'explorer.exe',0
    151.         fSnapshotHandle  dd ?
    152.         fProcessEntry32  TProcessEntry32
    153.         fModuleEntry32   TModuleEntry32
    154.         lpThreadId       dd ?
    155.         lpTextOk         db 'OK!!!',0
    156.         lpTextNo         db 'Не получилось чё-то...',0
    157.         lpCaption        db 'Результат', 0
    158.         hProcess         dd ?
    159.         ModuleName       db 'correct.dll',0
    160.         hModule          dd ?
    161.  
    162. section '.idata' import data readable
    163.    library kernel32, 'kernel32.dll',\
    164.            user32,   'USER32.DLL'
    165.  
    166.    import  kernel32, GetModuleHandle,          'GetModuleHandleA'         ,\
    167.                      GetProcAddress,           'GetProcAddress'           ,\
    168.                      OpenProcess,              'OpenProcess'              ,\
    169.                      CreateRemoteThread,       'CreateRemoteThread'       ,\
    170.                      ExitProcess,              'ExitProcess'              ,\
    171.                      CreateToolhelp32Snapshot, 'CreateToolhelp32Snapshot' ,\
    172.                      Process32First,           'Process32First'           ,\
    173.                      Process32Next,            'Process32Next'            ,\
    174.                      lstrcmpi,                 'lstrcmpiA'                ,\
    175.                      CloseHandle,              'CloseHandle'              ,\
    176.                      Module32First,            'Module32First'            ,\
    177.                      Module32Next,             'Module32Next'
    178.  
    179.      import  user32, MessageBox, 'MessageBoxA'
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Возможно для данной длл reference count больше единички, поэтому длл не выгружается.
     
  3. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    не...вроде не то
    делал и по другому, запоминал ProccntUsage и вызывал CreateRemoteThread в цикле n-е кол-во раз. Всё равно не пашет.
    Код (Text):
    1.    
    2.   ....
    3.   ; если нашли
    4.       dll_found:
    5.               ...
    6.                  push [fModuleEntry32.ProccntUsage]
    7.                  pop [cnt]
    8.               ...
    9.        ;===== Выгружаем dll из целевого процесса =====
    10.       ...
    11.      cycle:
    12.  
    13.       invoke CreateRemoteThread, [hProcess]   ,\
    14.                                   NULL        ,\
    15.                                   NULL        ,\
    16.                                   [procAddr]  ,\
    17.                                   hModule     ,\
    18.                                   NULL        ,\
    19.                                   lpThreadId
    20.  
    21.       test eax, eax
    22.       jz go_out
    23.  
    24.       dec [cnt]
    25.  
    26.       jnz cycle            
    27.       ...
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Хорошо бы знать, что возвращает freelibrary. А код вроде правильный. Попробуй не на explorere, а на другой проге какой-нибудь.
     
  5. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    если это статическая длл то она врядли будет выгружена, а DllMain вернет тебе Ок. Если тебе нада всё таки убрать эту длл из процесса, то вызови один раз DllMain, после почитсти референс в Peb и после сделай вызов NtUnmapViewOfSection с базой длл в параметре. Длл будет выгружена, независимо от того хочет она этого или нет.
     
  6. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    k3internal
    последствия?
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    deLight
    Если длл ни кто юзать не собираеться, то ни каких )), ну вообще конечно не стоит забывать что это не совсем документированный способ и все такое.
     
  8. maverick

    maverick New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2008
    Сообщения:
    148
    ок, буду знать. Спасибо!
     
  9. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    maverick
    Ты получаешь HANDLE в программе и передаешь его в удаленный поток? Тогда понятно почему не работает. Хэндлы объектов ядра специфичны для каждого процесса в отдельности - в другом процессе твой хэндл будет "пустой". Поэтому открой DLL в самом удаленном потоке и используй полученный HANDLE.
     
  10. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    какой хэндл, речь идёт о базе загрузки.
     
  11. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    AndreyMust19
    жжошь аццке. Этот хэндл есть база рисунка.
     
  12. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    База загрузки DLL тоже специфична для процесса. Поэтому узнавать ее надо именно из самого процесса, в к-м создаем удаленный поток, а не в том процессе, который этот удаленный поток создает.
     
  13. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    AndreyMust19
    а что нам мешает узнать базу нужной длл из другого процесса? :) внимательнее первый пост смотрите.

    з.ы. попробуй приатачиться к эксплореру OllyDbg и поставить бряк допустим на FreeLibrary
     
  14. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Не знал
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AndreyMust19
    А удалённые потоки зачем ?
    Наверно что лдр прочитать в текущем процессе, как это делает RtlQueryProcessDebugInformation(), ну или ваши апи работы со слепками. Это излишне, более того это палево - создание удалённого потока. Например psapi просто читают память чужого процесса. В общем это кривые способы, нужно перечислять все блоки памяти и получать имя файла, которому проекция относится.