이번 내용은 정확히 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