Target Eye是一款在2000年开发,直至2010年停止更新的系统。本文将详细介绍Target Eye的文件隐藏机制,以及如何通过特定的函数来隐藏或显示文件。
Target Eye的文件隐藏功能主要依赖于TEHideFile()函数。该函数能够根据用户的需求,隐藏或显示文件,并且能够改变文件的大小,使其难以被检测。
TEHideFile()函数通过设置文件属性来实现隐藏或显示文件。它接受三个参数:文件的完整路径和名称、是否隐藏文件、以及是否改变文件的大小。
BOOL TEHideFile(CString FileName, BOOL Hide, BOOL RandomSize);
如果设置为隐藏,函数会创建一个具有系统和隐藏属性的新文件;如果设置为显示,则创建一个普通文件。此外,如果随机大小参数为真,函数会在文件末尾添加随机数据,改变文件的大小。
Target Eye采用了一种相对古老的方法来隐藏文件,它创建了一个类似于系统文件的隐藏文件。这种方法在Windows XP时代非常有效,但在Windows 7和8中,即使用户勾选了"显示隐藏的文件、文件夹和驱动器"选项,Target Eye隐藏的文件也不会显示。
要显示这些隐藏的系统文件,用户需要打开文件夹选项对话框。在Windows 8中,用户需要在搜索框中输入"显示隐藏的文件夹"并按下回车键。然后,用户需要取消勾选"隐藏受保护的操作系统文件"选项,并在弹出的警告对话框中点击"是"。
TEHideFile()函数的源代码如下:
BOOL TEHideFile(CString FileName, BOOL Hide, BOOL RandomSize)
{
HANDLE g_hCapFile;
DWORD dwBytes;
ULONG FileLen;
FileLen = GetFileLen(FileName);
if (FileLen == 0) return (FALSE);
g_hCapFile = CreateFile((char*)FileName.GetBuffer(0), GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL, NULL);
if (g_hCapFile == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
char *buffer = (char*)malloc(FileLen);
memset(buffer, '\0', FileLen);
ReadFile(g_hCapFile, buffer, FileLen, &dwBytes, NULL);
CloseHandle(g_hCapFile);
DeleteFile(FileName);
if (Hide)
g_hCapFile = CreateFile((char*)FileName.GetBuffer(0), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL);
else
g_hCapFile = CreateFile((char*)FileName.GetBuffer(0), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (g_hCapFile == INVALID_HANDLE_VALUE)
{
return (FALSE);
}
if (!(WriteFile(g_hCapFile, buffer, FileLen, &dwBytes, NULL)))
{
free(buffer);
CloseHandle(g_hCapFile);
return (FALSE);
}
if (RandomSize)
{
int x;
char *temp;
x = (int)((double)rand() / (double)RAND_MAX * 8630.0) + 3201;
temp = (char*)malloc(x);
if (temp)
{
int i;
for (i = 0; i < x; i++) *(temp+i) = (int)((double)rand() / (double)RAND_MAX * ((int)'z' - (int)'a' + 1)) + (int)'a';
if (!(WriteFile(g_hCapFile, temp, FileLen, &dwBytes, NULL)))
{
free(temp);
free(buffer);
CloseHandle(g_hCapFile);
return (FALSE);
}
free(temp);
}
}
free(buffer);
CloseHandle(g_hCapFile);
return (TRUE);
}
GetFileLen()函数用于获取文件的长度,以便在隐藏文件时能够正确地读取文件内容。
ULONG GetFileLen(CString FileName)
{
DWORD dwBytes;
HANDLE g_hCapFile;
if (FileName == "")
return (0);
g_hCapFile = CreateFile((char*)FileName.GetBuffer(0), GENERIC_READ, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL);
if (g_hCapFile == INVALID_HANDLE_VALUE)
return (0);
dwBytes = SetFilePointer(g_hCapFile, 0, NULL, FILE_END);
CloseHandle(g_hCapFile);
return (dwBytes);
}
要了解全局API钩子,可以阅读ApriorIT的文章《Easy way to set up global API hooks》。如果对内核级隐藏感兴趣,可以通过驱动程序实现,例如SSDT/IDT表操作。