zoukankan      html  css  js  c++  java
  • 开机杀毒实现

    用瑞星好长时间了,用久了,就产生思考了:开机杀毒是怎么回事呢?杀毒软件是怎么实现在系统启动的时候在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的入口函数不是mainwinmainDriverEntry,而是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进行编译,以下是makefilesources的内容

    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.exeBsmain.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有所帮助。

  • 相关阅读:
    Jooq基本操作
    SpringcloudStream简单使用
    SpringcloudBus消息总线
    RabbitMQ集群
    Springboot整合RabbitMQ
    RabbitMQ死信队列与延迟队列
    RabbitMQ事务性消息和确认模式
    公链简介
    公链简介
    Windows生产力工具推荐
  • 原文地址:https://www.cnblogs.com/Safe3/p/1330171.html
Copyright © 2011-2022 走看看