用瑞星好长时间了,用久了,就产生思考了:开机杀毒是怎么回事呢?杀毒软件是怎么实现在系统启动的时候在Blue Screen上写东西的呢?
前几天偶然在网上发现一篇文章《Inside Native Applications》,我恍然大悟。
我们知道在windows下写程序,无非就是两种程序,一种是应用程序,一种是驱动程序。其实还存在第三种程序:Native Application。
Native Application使用native api,直接与系统内核交互;它的运行时机是在WINNT CORE启动之后,在驱动程序和WIN32等子系统加载之前运行。
Native api数量有限,而且大部分是undocumented,这些函数都封装在ntdll.dll中,可以用dependency walker查看一下,1300多其实也不少了,不是吗 :),还是能干很多事的:
PropertyLengthAsVariant
RtlConvertPropertyToVariant
RtlConvertVariantToProperty
RtlInterlockedPushListSList
RtlUlongByteSwap
RtlUlonglongByteSwap
wcspbrk
wcsrchr
wcsspn
wcsstr
wcstol
wcstombs
wcstoul
……
网上有本电子书叫做《Windows NT 2000 Native API Reference》,写了这些函数的介绍,有兴趣可以搜索看看。
Native application的入口函数不是main或winmain或DriverEntry,而是NtProcessStartup:
void NtProcessStartup(PSTARTUP_ARGUMENT Argument);
Native application自己不会返回,所以需要在NtProcessStartup的最后,自己结束线程:
NtTerminateProcess(NtCurrentProcess(), 0);
写native application其实也是很简单的:
void NtProcessStartup(PSTARTUP_ARGUMENT Argument)
{
NTSTATUS status;
status = ChangeHostName();
if (status != STATUS_SUCCESS)
{
swprintf(g_sMsg, L"[sxg] Change computer name failed\n");
PrintToBlueScreen(g_sMsg);
}
else
{
swprintf(g_sMsg, L"[sxg] Change computer name success\n");
PrintToBlueScreen(g_sMsg);
}
NtTerminateProcess(NtCurrentProcess(), 0);
}
1. 调用ntdll.dll中的函数,完成你想要的功能
2. 利用DDK进行编译,以下是makefile和sources的内容
MAKEFILE文件:
!INCLUDE $(NTMAKEENV)\makefile.def
SOURCES文件:
TARGETNAME=hostnamex
TARGETPATH=obj
TARGETTYPE=PROGRAM
INCLUDES=$(DDK_INC_PATH)
SOURCES= hostnamex.c
编译生成可执行程序,此处为hostnamex.exe
3. 将hostnamex.exe拷贝到系统的system32目录中
4. 修改注册表值HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute,增加字符串hostnamex
重新启动之后,我们的native application就会运行了:
回到前文瑞星的问题上来
瑞星的开机杀毒程序其实就是一个native application:
在system32目录下可以找到相关的两个文件:Bsmain.exe和Bsmain.ini;在注册表
HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute中会发现bsmain
利用dependency walker可以看出bsmain.exe调用了ntdll.dll中的函数列表:
LdrGetDllHandle
LdrGetProcedureAddress
LdrLoadDll
LdrUnloadDll
NlsMbCodePageTag
NtCurrentTeb
NtDelayExecution
NtDisplayString
NtQueryInformationProcess
NtTerminateProcess
RtlAllocateHeap
RtlAnsiStringToUnicodeString
RtlCompareString
RtlCompareUnicodeString
RtlCreateHeap
RtlDeleteCriticalSection
RtlDestroyHeap
RtlDetermineDosPathNameType_U
RtlDosPathNameToNtPathName_U
RtlEnterCriticalSection
RtlFreeAnsiString
RtlFreeHeap
RtlFreeUnicodeString
RtlInitAnsiString
RtlInitUnicodeString
RtlInitializeCriticalSection
RtlLeaveCriticalSection
RtlNtStatusToDosError
RtlQueryEnvironmentVariable_U
RtlRaiseException
RtlReAllocateHeap
RtlUnicodeStringToAnsiString
RtlUnwind
RtlxAnsiStringToUnicodeSize
RtlxUnicodeStringToAnsiSize
ZwAllocateVirtualMemory
ZwClose
ZwCreateFile
ZwCreateKey
ZwCreateSection
ZwDeleteKey
ZwDeleteValueKey
ZwEnumerateKey
ZwEnumerateValueKey
ZwFlushKey
ZwFreeVirtualMemory
ZwMapViewOfSection
ZwOpenFile
ZwOpenKey
ZwQueryDirectoryFile
ZwQueryInformationFile
ZwQueryKey
ZwQuerySystemInformation
ZwQueryValueKey
ZwReadFile
ZwSetInformationFile
ZwSetValueKey
ZwUnmapViewOfSection
ZwWriteFile
_alldiv
_atoi64
memchr
memcpy
memmove
memset
strcat
strcmp
strlen
strrchr
wcslen
wcsrchr
wcstombs
杀毒软件,究其原理:一个完备精炼的病毒库,一个高效的搜索引擎和匹配算法。归到最后其实就是上边的一个函数strcmp呵呵,不知道大家有何高见。
值得注意的是,native application需要自行进行堆的管理。
NtDisplayString就是用来往蓝色屏幕上打印东西的函数。
Native application的权限是很高的,访问资源基本上没有什么限制,像Partition Magic等一些磁盘管理程序都会用到这类程序。
本文抛砖引玉,希望能对大家认识Native Application有所帮助。