Q&A

  • TerminateProcess로 안죽는 프로그램때문에 부탁드립니다.
TerminateProcess로 프로그램이 안죽어서 찾다 보니까 아래 코드를 찾았는데 이거 델파이로 바꾸는데
안되서 부탁 드립니다.

아래 함수한개를 델파이코드로 좀 바꾸어주세요.. 감사합니다.




BOOL SafeTerminateProcess(HANDLE hProcess, UINT uExitCode)

{

    DWORD dwTID, dwCode, dwErr = 0;

    HANDLE hProcessDup = INVALID_HANDLE_VALUE;

    HANDLE hRT = NULL;

    HINSTANCE hKernel = GetModuleHandle("Kernel32");

    

    BOOL bSuccess = FALSE;

    BOOL bDup = DuplicateHandle(GetCurrentProcess(),

                                    hProcess,

                                    GetCurrentProcess(),

                                    &hProcessDup,

                                    PROCESS_ALL_ACCESS,

                                    FALSE,

                                    0);

    if ( GetExitCodeProcess((bDup) ? hProcessDup : hProcess, &dwCode)

         && (dwCode == STILL_ACTIVE) )

    {

      FARPROC pfnExitProc;

      pfnExitProc = GetProcAddress(hKernel, "ExitProcess");

      hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,

                              NULL,

                              0,

                              (LPTHREAD_START_ROUTINE)pfnExitProc,

                              (PVOID)uExitCode, 0, &dwTID);

      if ( hRT == NULL ) dwErr = GetLastError();

    }

    else

    {

         dwErr = ERROR_PROCESS_ABORTED;

     }

     if ( hRT )

    {

        WaitForSingleObject((bDup) ? hProcessDup : hProcess, INFINITE);

        CloseHandle(hRT);

        bSuccess = TRUE;

    }

    if ( bDup )

    CloseHandle(hProcessDup);

    if ( !bSuccess )

    SetLastError(dwErr);

    

  return bSuccess;

}




   위의 소스 코드를 분석해보면 원리는 간단합니다. Kernel32.dll 에 있는 ExitProcess라는 함수에 대한 포인터를 얻고 그것을 CreateRemoteThread를 이용하여 호출하여 그 프로세스가 스스로 죽는 효과를 만들어 내는 것입니다.

물론 DuplicateHandle 등 부수적인 체크 등을 위해 넣은 코드들은 있지만 기본 원리는 이와 같이 간단합니다.

  이를 사용할 때의 주의점은 Win9X 계열은 이 방법을 사용할 수 없다는 점입니다. CreateRemoteThread 라는 API 를 사용하는데 이것은 Win9X 에서는 지원하지 않는 함수이므로 사용할 수 없는 것입니다. 따라서 이 점 주의해주십시오.
0  COMMENTS