개나 소나 만드는 바이러스 강좌 #!

조회 수 7151 추천 수 133 2002.04.22 21:18:23
여치 *.207.70.141
그 옛날...플로피 디스크를 두개나(?) 장착하던 무쇠 XT를 사용하던 시절부터 나에겐 작은 꿈이 있었으니, 그것이 바로 바이러스를 만드는 것이었다.
파일 앞뒤나 MBR에 기생해서 실행된다는것만 들어서 알고 있었지, 도데체 어떻게 구 현되는지는 알질 못했고 알았다 한들 구현할 능력이 없었다.
고작 PCTOOLS HEX에디트 따위로 파일 안의 스트링을 'HAHAHAH~ xxx Virus~'따위로 고 쳐서 애들 놀려주는게 고작이었다.(그래도 정말 바이러스인줄 아는 놈들도 있었다.)
그렇게 잊고 살았던 바이러스였는데 2000년 마소 9월호에 나온 기사를 보고 다시 생각이 났다.코드 뒷부분에다 바이러스 코드를 붙이면 자연스럽게 돌아가게 할 수 있을거란 생각(물론 ExitProcess()를 호출하는 부분은 덮어써버리던가 사이에 끼워넣던가 해야겠지만)으로 들러붙었고 exe파일은 생각보다 만만치 않음을 깨달았지만, 이미 뽑 은 칼 무라도 벨 심산으로 몇일 걸려서 허접하나마 바이러스 코드를 만들어냈다.

다들 알고 있는 내용이라 생각되지만 혹시 모르니 기본적인 사항 몇가지를 정리하고 필수적인 코드를 공개하도록 한다.
1.목적
  간단한 바이러스를 제작해 시스템의 기본을 배운다.

2.조건

NT에서도 돌아가야한다.즉 도스 서비스나 바이오스 서비스는 사용하지 않는다.때가 어 느때인데 도스 바이러스 만들며 추억을 되살릴텐가.다들 비웃을것이다.더군다나 우리 회사는 대부분 win2000을 사용하기 때문에 도스용 바이러스를 만들면 자랑할 건덕지 가 없다.

자기 자신을 복제하여 다른 파일을 감염시킬 수 있어야 한다.

가능한한 원본 파일 이미지를 손상시키지 않고 바이러스에 의해 시스템이 뽀작날때까지 는 사용자가 알아채지 못해야한다.즉 기생할 당시에 원본 파일의 섹션을 손상시켜서는 안된다.

3.준비물

Visual C++ 6.0 (c/c++은 1%도 안쓴다.인라인 어셈블리를 쓴다.masm보다 툴이 편하기 때문에 사용했다.)

UltraEdit32나 기타 hex edit가능한 에디터

x86어셈블리 기본지식.

4.구현 원리
아주, 아주 간단하게 생각해보자.어떤 프로그램 코드가 있다.뒤에다 코드를 붙이면 원래 코드를 수행한 다음에 돌아가겠는가? 돌아갈수도 있고 안돌아갈수도 있다. 코드의 끝 부분이
call dword ptr[ExitProcess]라든가..
ret라든가..이러면 안돌아갈 것이다.
또한 파일로 존재할 당시에 뒤에다 코드를 붙였다면 뒷부분에 붙인 코드가 원래코드 바로 뒤에 붙어서 메모리에 로드된다는 보장이 없다.
그럼 어떻게 해야겠는가?
여기서 두 가지 필수조건이 생긴다.


바이러스 코드는 메모리에 반드시 로드되어야한다.

원본코드를 수행하고 바이러스 코드를 수행하는것은 위와같은 이유로 어려우므로 바이러스 코드를 수행하고나서 원본 코드를 수행해야한다.

1) 바이러스 코드 로드시키기.
exe파일을 실행시키면 exe파일 전체가 메모리 위에 올라가는 것은 아니다.exe는 pe파일의 일종이고 pe헤더에 따라 메모리에 로드될 영역이 결정된다.따라서 exe 파일 맨 뒷부분에 바이러스 코드를 기입해넣어도 메모리에 로드되지 않는다.뒷 부분에 코드를 넣고 메모리에 로드 시키려면 별도의 섹션을 추가해서 헤더의 섹 션개수를 증가시키고 섹션헤더도 만들어줘야한다.이게 가장 좋은 방법이지만 pe파일이 너무 생소했고 pe파일에 대한 이해가 부족했기 때문에 '단지 바이러스 를 구현'만 해보고 싶은 단계에서 이건 시간이 너무 들어가는 방법이었다. 그래서 일단 제외시켰다.대신에 이미 존재하는 섹션에 끼워넣는 방법을 택했다. 메모리의 최소단위는 대부분 바이트라고 알고 있겠지만, 실제 할당 단위는 intel cpu에선 4KB다.한 페이지가 4KB로 구성되기 때문이다.파일에서는 512부터 다양한 숫자로 올라가는데 NT계열에선 4KB단위가 많은듯 하다.32비트가지고 몇십기가의 어드레스를 바이트 단위로는 표현할 방법이 없기 때문이다.메모리의 페이지개념 과 비슷하다.
따라서 실제 수행되는 코드보다 디스크에서, 혹은 메모리에서 차지하고 있는 공 간이 많기 마련이다.확인해보니 대략 4KB이상 여유분이 있었다.바로 이 공간에 바이러스 코드를 주입하기로 했다.바이러스 코드는 1KB이내의 사이즈로 제작될 것이기에 대부분의 경우는 문제가 없을것으로 생각된다.물론 파일마다 남는 공간 이 다르고 최악의 경우 전혀 남지 않을수도 있다.이런 경우는 부득이하게 원본 코드의 뒷부분을 약간 손상시키게 된다.어떤 결과를 부를진 알수 없지만 현재 내 지식 상태론 다른 방법을 선택할 여지가 없었다.어쨌든 이 남는 공간에 코드 를 넣으면 원래 파일 사이즈도 변하지 않고 헤더도 특별히 고칠 필요없이 바이 러스 코드는 로드된다.무슨 수를써서든 바이너리 코드가 단지 '메모리에 로드되기 만 하면' 바이러스 코드를 수행할 수 있다.

