Странная проблема с CreateProcess и CreateFile

Тема в разделе "WASM.WIN32", создана пользователем overfault, 28 сен 2005.

  1. overfault

    overfault New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    22
    Проблема в том, что после запуска дочернего процесса с помощью CreateProcess, остановки его и закрытия хэндлов, не удается открыть этот файл вызовом CreateFile. GetLastError дает код ошибки 32(ERROR_SHARING_VIOLATION).

    Помогите плиз найти ошибку.

    Вот пример кода:
    Код (Text):
    1.  
    2.   STARTUPINFO si;
    3.   PROCESS_INFORMATION pi;
    4.   HANDLE hFile;
    5.  
    6.   GetStartupInfo(&si);
    7.   CreateProcess(lpszFile,NULL,NULL,NULL,
    8.     FALSE,DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi);
    9.   CloseHandle(pi.hThread);
    10.   TerminateProcess(pi.hProcess,0);
    11.   CloseHandle(pi.hProcess);
    12.   hFile = CreateFile(lpszFile, GENERIC_READ | GENERIC_WRITE,
    13.     FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    14.  
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    В файл запущеного процесса писать нельзя, поэтому с флагом GENERIC_WRITE открыть не удается.

    Оставь только GENERIC_READ и тогда будет открываться.
     
  3. igorekkk

    igorekkk New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2005
    Сообщения:
    3
    Адрес:
    спб
    2 overfault

    как сказал Ms Rem в файл являющейся приложением для присутствуещего в памяти процесса изменять незя...

    процесс который создан с

    DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS

    не уничтожается пока прога дебаггер выполняется...

    есть мнение что процесс можно отпаять функцией DebugActiveProcessStop а потом кильнуть, но у меня видать старый SDK поэтому компилятор не знает этой функции =(

    или открывай как посоветовал Ms Rem

    тока для GENERIC_READ (если для тебя это конечно подходит)
     
  4. overfault

    overfault New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    22
    Как я понял из ваших ответов, вызов TerminateProcess останавливает выполнение процесса, но не освобождает файл...

    Дело в том, что мне необходимо именно редактировать файл после завершения отладки. Файлом является программа, зараженная вирусом с полиморфным дешифратором. Под дебагом я его запускаю для поиска сигнатуры и получения данных для удаления тела вируса из зараженного файла.

    Я запускаю дезинфектор отдельным процессом из сканера, он создает копию файла и ее отлаживает, затем правит оригинал, а оставшуюся копию удаляет сканер.

    Но как-то это не очень...

    Покопаюсь в SDK, может тем временем кто-то подбросит кое-какие идеи, как это реализовать в одном процессе.
     
  5. overfault

    overfault New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    22
    Код (Text):
    1.  
    2. DebugActiveProcessStop
    3.  
    4. The DebugActiveProcessStop function stops the debugger from debugging the specified process.
    5.  
    6.  
    7. BOOL DebugActiveProcessStop(
    8.   DWORD dwProcessId
    9. );
    10.  
    11. Parameters
    12. dwProcessId
    13. [in] Identifier of the process to stop debugging.
    14. Return Values
    15. If the function succeeds, the return value is nonzero.
    16.  
    17. If the function fails, the return value is zero. To get extended error information, call GetLastError.
    18.  
    19. Requirements
    20. Client Requires Windows "Longhorn" or Windows XP.
    21. Server Requires Windows Server "Longhorn" or Windows Server 2003.
    22. Header Declared in Winbase.h; include Windows.h.
    23.  
    24. Library Link to Kernel32.lib.
    25.  
    26. DLL Requires Kernel32.dll.  
    27.  




    И вправду помогло =)



    При отсутствии свежего SDK:

    DWORD _DebugActiveProcessStop = (DWORD) GetProcAddress(LoadLibrary("KERNEL32.DLL"), "DebugActiveProcessStop");

    ((BOOL (__stdcall *)(DWORD))_DebugActiveProcessStop)(pi.dwProcessId);
     
  6. overfault

    overfault New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2005
    Сообщения:
    22
    Кстати эта функция использует поля Teb:0F20h,0F24h (DbgSsReserved), закрывает пару хэндлов отлаживаемого процесса и вызывает NtRemoveProcessDebug.

    Интересно попробовать реализовать ее в win2k