• 《恶意代码分析实战》读书笔记 入门与基础


    本书前三章是对简单的恶意代码静态分析基础技术的概述,是分析恶意代码学习的入门。

    第零章 恶意代码分析技术入门


    第一章 静态分析基础技术

    1. 字符串Strings

    • 存储形式:ASCII或Unicode

        - ASCII		每个字符1字节
        - Unicode	每个字符2字节
      
    • Strings搜索程序:忽略上下文和格式,从整个文件中检测可打印字符串。

    • 用户:过滤无效字符串,通过有意义的字符串获得一些简单代码的信息。

    2. 文件加壳与PEiD

    • 混淆程序:恶意代码编写者尝试隐藏其执行过程的代码。

    • 加壳程序:混淆程序的一类。被压缩或加密,显露的字符串很少,直接分析困难。

        加壳或混淆代码通常至少会包含LoadLibrary和GetProAddress函数,用于加载和使用其它函数功能。
      

    3. PE文件格式

    PE文件格式是Windows可执行文件、对象代码和DLL所使用的标准格式。
    
    PE 文件结构 DOS 文件头
    PE 文件头
    区块表
    区块
    调试信息
    • PE文件格式实际上是一种数据结构,包含为Windows操作系统加载器管理可执行代码所必要的信息。

    • PE是指Windows系统下32位可执行文件,以一个文件头开始,其中包括代码信息,应用程序类型,所需的库函数与空间要求。

    • PE文件中常见的分节:

        .text:包含了CPU的执行指令,正常是唯一包含代码的节。
        .rdata:通常包含导入导出的函数信息,还可以存储程序中的其他只读数据。
        .data:包含了程序的全局数据 (本地数据并不存储在这里)。
        .rsrc:包含可执行文件使用的资源,内容并不执行,例如图标、菜单项、字符串等
        .reloc:包含用于重定位文件库的信息
        .pdata:只在64位可执行文件中存在,存储异常处理信息
      
    • PE文件格式详解示意图

      图片来源:吾爱破解论坛 > 软件安全 > 脱壳破解区 > PE文件结构图

    4. 链接库与函数

    对一个可执行程序,可以搜集到的最有用的信息之一就是:导入表。
    程序员将一些导入函数和代码库链接到编写的主程序中。
    

    (1)静态链接

    • Windows平台上不常用,Unix和Linux程序中比较常见。
    • 库被静态链接时,所有这个库中的代码都会被复制到可执行程序中。
    • PE文件头中没有迹象——难以区分静态链接的代码和可执行程序自身代码。

    一些Windows API允许程序员导入没有在程序的文件头中列出的连接函数。
    
    • 最为常见的就是:LoadLibraryGetProcAddress
    • 允许一个程序访问系统上任何库中的任何函数。

    (2)动态链接

    • 最常见、最应该关注。
    • 库被动态链接时,宿主操作系统会在程序被装载时搜索所需的代码库,如果程序调用了被链接的库函数,这个函数会在代码库中执行。
    • PE文件头中存储了每个将被装载的库文件,以及每个会被程序使用的函数信息。

    (3)常见的dll程序

    DLL描 述
    Kernel32.dll常见,包含核心系统功能,如访问和操作内存、文件和硬件
    Advapi32.dll提供对核心Windows组件的访问,如服务管理器和注册表
    User32.dll包含所有用户界面组件,如按钮、滚动条以及控制和响应用户操作的组件
    Gdi32.dll包含图形显示和操作的函数
    Ntdll.dllWindows内核接口,可执行文件一般通过Kernel32.dll间接导入。说明作者企图使用非正常Windows函数,如隐藏功能和操作进程等任务
    Wsock32.dll联网DLL,执行访问网络操作或相关任务
    Ws2_32.dll
    Wininet.dll包含更高层次的网络函数,实现了如、FTP、HTTP和NTP协议
    • 函数命名约定(前缀或后缀)

        Ex:管理层,Ex是Executive的开头两个字母。
        
        Ke:核心层,Ke是Kernel的开头两个字母。
        
        Hal:硬件抽象层,Hal是Hardware Abstraction Layer的缩写。
        
        Ob:对象管理,Ob是Object的开头两个字母。
        
        Mm:内存管理,Mm是Memory Manager的缩写。
        
        Ps:进程(线程)管理,Ps表示Process。
        
        Se:安全管理,Se是Security的开头两个字母。
        
        Io:I/O管理。
        
        Fs:文件系统,Fs是File System的缩写。
        
        Cc:文件缓存管理,Cc表示Cache。
        
        Cm:系统配置管理,Cm是Configuration Manager的缩写。
        
        Pp:"即插即用"管理,Pp表示PnP。
        
        Rtl:运行时程序库,Rtl是Runtime Library的缩写。
      

    (4)导入导出函数

    • 导入函数:一个程序所使用的但存储在另一个程序中的那些函数。
    • 导出函数:用来与其他程序交互时使用的函数

    DLL文件本身就是实现一些导出函数然后被exe可执行文件使用的,故其中导出函数多而常见。
    EXE文件中鲜有导出函数,若有,则应特别关注。
    

    5. 工具及实践

    参见计算机病毒实践总结一:简单静态分析


    第二章 在虚拟机中分析恶意代码


    参考资料

    参考资料1:Windows内核函数的命名
    参考资料2:从入门开始:恶意代码的那些事

  • 相关阅读:
    基础知识记录
    不同数据库'查询第几行到第几行记录'脚本的区别
    visual studio自动生成的私有内部字段变量以_为前缀
    ASP.NET Core 集成Prometheus+grafana
    netcore命令行运行程序
    RabbitMQ使用建议
    解决Pg新增数据主键冲突
    .Net Core调用第三方WebService
    .Net Core调用oracle存储过程
    call,apply,bind使用区别
  • 原文地址:https://www.cnblogs.com/hyq20135317/p/5368171.html
Copyright © 2020-2023  润新知