'백신'에 해당되는 글 1건

  1. 2007.05.26 백신을 믿어야 할 것인가.

백신을 믿어야 할 것인가.




요즘 바이러스, 트로이얀 참 많다. 머 누구나 다들 잘 아는 사실일 것이다.
그리고 바이러스가 많아짐에 따라 백신도 아주 많아졌다...
보안회사는 먹고살기 힘들어서 문 닫는데가 늘어나는데, 백신은 계속 늘어나니 아이러니한
현실이다.

머 어쨌든 그건 그렇다 치고 바이러스의 종류가 굉장히 많아진건 사실이다.
그런데 문제는 백신이 바이러스라고 진단하는 것을 어디까지 믿어야 하느냐는 것이다.
요즘 각 백신의 엔진 작업, 패턴 작업하는 분위기를 보면, 몽땅 싸그리 바이러스로 감지하는
경우가 너무 많다.

가장 피해를 입고 있는 쪽이, 시스템 유틸리티 부분이다.
시스템 분석 도구들이 해킹, 크래킹에 이용되고 있는건 머 일단 부정할 수 없는 사실이다. 그런데
그것을 싸그리 바이러스로 진단할 필요까지 있을까 하는 생각이 든다.

사용자 삽입 이미지

Dll Injection을 해주는 유용한 유틸리티. 내가 본 것중 7~8종 이상의 백신들이 모두 이 프로그램을
바이러스로 진단한다


물론 치트 엔진 같은 경우는 나름 인정을 한다 (치트 엔진 역시 대부분의 백신이 Trojan으로
진단을 한다) 하지만 다른 유용한 유틸리티까지 바이러스로 잡을 것 까진 없다 (그것도 진단명은
왜 Backdoor나 Trojan으로 명명하는지 그것도 이해할 수가 없다)

일단 이렇게 해놓으면 초딩들이 크래킹 도구를 이용하여 뻘짓을 하려고 할때, 백신이 Detect
메시지를 보여줌으로써 겁을 줄 순 있을 거 같긴 하다. 하지만 이런 오진 아닌 오진이 점점
심해지면 나중에는 이것이 바이러스가 아닌데도 백신들이 계속 잡아채는 모습을 보며,
사용자들은 백신을 믿지 않게 될 수도 있다 (특히 자기가 보안 쪽에서 쬐금이라도 먼가 알고
있는 사람이다 라고 자부하는 경우는 더더욱이 그 가능성이 농후하다)

그래서 자신이 사용하는 Tool이 진단되면 백신을 off 하고 계속 작업을 하거나, 진단되도 걍
무시해 버리게 되는 상황이 잦아지게 될 수 있고, 그러다보면 진짜 바이러스에 감염되어도
백신의 메시지를 무시하는 끔찍한 상황이 올 수도 있다(그렇다면 정말 심각해지게 된다).
그리고 바이러스인지 시스템 툴인지 판단기준이애매모호할 때, 그리고 일반 시스템 유틸인데
이것이 바이러스에 감염된 채 있는 것인지 아니면 걍 백신이 디텍트를 뿌린건지 파악하기 힘들 때,
역시 매번 Reverse Engineering으로 코드를 뜯어보거나 하는 귀찮은 방법으로 확인할 수밖에 없다.

난 백신들의 이러한 관행은 좀 고쳐야 한다고 생각한다. 멀쩡한 프로그램을 바이러스로 잡는
것부터 일단 문제라고 생각하고 있고, 진단율 90% 95% 이딴 과도한 경쟁이 또 이런 상황을
더욱 부추긴 것 같다는 생각이 든다.

이왕 말이 나온김에 대체 Dll Injector는 왜 바이러스로 잡는지 한번 확인을 해보았다.
Dll Injector는 프로세스에 dll 을 주입해 주는 기능이 핵심이다(핵심이라고 말하기에도
우스운게 딱 그 기능밖에 없다)그리고 그 루틴은 CreateRemoteThread를 이용해서 남의
프로세스에 remote call 을 하는 것이 원리 인데, 대략 아래 코드가 주요부라 볼 수 있다.

