Friday, August 2, 2013

C++ 을 이용한 Virus Vaccine 만들기 by c!pherUX @CodeMink.com


 이번 내용은 정확히 Vaccine 이 어떤식으로 만들어지는지를 아주 단적으로 보여주는
글입니다. 아직까지 어떤 백신도 세로 만들어진 바이러스를 잡아 낼 수가 없습니다.
이미 만들어진 바이러스의 Pattern 을 철저히 분석한 다음에야 Vaccine이 그러한
바이러스를 잡아 낼 수 있는 것입니다.

<준비사항>

우선 바이러스나 악성코드가 들어간 화일을 2개정도 준비.
Notepad++ 같은 Binary 로딩이 가능한 프로그램 준비.


<Vaccine 만들기>

Notepad++ 을 이용해 악성코드가 포함된 화일을 Binary Loading 합니다.
그런 다음 notepad를 열어서 악성코드에 포함된 문자열 pattern 을 아래와 같이
기록합니다.
첫줄에 라인넘버를 기록하고 다음라인에 문자의 순번과 들어간 문자를 공백으로 구분하여
입력합니다. (Line과 Line Number 도 띄어쓰기로 구분)

해당하는 악성코드의 특징적인 문자패턴을 입력하면 됩니다.
여기서는 DOS signiture 와 PE signiture를 사용했내요.
더 많은 Pattern 을 입력해도 됩니다.

정상적인 화일을 악성코드라고 잡아내는 것을 줄일려면 pattern 이 좀 많을수록
좋습니다.

이러한 특징들을 노트패트에 입력후 db.txt 라는 이름으로 저장합니다.
주의. txt화일의 <- virus -> 과 <- End of File -> 도 정확히 넣어주어야 합니다.
<- virus -> 는 바이러스 종류 구분자, <- End of File -> 은 검사할 바이러스의 끝.




아래에 코드를 기술하기 전에 Code에서 하고있는 작업을 나열하면,
1. 검사를 하기 위한 폴더의 모든 화일리스트와 서브 디렉토리를 가져온다음
2. 화일들을 하나씩 순차적으로 위의 db.txt에서 정의했던 pattern 과 비교를 하여
    모두 매치가 된다면 감염 된것으로 간주합니다.
3. 바이러스에 감염된 화일을 어떻게 처리할 것인지? 자동삭제? 사용자에게 질의하기?등등


<Code>
=============================================================================
#include <dirent.h>
#include <string.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
int scan_this(char *file_name)
{
 char *pattern, *line_in_file;
 char file_ch, ch;
 int val, val2, flag;
 ifstream fin3, fin4;
 fin3.open(file_name); //접근할 수 없는 파일이면 종료.
 if(!fin3) return 0;
else //화일이고 읽을수 있다면 화일 open
 {
 //virus db(db.txt) 열기
 fin4.open("db.txt"); //문자열 pattern 이 기록된 txt 화일
for(;;)
 {
 fin4>>pattern;
 if(!strcmp(pattern,"<-"))
 {
 fin4>>pattern;
 if(!strcmpi(pattern,"End"))return -1;
 else if(!strcmpi(pattern, "virus"))
 {
 if(flag) return 1;
 else continue;
 }
 }
 else if(!strcmpi(pattern,"LINE"))
 {
 fin4>>val; // 라인 행
// skipping initial lines to reach the line number
 for(int i=0;i<val-1;i++)
 {
 fin3.getline(line_in_file, 300);
 }
fin4>>val; // 문자의 위치
 fin4>>file_ch; // 문자
//skipping initial character to reach the character
 for(i=0;i<val-1;i++)
 {
 fin3.get(ch);
 }
if(file_ch == ch) flag = 1; // 매치되면
 else flag =0;
 fin3.seekg(0); // set to start
 }
 }
}
}
void main()
{
 char comm[300], dirpath[100], file_name[200];
 char ask;
 int response;
 ifstream fin;
cout<<"Enter Directory you want to scan: "; //scan할 디렉토리 입력
 cin>>dirpath;
strcpy(comm, "dir ");
 strcat(comm, "dirpath /b /s >tmp.$$$");
 system(comm);
fin.open("tmp.$$$");
while(!fin.eof())
 {
 fin.getline(file_name, 200);
 response = scan_this(file_name);
 if(response == 1)
 {
 cout<<"<--!! Caution.! A Virus has been Detected..!";
 cout<<"\n"<<file_name;
 cout<<"\nPress Enter Key to Delete it.";
 ask= getch();
 if(ask == 13)
 {
 remove(file_name); // 바이러스 삭제
 }
 }
 }
fin.close();
 cout<<"Scan Complete.!! Thank You for using our anti virus";
 getch();
}
===========================================================================



1 comment :