zoukankan      html  css  js  c++  java
  • 恶意代码分析入门系列之 基础知识

    0x00 前言

    在第一小节完成了环境的搭建,成功搭建好了一个可用于恶意样本分析的虚拟机环境,在这小节,先介绍一些关于恶意样本的相关知识,也算是为恶意样本分析做准备。

    首先,我没有写详细的汇编教程,论坛中有非常多的汇编教程,读者可以多多利用论坛的搜索功能,找到一些相关的知识点。大多数情况来说,遇到的问题之前都有人在论坛中求问过,只是措辞和询问的方式不一样,大家遇到问题的时候可以先利用论坛的搜索功能或结合google进行搜索。

    为了不让之后的内容过于抽象,在本小节中介绍基础的汇编知识。

    0x00 汇编基础内容

    寄存器相关

    简单来说,寄存器是CPU内部用于存放数据的小型存储区域,寄存器是内存与CPU能够交互的一个关键。

       以x86为例,常见的有8个通用寄存器。
    
        EAX    eax是累加器,在做加法和乘法运算的时候,eax是默认寄存器    
    
        EBX    ebx是基地址寄存器,通常被用于寻址    
    
        EXC    ecx是计数器,通常用于循环计数    
    
        EDX    edx通常用于存放除法运算产生的余数    
    
        ESI     esi是源寄存器,通常在字符串操作中使用
    
        EDI    edi与esi对应,edi表示目标寄存器    
    
        EBP    ebp是基址指针,通常用于指向栈底    
    
        ESP    esp是堆栈指针,与ebp对应,通常指向栈顶。
    

    还有一些特殊的寄存器,刚开始的时候不用掌握那么多,后面遇到再去学习就行。

    eax ebx exc edx 这四个寄存器,除了本身自带的一些功能,他们还常常被用于一些运算。
    开发人员可以直接使用一些汇编指令去操作这几个寄存器实现一些简单的功能,需要注意的是,eax寄存器还有一个存放函数返回值的功能。
    在大多数情况下,一个函数调用完成之后,返回值都会保存在EAX寄存器中

    后面的esi和edi通常会配合数据段寄存器DS来使用,通常情况下,我们不会动esi和edi的值。

    esp和ebp分别用于指向栈顶和栈底,是两个特别关键的寄存器。esp和ebp涉及到操作系统中一个最基础的概念"堆栈"。

    说是堆栈,其实是指栈,当我们描述堆的时候都会直接说堆。

    栈的原理其实很简单,从C语言的角度来看,栈是一种数据结构,先入后出。从计算机系统来看,栈是一个具有先入后出属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。可以说我们所见到的函数调用,基本上都是跟栈挂钩的。

    在一个函数开头,经常可以看到如下的语句来开辟新的堆栈:

        push ebp
    
        mov ebp,esp
    
        esp 40h
    

    0x01 恶意样本分类

    按文件类型分类

    主要分为

    PE文件(Windows平台可执行文件,如exe和dll文件)
    
    ELF文件(Linux平台下的可执行文件)
    office文档文件(注意2007版本是个分界点,07版本之前的文档文件本质是二进制文件,之后本质是压缩包)
    
    ps1文件(powershell脚本)
    
    js文件(JavaScript脚本)
    
    VBS文件(vbs脚本)
    
    bat文件(windows批处理文件)
    
    chm文件(微软帮助文档)
    
    lnk文件(链接文件)
    
    hwp文件(韩国office,类似于我国的wps)
    
    

    目前比较常见的好像就是这些,在Windows平台下,PE文件是攻击主流,其他的所有恶意样本都统称非PE,
    通常情况下,现在的样本的流行使用非PE加载PE的方式来攻击,
    原因是非PE的查杀相对PE来讲较为困难
    攻击者可以通过非PE文件在用户的计算机上设置计划任务等操作,来下载后续的PE文件到本地并执行。

    按行为来分

    主要分为

    Downloader(下载者)  此类木马的主要功能就是下载后续的攻击文件到本地继续执行,此类样本的特点就是小,通常来说,代码也比较简单,就是通过访问一个链接,下载文件保存到本地,然后通过一定的方法启动这个文件。
    Dropper(释放器),此类木马的主要功能是释放并执行后续的攻击文件。就攻击者可能会将恶意的程序加密成为一段数据,然后放到Dropper中,由Dropper解密释放并执行这个文件,这样做的目的是可以起到一定的免杀效果。
    窃密木马,此类木马的主要功能是收集本地主机的一些机密信息并打包上传,比如收集各大浏览器的缓存目录、隐私目录等,拿到用户保存的密码信息。或是收集本地主机的一些文档文件,最后加密上传到攻击者的邮箱服务器、FTP服务器等。
    远控木马,远控木马拥有对本地主机的控制权,可以随时通过下发控制指令实现不同的功能。属于在分析中很常见的木马,目前主流的远控木马大多都是由C#编写,并且很多是开源的商业马,在github都可以找到源码实现.
    Ransom(勒索病毒)
    Adware(广告类恶意软件),此类软件通常不像木马那样有侵犯用户隐私的危害,大多数是用于推广广告、篡改用户浏览器主页等。
    感染型木马,感染型木马较为特殊,遇见的也比较少,可以等后面找一个实际的感染型木马分析。
    
    

    0x02 恶意样本分析基本框架流程

    总的来说,样本分析是有一个固定套路的。

    通常来说流程如下:

    文件查壳(看文件是否有壳,有壳则需要脱壳)

    行为检测(通过行为检测工具,跑出样本的大致行为,通过此步骤,可以对样本的基本功能有个概要的了解,从而确定分析方向,比如在行为检测的时候,监控到样本运行后会访问某个域名,然后我们可以对这个域名进行查询,看该域名是否已经有公开的情报,是否被归类到了某个家族,确定这些信息之后,我们大概可以了解到本次分析的样本的基本类型,比如是下载者、是窃密的、还是远控的。)

    静态分析(静态分析分为导入表分析、字符串分析、代码分析、在导入表分析和字符串分析的时候,可以结合行为检测得到的结果)

    动态调试(通常来讲,阅读IDA的代码,是分析样本最快的情况,但有时候,一些较为复杂的解密运算、或是样本开辟了新内存等功能,需要使用调试器来协助分析)

    关联分析(在样本的基本功能分析完成之后,我们需要对样本做关联分析,通常来讲,大部分的样本都是有通信行为的,在关联分析的时候,通常就是以请求的域名、ip等信息进行关联)

    溯源分析(更深层次的对攻击者进行一个挖掘)

    总结分析报告

    0x03 WindowsAPI基础

    个人的一点感觉,学习逆向,开发技能可以不用掌握多少,但是开发思想是一定要有的。

    就一个功能,我们可以不用了解它的具体代码实现,但是我们需要了解它的实现思路。

    我在没事儿的时候,就经常会想,如果我要写一个远控木马,我应该具备哪些功能,这些功能要如何实现才能更好的提升攻击效率,以及不被检测到。如果我是攻击者,我想要攻击一个企业我需要做哪些准备,需要收集什么信息。想多了之后,在分析木马的时候往往会有意外之喜。

    如何辨别程序中的API
    目前来说,写木马的主流语言还是C和C++,虽然VB和C#的木马越来越多,但想要完全取代应该还有一段时间。其中VB的样本大多数都是Downloader,也就是作为攻击中的前置部分,用于下载后续的木马到本地执行。C#的样本多为远控。

    如何学习API

    个人的建议是一边分析,一边记录,然后多翻,多看。

    有一定编程能力的,可以自己尝试写一些恶意的操作,如文件夹遍历,收集本地信息上传这样的功能。在编写的时候就需要调用很多WindowsAPI函数,在这个过程中,就可以很好的掌握这些API的参数、返回值等信息。

    如果对编程不是很熟悉的,可以直接分析样本,遇到里面用的API,就去查询它的功能、参数、返回值等。

    所有的WindowsAPI都可以在微软的官方手册上找到对应的注解

  • 相关阅读:
    Codeforces Round #534 Div. 1
    Codeforces Round #540 Div. 3 F2
    Educational Codeforces Round 60 Div. 2
    Luogu4389 付公主的背包(生成函数+多项式exp)
    BZOJ1005 HNOI2008明明的烦恼(prufer+高精度)
    Codeforces Round #539 Div. 1
    js --- 关于DOM的事件操作
    js函数
    js常用内置对象
    js数据类型转换 ----流程控制
  • 原文地址:https://www.cnblogs.com/socialbiao/p/15677664.html
Copyright © 2011-2022 走看看