Ctrl-Alt-Delete를 누르면 나타나는 작업관리자 목록에서 원하는 프로그램을 감추는 방법을 소개하겠다. 사실 방법은 매우 간단하지만 잘 알려져 있지 않은듯하다.

Win32 API 중 RegisterServiceProcess()는 커널함수가 있다. 이 함수는 MSDN에서도 문서화되어 있는 함수이지만 일반 API 함수를 사용하듯 호출할 수 없다. 아마 특별한 이유에서 헤더파일에 프로토타입을 빼놓은 듯 한데, GetProcAddress() 함수와 함수포인터를 사용해서 호출할 수 있다. 아래에 리스트된 코드를 보자.

typedef DWORD (WINAPI *LPREGSRVPROC)(DWORD, DWORD); 
void RegisterServiceProcess(DWORD dwProcessId, DWORD dwType) 
HMODULE hMod = GetModuleHandle("kernel32.dll"); 
if(hMod) 
LPREGSRVPROC pfn = (LPREGSRVPROC)GetProcAddress (
hMod, "RegisterServiceProcess"); 

if(NULL != pfn) pfn(dwProcessId, dwType); 

 
dwProcessId : 프로세스 식별자
dwType : 1이면 프로세스를 서비스모드로 등록(작업관리자에 나타나지 않음), 0이면 서비스모드 해제 

Example Borland c code:

//--------------HiddenApp.cpp--------------
#include 
#pragma hdrstop

USERES("HiddenApp.res");
USEFORM("Unit1.cpp",Form1);

typedef DWORD (WINAPI *TRegisterServiceProcess)(DWORD,DWORD);
bool registered=false;

//////////////////////////////////////////////////////////////////////////
void __fastcall reg(bool which) //true=register, false=unregister
{
  HMODULE hmod;
  TRegisterServiceProcess pReg;
  hmod = LoadLibrary("kernel32.dll");

  if (!hmod) return;
  (FARPROC)pReg = (FARPROC)::GetProcAddress(hmod,"RegisterServiceProcess");
  if (!pReg) {FreeLibrary(hmod); return;}
  else 
  {
 if (which)
 pReg(0,1); //unregister our process  
 else
 pReg(0,0);
  }
  registered = true;
  FreeLibrary(hmod);
}
//////////////////////////////////////////////////////////////////////////
WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{  
  try
  {
 reg(true);
 Application->Initialize();
 Application->CreateForm(__classid(TForm1), &Form1);
 Application->Run();
  }
  catch (Exception &exception)
  {
 Application->ShowException(&exception);
  }

  if (registered) reg(false);
  return 0;
}
//--------------eof----------------------------
Posted by 모과이IT
,