Matilda1 바이러스

@codemaru · November 16, 2007 · 4 min read

지난 주말에 마소 원고를 썼어야 했는데 소리통 기능 추가한다고 뻘짓좀 하고, K가 면접 있다고 올라와서 좀 놀아주고 하다보니 몇 페이지 쓰지도 못하는 초유의 사태가 발생했습니다. 원고 마감이 몇 일 남지도 않았기 때문입니다. 그래서 요 몇 일 좀 바빴습니다. 맨날 미루다가 된통 당했네용. ㅎㅎ

하여튼 그런 우여곡절 끝에 Matilda1 바이러스가 만들어졌습니다. ㅋㅋ 첨에 당연히 C++로 만들어야지 하고 만들기 시작했는데, 중간에 포기하고 어셈블리로 만들뻔 했습니다. 하지만 뛰어난 끈기와 투지로 함정을 헤쳐나가서 마침내 C++로 PE를 감염시키는 아주 정직한 바이러스를 만들었습니다.

어떤 바이러스인지 궁금하시죠? 감염된 파일을 실행하면 아래 화면처럼 마우스 포인터가 위치한 곳에 Matilda1이란 글자를 마구 씁니다. 증상은 그게 답니다. 프로그램 종료할 때까지 열심히 쓰죠. 증상은 그게 전부입니다. 뭔가 그럴싸한 증상을 만들고 싶었으나 마땅한게 없더군요. 근사한건 너무 길어서 ㅋㅋ

Matilda1      md 0

감염된 파일이 실행되면 c:\test 아래에 있는 실행 파일 중에 감염되지 않은 놈을 전염시킵니다. 전염 시킨 놈을 디버그 출력으로 찍어주죠. 아래는 그렇게 전염되는 것을 캡쳐한 화면 입니다.

Matilda1      md 1

아래는 Matilda1의 바이러스 코드 진입점입니다. 이 부분만 보고 이게 무슨 C++ 이냐고 하실 수도 있지만 나머지는 다 C++입니다. ㅋㅋ 물론 인라인 어셈블리가 종종 등장하긴 합니다.

\_\_declspec(naked) void Entry()  
{  
    \_\_asm  
    {  
        jmp $start  
        \_emit 'M'  
        \_emit 'a'  
        \_emit 't'  
        \_emit 'i'  
        \_emit 'l'  
        \_emit 'd'  
        \_emit 'a'  
        \_emit '1'  
$start:  
        mov eax, [esp]  
        push eax  
        call FindPEHeader  
        test eax, eax  
        jz $oep  
  
        push eax  
        call InitTrampolines  
  
        call Matilda1  
$oep:  
        push OriginalEntry  
        ret  
    }  
}

Matilda1에 감염되면 파일의 끝에 .vmat 섹션이 추가되고 엔트리 포인트가 바이러스 코드로 변경됩니다. 따라서 휴리스틱 기능을 사용하는 백신 엔진에는 바로 걸리겠죠. 결국 마소 12월호 광고 였습니다.

Matilda1      md 2

소리통에도 근사한 기능 추가가 임박했습니다. ShoutCAST 관련 버그 패치, UI 기능 추가, 환경 설정, 라디오 청취 기능이 추가될 계획입니다. ㅋㅋ

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중