/*
테스트 백신 : Avast 4.7 Professional Edition
테스트 툴 : Dll Injector (MD5 : 1F1C080E0CE8AD0EA2C56D75DC82B18A)
*/

사용자 삽입 이미지

VirtualAllocEx를 이용하여 남의 프로세스 공간에 메모리를 할당해 놓고


사용자 삽입 이미지

Code Injection을 위해 페이지 속성 변경

사용자 삽입 이미지

WriteProcessMemory()로 Remote Call을 호출했을 때의 코드를 잡어넣고
CreateRemoteThread로 Run~!

대략 Remote Call의 아주 전형적인 스타일이다.
내가 볼 때 백신회사에서 이 프로그램을 바이러스로 규명할 이유는 이거밖에 없는 거 같아서
한번 이 루틴을 몽땅 제거를 해보았다.

함수 enrtry point부터 retn 루틴까지 몽땅 ZeroMemory 처리해보았다
(90으로 하려니 노가다라서 ㅋ)

사용자 삽입 이미지


근데 그래도 여전히 바이러스로 진단되는 모습을 볼 수 있었다. 만약 heuristic engine에 의하여
detection 되었던 것이라면 저 코드를 날려버렸을 때 더이상 바이러스로 잡히지 않아야
정상이라고 생각했지만 그건 아닌 거 같았다. 그렇다면 code section의 많은 byte가 변경
되었는데도 여전히 잡히니...그렇다! PE Header 영역을 검사할 가능성이 있다.

StudPE로 code section에 WRITE 속성을 줘보았다 (오리지날 파일은 Packing이 되어 있지
않아서 READ/EXCUTE 속성밖에 없음)


사용자 삽입 이미지

그리고 백신을 Full Option 해 놓은 상태에서 Dll Injector 실행.


사용자 삽입 이미지

진단되지 않고 아주 잘 실행이 되는 모습을 볼 수 있다. 결국 Header에 대한 어떠한 정보나
CheckSum등으로 Signature 진단 방법을 이용한다는 것을 알 수 있었다.

자신이 사용하는 프로그램이 백신이 쓸데없이 계속 바이러스로 잡는다면 이런 방법을 이용해서
백신의 감지를 Bypass시킬 수도 있겠다(물론 백신사에서도 오진을 염려해서 진단 예외 항목 설정
따위의 기능을 제공하고 있어서, 자기가 쓰는 프로그램은 바이러스로 진단되지 않도록 설정하는
방법도 있지만, 바보 개발자가 만든 백신은 아무리 예외 항목에 넣어도 계속 바이러스로 잡는
강력한 모습을 보여주는 경우도 많다)

그래서 난 내가 쓰는 바이러스로 잡히는 주요 프로그램들은 이같은 방법을 이용해서 백신의
무지몽매함을 피해간다. 혹시 도움이 되겠다 싶으신 분들은 같은 방법을 사용해도 나쁠 거 없겠다.

/*
지금의 예는 Avast 의 예를 들어서 기재한 것이고, 이 글은 단순 연구의 목적으로 작성된 것이므로,
특정 백신에 대한 폄하의도는 전혀 없음을 알려드립니다. 저는 참고로 Avast의 신봉자이며, 언제
업데이트도 끊길지 알 수 없는 Crack 버전의 공공기관용 백신 따위를 p2p에서 받아서 사용하는
것보다 Freeware인 Avast를 이용하라고 주위에 널리 추천하고 있는 사람입니다 :) Avast 엔진
성능도 매우 훌륭하고요 ;)
*/


2007년 5월
신고
Posted by window31


댓글을 달아주세요

BLOG main image
by window31

카테고리

분류 전체보기 (285)
Reverse Engineering (22)
C, C++ (20)
Kernel (8)
Guitar (19)
잡담 (79)
etc (8)
who am i (8)
보안 이야기 (89)
Tools (3)
월간 마이크로소프트웨어/그.. (28)

글 보관함