출처 : Devpia(http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8320&page=12)
ntdll.dll의 RtlSetProcessIsCritical로 크리티컬 프로세스로 설정하거나 상태를 알아볼 수 있습니다.
위의 API를 사용하려면 Privilege 권한을 획득해야 되는데 아래 링크 참조
Enabling and Disabling Privileges in C++
[-] Collapse
#include <windows.h>
#include <stdio.h>
typedef LONG (*RtlSetProcessIsCritical) (
IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue, // (optional)
IN BOOLEAN IsWinlogon );
BOOL EnablePriv(LPCSTR lpszPriv) // by Napalm
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkprivs;
ZeroMemory(&tkprivs, sizeof(tkprivs));
if (!OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hToken))
return FALSE;
if (!LookupPrivilegeValue(NULL, lpszPriv, &luid)) {
CloseHandle(hToken); return FALSE;
}
tkprivs.PrivilegeCount = 1;
tkprivs.Privileges[0].Luid = luid;
tkprivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bRet = AdjustTokenPrivileges(hToken, FALSE, &tkprivs, sizeof(tkprivs), NULL, NULL);
CloseHandle(hToken);
return bRet;
}
BOOL ProtectProcess() // by _FIL73R_
{
HANDLE hDLL;
RtlSetProcessIsCritical fSetCritical;
hDLL = LoadLibraryA("ntdll.dll");
if ( hDLL != NULL ) {
EnablePriv(SE_DEBUG_NAME);
(fSetCritical) = (RtlSetProcessIsCritical) GetProcAddress( (HINSTANCE)hDLL, "RtlSetProcessIsCritical" );
if (!fSetCritical)
return 0;
fSetCritical(1, 0, 0);
return 1;
} else
return 0;
}
int main (void)
{
ProtectProcess();
while(1) {
// do your virus thingy -_-;;
}
return 0;
}
#include <stdio.h>
typedef LONG (*RtlSetProcessIsCritical) (
IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue, // (optional)
IN BOOLEAN IsWinlogon );
BOOL EnablePriv(LPCSTR lpszPriv) // by Napalm
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkprivs;
ZeroMemory(&tkprivs, sizeof(tkprivs));
if (!OpenProcessToken(GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY), &hToken))
return FALSE;
if (!LookupPrivilegeValue(NULL, lpszPriv, &luid)) {
CloseHandle(hToken); return FALSE;
}
tkprivs.PrivilegeCount = 1;
tkprivs.Privileges[0].Luid = luid;
tkprivs.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bRet = AdjustTokenPrivileges(hToken, FALSE, &tkprivs, sizeof(tkprivs), NULL, NULL);
CloseHandle(hToken);
return bRet;
}
BOOL ProtectProcess() // by _FIL73R_
{
HANDLE hDLL;
RtlSetProcessIsCritical fSetCritical;
hDLL = LoadLibraryA("ntdll.dll");
if ( hDLL != NULL ) {
EnablePriv(SE_DEBUG_NAME);
(fSetCritical) = (RtlSetProcessIsCritical) GetProcAddress( (HINSTANCE)hDLL, "RtlSetProcessIsCritical" );
if (!fSetCritical)
return 0;
fSetCritical(1, 0, 0);
return 1;
} else
return 0;
}
int main (void)
{
ProtectProcess();
while(1) {
// do your virus thingy -_-;;
}
return 0;
}
보호된 프로세스가 종료되면 잠깐 블루스크린 떳다가 리부팅 된다.
※ 첨부된 프로젝트는 정상 종료시 보호된 프로세스를 해제하도록 되어있음
'MS > C++' 카테고리의 다른 글
Jsoncpp 사용시 문제점 (0) | 2015.01.29 |
---|---|
_chkstk (0) | 2014.09.17 |
libcurl-7.19.3-win32-ssl-msvc dynamic dll 0xc000007b 문제 (3) | 2013.06.10 |
curl - setopt 종류 (0) | 2013.03.18 |
CTreeCtrl (0) | 2013.03.11 |
멀티바이트 --> 유니코드 (매크로) (0) | 2012.11.20 |
boost library 설치 방법 (0) | 2012.08.10 |
특정 Thread가 종료 되었는지 대기중인지 알수 있는 코드 (0) | 2012.08.10 |
OpenMP (0) | 2012.07.23 |
ms에서 dirent.h파일 사용 하기 (0) | 2012.06.08 |