MSoft >> дык ты ж адрес ExitProcess ищешь в своем адресном пространстве! тебе нужен адрес это апишки в искомом >> процессе! Если так действовать, то тебе надо будет читать и обрабатывать таблицу импорта и в ней искать эту >> функцию. Так таскменеджер явно не делает ExitProcess лежит в kernel32.dll а значит что адрес этой функи в твоем процессе будет равен адресу в любом другом процессе. Знать как получить адрес апи хэшем и не знать таких основ... как то странно.
PE_Kill да-да-да... полностью согласен если бы было так как говорил MSoft, то код из #9 не убивал бы процесс, а он это таки делает.
все это странно, и убитый тобой процесс не имеет к этому никакого отношения. Во-первых, о какой длл идет речь? не из system32 во-вторых, тот же process explorer может искать по имени загружнные dllки в других процессах. стоит проверить, не загружена ли она куда-нибудь еще..
Nouzui 1) библиотека не системная, но лежит именно там. а какую роль это может играть? 2) см сообщение #3 собственно, теперь вопрос состоит в том, как осовбодить HANDLы этой библиотеки в чужом процессе перед его удалением.
Ты про базу образа файла слышал что-нибудь??? А про то, что дллки могут грузиться по любому адресу, независимо от того, какая база образа у них прописана в pe-заголовке???
посмотрел.. мистика виндовый таскмгр перед терминейтом посылает WM_CLOSE главному окну и вообще, скажи, что за библиотека (если ее никто больше не использует, то зачем она в system32?), и что за программа а также попробуй все таки поискать ее procexplorer'ом
да уж, твин пикс... окон в убиваемом процессе нет. там такой код Код (Text): StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 cmp eax, 0 je ExitLoop invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp StartLoop ExitLoop: ; а таск менеджер видимо, умудряется выйти из этого цикла, ; в отличие от TerminateProcess и пр. invoke FreeLibrary,hLib
HMODULE hModule = GetModuleHandle("your_fuckin_dll.dll"); FreeLibrary(hModule); dll конечно содержат релоки и все такое. но я довольно редко видел конфликты адресов такие, чтобы дллки релоцировались. хотя, безусловно надо писать правильно =)
вообще-то база kernel32.dll во всех процессах в системе одна и та же - RTFM. так что PE_Kill тут всё правильно написал
Не знаю. Посмотри в том коде функцию хеширования - я ее специально выделил - и скорми ей эту строку. ну-ну, а если понадобятся другие библиотеки, ты тоже будешь загружать ее себе, искать в ней функцию, а потом использовать этот же адрес в другом процессе? Полностью поддерживаю Great: И потом, нах в нем релоки, если он однозначно по одинаковым адресам грузится и коллизии невозможны? А если про тагертный процесс все так известно, то можно вааще фиксированные адреса использовать, а не искать их - чем не способ?
gyrus весь мой опыт утверждает, что если убить процесс, то используемые им dll освобождаются независимо от того, была ли вызвана FreeLibary или нет... я много раз слышал про отложенную выгрузку dll, но на практике что-то ничего подобного не замечал, и даже не знаю, как этим процессом управлять. Трудно себе представить, что выгрузка была отложена на час или запрещена совсем, поэтому логичнее поискать, кем еще используется эта dll, не зря же она валяется в system'е.. может, кто-то даже просто открыл ее как файл, и держит таким образом, как бы нелепо это ни звучало простой способ проверить - написать свою dll с загружающим ее аппликейшном и проверить, удалится ли эта dll после терминейта процесса а по поводу выхода из цикла.. попробуй послать WM_QUIT потоку
в другом каталоге все происходит точно также удалится. но секунд через 10. насколько я понимаю, WM_QUIT можно послать окну, а не потоку.
gyrus А пропробуйте сделать следующее (прокатит в ХР и выше) : вызываем DebugActiveProcess а потом DebugActiveProcessStop. Некорректно, но точно убить должно
потоку. PostThreadMessage ps раз удалится, значит длл выгружаются с первой происходит что-то особенное