티스토리 뷰
Malware
Disk Size를 통한 VM탐지 (How to detect Virtual Machine, Feat. DeviceIoControl)
분석가E 2016. 6. 16. 15:09바쁜 현대인을 위한 3줄 요약
- DeviceIoControl을 통해 PhysicalDrive0~2까지의 크기를 가져옴
- 8바이트 중 상위 4 바이트가 0x19인지 확인 ()
- 0x19미만이면 100GB 보다 작으므로 악성동작 하지 않음
매우간단한 안티디버깅 방법이다.
PhysicalDrive0~ PhysicalDrive2(CreateFileA)까지의 특정 데이터를 가져와(DeviceIoControl) 모두 곱해 더해준 다음 특정값 이상인지 확인하고 리턴한다.
좀 더 보기쉽게 코드를 정리해보자
깔끔하다.
분석을 위해 DeviceIoControl API부터 알아보자.
DeviceIoControl은 I/O 장치에 직접 명령을 전달하는 API이다.
준비가 끝났으니 분석을 시작해보자.
반복문을통해 PhysicalDrive0 ~ 2 까지 CreateFileW를 통해 핸들을 가져온뒤 DeviceIoControl 함수를 통해 I/O 장치에 명령을 전달한다.
PhysicalDrive에 전달하는 명령은 dwIoControlCode를 통해 확인할 수 있는데 0x70000은 IOCTL_DISK_GET_DRIVE_GEOMETRY로 디스크의 타입, 실린더 갯수, 실린더당 트랙, 트랙당 섹터, 섹터당 바이트 등을 반환해 준다.
DISK_GEOMETRY 구조체 (https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363972(v=vs.85).aspx)
DeviceIoContrl 이후 나온 값들은 아래와 같다.
Cylinders(HI) = 0x00000000
Cylinders(LOW) = 0x000016F2
MediaType = 0x0000000C
TrackPerCylinder = 0x000000FF
SectorPerTrack = 0x00000038
BytesPerSector = 0x00000200
다음코드를 보면 모든값을 곱해주는데 이를 통해 하나의 PhysicalDrive의 실제 용량을 구할 수 있게 되며 이 과정을 PhysicalDrive2까지 진행해 현재 PC에 존재하는 물리드라이브의 크기를 알 수 있다.
다음 라인을 보면 마지막 라인을 보면 8바이트중 상위 4바이트를 0x19와 비교하고 있다.
상위 하위
0x00000019 0x00000000
0x1900000000을 1024로 3번 나누어보면 100이 나온다. (1024 로 3번 나누어주면 GB 단위의 값을 얻을 수 있다.)
악성코드는 이 값을 비교해 PhysicalDrive가 100GB 이하인 경우에는 동작하지 않도록 설정되어 있다.
이젠 악성코드 때문에 VM용량도 신경써야 하는 세상이 와버린거 같다.
분석중에 잠깐 찾아봤더니 forensic-proof에 깔끔하게 정리되어 있었다.
댓글