2011-11-28 3 views
0

아주 멋진 기능은 여기에 언급 된 :PYTHON | 사용자 죽이는 프로세스를 중지

Prevent user process from being killed with "End Process" from Process Explorer

사람이 파이썬이 C++ 코드를 변환 (또는 재 편집을가 적어도 C/C에서 컴파일 수 있도록하는 방법을 알고 있나요 ++

static const bool ProtectProcess() 
{ 
    HANDLE hProcess = GetCurrentProcess(); 
    EXPLICIT_ACCESS denyAccess = {0}; 
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL; 
    BuildExplicitAccessWithName(&denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE); 
    PACL pTempDacl = NULL; 
    DWORD dwErr = 0; 
    dwErr = SetEntriesInAcl(1, &denyAccess, NULL, &pTempDacl); 
    // check dwErr... 
    dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL); 
    // check dwErr... 
    LocalFree(pTempDacl); 
    CloseHandle(hProcess); 
    return dwErr == ERROR_SUCCESS; 
} 
+3

왜 사용자가 프로세스를 종료하는 것이 더 어렵게 만들고 싶습니까? –

+1

@DavidHeffernan - Skynet :) – Rook

+0

C++로 컴파일되도록 편집하여 무엇을 의미합니까? 컴파일되지 않습니까? ctypes를 통해 Pythin으로가는 꽤 쉬운 항구처럼 보입니다. –

답변

2

어떻게 ctypes 사용에 대한 : 그게)에 무엇을 가정? 또는 pywin32으로 시도해 볼 수도 있습니다. IronPython을 사용해 볼 수도 있습니다. 액티브 파이썬에는 win32api이 있습니다.

나는 또한 당신이 왜 그것을 달성하고 싶은지에 대한 당신의 추론을 모른다. 그것은 잠재적으로 좀 더 우아한 해결책이 있음을 의미한다.

+0

안녕하세요, 이것이 내 문제를 해결하는 방법을 모르십니까? – Ian

+0

자세한 정보를 찾을 수있는 곳에서 몇 가지 정보를 얻을 수 있습니다. 당신이 물어 보는 질문은 그 자체로는 사소한 것입니다. 즉, 당신이 완전히 해결하기 위해 사소한 코딩을해야 할 필요가 있음을 의미합니다. :) 또는, 당신이하고있는 일을 성취하고자하는 이유를 우리에게 제시 할 수 있습니다. 몇 가지 대체 솔루션을 제안 할 수 있습니다. – jsalonen

+0

관리자가 관리하는 응용 프로그램 사용 모니터링을위한 사용자 생산성 모듈을 작성 중입니다. 사용자가 죽일 수있는 경우에는 좋지 않습니다. 서비스로 실행할 수 있지만 모든 win32gui 항목이 실패합니다. 이것은 좋은/간단한 대안처럼 보인다. – Ian

2

게시 한 코드의 번역본이 다소 비쌉니다. 그것은 심지어 작동하는 것처럼 보인다! 내가 잘못 입력 한 CloseHandle에 대한 전화를 제거합니다. 의사 핸들에 CloseHandle을 호출하면 안됩니다. 즉 GetCurrentProcess이 반환합니다.

from ctypes import * 
from ctypes.wintypes import * 
from win32con import * 

class TRUSTEE(Structure): 
    pass 

TRUSTEE._fields_ = (
    ('pMultipleTrustee', POINTER(TRUSTEE)), 
    ('MultipleTrusteeOperation', c_int), 
    ('TrusteeForm', c_int), 
    ('TrusteeType', c_int), 
    ('ptstrName', LPSTR) 
) 

class EXPLICIT_ACCESS(Structure): 
    _fields_ = (
     ('grfAccessPermissions', DWORD), 
     ('grfAccessMode', c_int), 
     ('grfInheritance', DWORD), 
     ('Trustee', TRUSTEE) 
    ) 

GetCurrentProcess = windll.kernel32.GetCurrentProcess 
GetCurrentProcess.restype = HANDLE 
hProcess = GetCurrentProcess() 

denyAccess = EXPLICIT_ACCESS() 
dwAccessPermissions = DWORD(GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL); 

BuildExplicitAccessWithName = windll.advapi32.BuildExplicitAccessWithNameA 
BuildExplicitAccessWithName.restype = None 
DENY_ACCESS = 3 
NO_INHERITANCE = 0 
BuildExplicitAccessWithName(byref(denyAccess), 'CURRENT_USER', dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE) 

SetEntriesInAcl = windll.advapi32.SetEntriesInAclA 
SetEntriesInAcl.restype = DWORD 
SetEntriesInAcl.argtypes = (ULONG, POINTER(EXPLICIT_ACCESS), c_voidp, POINTER(c_voidp)) 
pTempDacl = c_voidp() 
dwErr = SetEntriesInAcl(1, byref(denyAccess), None, byref(pTempDacl)); 

SetSecurityInfo = windll.advapi32.SetSecurityInfo 
SetSecurityInfo.restype = DWORD 
SetSecurityInfo.argtypes = (HANDLE, c_int, DWORD, c_voidp, c_voidp, c_voidp, c_voidp) 
SE_KERNEL_OBJECT = 6 
dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, None, None, pTempDacl, None); 

LocalFree = windll.kernel32.LocalFree 
LocalFree.restype = c_voidp 
LocalFree.argtypes = (c_voidp,) 
LocalFree(pTempDacl) 
+0

이 방법은 완벽하게 작동하므로 실용적인 번역이라고 생각합니다. –