이번 내용은 정확히 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();}===========================================================================
Thanks for researching my logic. :)
ReplyDelete- c!pherux