瑞星开机杀毒实现原理

用瑞星好长时间了,用久了,就产生思考了:开机杀毒是怎么回事呢?杀毒软件是怎么实现在系统启动的时候在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有所帮助。


文章来自: 本站原创
Tags:
评论: 1 | 查看次数: 10135