파일 숨기기 (File Attributes)
Hidden Files
해킹툴을 분석하다보면 탐색기를 통해 보이지 않는 파일이 종종 발견됩니다. 해당 글에서 소개하는 핵툴 또한 windir 경로에 숨겨진 파일(mrt100.dll)을 생성합니다.
해당 파일은 윈도우 탐색기에서 숨긴 항목 기능을 활성화하여도 보이지 않습니다.
attrib.exe
생성된 경로로 이동하여 dir 명령을 통해 확인해보이면 파일이 보이지 않습니다.
그러나 attrib 명령을 통해 확인해보면 파일이 존재하고 있는 것을 확인할 수 있습니다.
attrib 실행 명령은 다음과 같습니다. SH는 SYSTEM + HIDDEN 으로 숨겨진 시스템 파일을 의미합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
C:\Users\JH>attrib /?
파일 특성을 표시하거나 변경합니다.
ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+P | -P] [+U | -U]
[드라이브:][경로][파일 이름] [/S [/D] [/L]]
+ 특성을 설정합니다.
- 특성을 지웁니다.
R 읽기 전용 파일 특성입니다.
A 보관 파일 특성입니다.
S 시스템 파일 특성입니다.
H 숨김 파일 특성입니다.
O 오프라인 특성입니다.
I 콘텐츠가 인덱싱되지 않은 파일 특성입니다.
X 스크럽 파일 특성이 없습니다.
V 무결성 특성입니다.
P 고정된 특성입니다.
U 고정 해제된 특성입니다.
B SMR Blob 특성입니다.
[드라이브:][경로][파일 이름]
attrib에서 처리할 파일을 지정합니다.
/S 현재 폴더와 모든 하위 폴더에서 일치하는 파일을
처리합니다.
/D 폴더도 처리합니다.
/L 바로 가기 링크의 특성 및 바로 가기 링크의 대상에서
작동합니다.
다음과 같은 명령을 통해 속성 변경이 가능합니다.
1
2
3
4
5
// 숨김 설정
attrib TEST.exe +s +h
// 숨김 해제
attrib TEST.exe -s -h
WinHex
해당 파일은 WinHex 또는 Everything을 통해서도 확인이 가능합니다. 다만 다음과 같이 속성 탭에서 숨김(H) 옵션은 변경할 수 없습니다.
SetFileAttributes
SetFileAttributes 함수의 파라미터는 다음과 같습니다. 파일 속성을 변경할 때 사용됩니다.
1
2
3
4
BOOL SetFileAttributesA(
[in] LPCSTR lpFileName,
[in] DWORD dwFileAttributes
);
해킹툴에서는 파일을 생성한 뒤에 SetFileAttributes을 호출하여 속성을 변경합니다.
호출 시 전달하는 dwFileAttributes는 0x06이며, 해당 값은 SetFileAttributesA 문서에 자세히 나와있습니다. 숨겨진 시스템 파일을 의미합니다.
Value | Meaning |
---|---|
FILE_ATTRIBUTE_HIDDEN 2 (0x2) | The file or directory is hidden. It is not included in an ordinary directory listing. |
FILE_ATTRIBUTE_SYSTEM 4 (0x4) | A file or directory that the operating system uses a part of, or uses exclusively. |
FILE_ATTRIBUTE_HIDDEN은 단독으로 사용되는 경우, 숨긴 항목에 표시되며 속성창을 통해 설정이 가능합니다. 하지만 FILE_ATTRIBUTE_SYSTEM이 추가로 설정되면 설정 및 숨긴 항목에도 표시되지 않습니다.
POC Code
분석한 내용을 바탕으로 해킹툴과 동일하게 동작하는 코드를 개발하였습니다. 전체 소스코드는 GitHub에 업로드하였습니다. 적용 시 시스템 파일로 변경되며 일반적인 탐색기에서는 확인이 불가능합니다.
1
2
3
4
5
6
7
8
// HideFile.exe [Path]
int _tmain(int argc, const TCHAR* argv[])
{
SetFileAttributes(argv[1], FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
printf("success hide.");
system("pause");
}