2) 바이러스 코드 먼저 수행하고 원본(숙주)의 코드를 수행하기
com과 달리 exe파일은 수행코드의 엔트리포인트가 옵셋으로 헤더에 기록되어있다. 따라서 메모리 어딘가에 바이러스 코드가 로드만 되어있다면 헤더의 엔트리포인 트 필드를 고쳐줌으로서 바이러스 코드부터 실행하도록 할 수 있다.그리고 원본 코드를 수행하려면? 당연히 바이러스 코드는 원본 코드의 엔트리 포인트로 점프 하는 루틴을 포함해야한다.여튼 이 조건들만 만족시키면 원하는 바이러스가 만들 어진다.

그리고 나머지는 다음회에....

첫 강좌의 첫 장을 마치며...

치다보니 손이 아프다.양이 생각보다 많아졌다.한꺼번에 다 쓸 필요는 없을거같다.
구현원리는 대충 이 정도이다.다음 회에 실제 코드와 주의사항, 코드 설명등이 들어간다. 어제 허접한 바이러스 하나를 만들고 너무 기뻐서 소리르 지르고 말았다.뭐.고수들이 보 면 별것도 아니지만 정말로 된다는게... 내 손으로 만들어서 확인한게 너무나도 기뻤다.

이제야말로 컴을 내 손으로 주물럭거린단 기분이 약간 든다.아직도 os가 어떤짓을 하는지 에 대해선 모르는게 너무나 많고 정말 컴퓨터란 거대한 빙산에서 얼음 조각 하나를 떼어 움켜쥔 기분이다.
화면에 아무리 화려한 그래픽이 돌아다니고 웅장한 사운드가 흘러나온다 해도 opcode하나 하나를 보며 세심하게 컴의 동작을 조작하는 그런 재미는 따라오지 못하는것 같다.적어도 나에겐 그렇다.하고 싶은 일 우선순위를 들자면 1순위가 os커널 제작이고,2순위가 디바이 스 드라이버 제작, 3순위가 바이러스이다.

난이도 순으로 봐도 1,2,3이라고 본다.디바이스 드라이버는 하드웨어 지식을 많이 요하지 않는 (레퍼런스가 충분한) 작업이라면 그다지 어렵지는 않다.(ndis프로토콜 드라이버나 가상 디바이스 를 제작하는 정도의 수준이라면.) 바이러스는 유져모드에서 돌아가기 때문 에 디버그하기 쉽고 코드 사이즈도 작아서 실제 기술상으로 크게 어렵진 않다.이제 3을 겨 우 구현했으니 1,2에 본격적으로 도전해야하지 않나 싶다.몇개월 디바이스 드라이버에 매 달렸지만 커널모드 디버깅이 너무나 힘들어 패킷 스니퍼를 간단하게 구현한 정도로 마무리 지었다.기회가 된다면 하드웨어 제작과 드라이버 제작을 같이 해보고 싶다.
본인과 뜻을 같이하는 사람들이 있다면 좀 끌어주었으면 좋겠다.지식이 너무 부족하고 경 험도 부족함을 여실히 느낀다.

쓰고보니 강좌의 본 내용보다 잡설이 더 길어진거 같다.다음회에는 좀 더 열심히 써야겠다.

파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
43 Multi Thread란... 여치 2002-10-11 7992
42 [필독] 프로그래밍, 신이 내린 최고의 노가다 [1] 베지타 2002-10-21 7862
41 [re] [질문]HeightField에서 LOD는 안쓰시나요? [6] protian 2004-06-10 7706
40 [re] 소켓 여치 2002-10-19 7629
39 NPC 길찾기 시스템과 맵구조에 대한 질문이에요 ^^ [2] 풍이 2003-06-03 7596
38 엔진 제작기간은? 답게 2003-12-08 7551
37 [re] runtime assembler..... gg 2002-09-14 7455
36 [질문] 함수에 관해 hongiro 2002-10-15 7325
35 콘솔모드는... [1] 여치 2002-10-02 7306
34 [re] [질문] 함수에 관해 여치 2002-10-15 7266
33 정밀한 퍼포먼스 체크 여치 2002-10-19 7203
32 [re] 오랜만에 질문 하나 드립니다~ [1] 여치 2003-08-08 7199
» 개나 소나 만드는 바이러스 강좌 #! 여치 2002-04-22 7151
30 오랜만에 질문 하나 드립니다~ 풍이 2003-08-07 7075
29 [re] [질문]HeightField에서 LOD는 안쓰시나요? 여치 2004-05-05 6931
28 판타지스타 온라인 for pc를 해보고... 여치 2002-09-19 6851
27 가상함수는 어떻게 호출되나? 여치 2002-10-19 6698
26 [re] [질문] 게임 [2] hongiro 2003-07-08 6645
25 [re] 3D Programming에 관한 책을 추천해주실 수 있으신지요... 여치 2002-10-11 6636
24 o/s의 내부에 대해 자세하게 알고싶은데여... 베지타 2002-10-12 6566



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet