《恶意代码分析实战》实验——Labs-06

《恶意代码分析实战》实验——Labs-06

记录《恶意代码分析实战》中的实验,提供相关链接:

Labs-06-1实验

  1. 由main函数调用的唯一子过程中发现的主要代码结构是什么?
    1)选中main函数,然后右键查询出它的交叉引用图
    在这里插入图片描述在这里插入图片描述
    2)找到sub_1000函数,进入该函数进行分析;发现调用函数InternetGetConnectedState函数,同时还有“Success…”和“Error…”的字符串,那么猜测此过程是进行一个连网检测。
    在这里插入图片描述
    3) 查看该过程的结构,鼠标邮件选择“Graph View”;一个CMP 然后一个跳转语句,则应该是个if语句。
    在这里插入图片描述

  2. 位于0x40105F的子过程是什么?
    1) 定位到此位置,发现有三处函数调用
    在这里插入图片描述
    2) 第一个和第三个函数为系统函数,先不管;重点关注第二个函数,先跟进去
    在这里插入图片描述
    3) 发现不太好理解,再用图模式来看看:
    在这里插入图片描述
    4) 这个函数太复杂了,不到万不得已,先不对它挨个分析。我们的目的是分析0x40105F处sub_40105F函数的功能,由于它调用的函数sub_401282太复杂;我们从它被调用的地方来分析,查看其他函数对它的交叉引用,选中sub_40105F,然后按X健,就找到对它调用的地方:
    在这里插入图片描述
    5) 凑巧,这两次调用都是在同一个函数sub_401000中,刚好这个函数在第一个问题中被我们分析过,进入图模式:
    在这里插入图片描述
    6) 发现两次调用都在sub_401000函数的if判定连网的条件中,也就是说不管是否联网都会调用这个函数,同时这两处调用都是将字符串作为参数传递给了函数sub_40105F,我们猜测它是一个字符串打印函数同时还可能附加其他功能(比如发送数据包等)。

  3. 这个程序的目的是什么?
    1) 使用peid进行分析,查看它的导入函数表,发现WININET.DLL中调用了InternetGetConnectedState函数,在Kernel32.dll的函数中并没有其他可疑的函数
    在这里插入图片描述
    2) 结合前面IDA的分析,我们猜测此程序的功能:获取该主机当前网络的连接状态

Labs-06-2实验

  1. Main函数调用的第一个子过程执行了什么操作?
    1) 先进行静态分析
        Strings搜索字符串:发现一些成功和错误的提示字符串,还要一个网址和IE浏览器的版本,猜测可能利用IE浏览器访问目标网址。
    在这里插入图片描述
       Peid进行导入函数分析:发现WININET.DLL库中调用URL访问网址和网络连接状态的函数;KERNEL32.DLL函数中调用了获取当前进程列表等其他无明显恶意操纵意图的函数
    在这里插入图片描述
    2) IDA分析,第一个子过程就是第一个子函数的调用,定位到0x401000
    在这里插入图片描述
    3) 发现该函数就是Lab-06-1实验分析的函数,该过程进行网络连接状态的获取
    在这里插入图片描述
  2. 位于0x40117F的子过程是什么?
    定位到目标地址,该过程和Lab-06-1分析的一样,该函数应该是一个字符串打印函数。
    在这里插入图片描述
    在这里插入图片描述
  3. 被main函数调用的第二个子过程做了什么?
    1) 定位到第二个子函数(子过程)
    在这里插入图片描述
    2) 跟进此函数,发先该函数调用了我们前面用PEID分析的导入WININET.DLL中的函数,也就是说此函数的功能是进行连网操作,向目标网址发送请求。
    在这里插入图片描述
  4. 在这个子过程中使用了什么类型的代码结构?
    1)用图模(Graph view)式对此部分代码进行分析,此过程一个有11个模块
    在这里插入图片描述
    2)从第一个开始分析,该处的跳转是将InternetOpenUrlA函数的返回值与0比较,然后进行跳转,那么此处应该是一个if语句用于判定指定URL请求的结果。
    在这里插入图片描述
    3) 与第一个跳转类似,只不过换了一个函数而已,也是一个if结构语句
    在这里插入图片描述
    4)模块3、4、5、6均采用相同的跳转结构,应该是一个多层if嵌套语句,其中的比较内容分别是字符“<”, “!”,“-”,“-”;这些比较的变量在内存中又是紧挨着的,那么我们猜测者个部分可能是一个字符串匹配过程,匹配的目标是 “<!–”。在第2模块中使用了函数InternetReadFile函数来进行比较,它的两个分支分别转到8和3。其中在模块8中会打印字符串“Error…”,很明显是读取网络数据失败;那么相反地,模块3后面的模块就是网络数据读取成功的逻辑,再结合前面的分析,模块3、4、5和6分支是对读取的网络数据进行字符串“<!–”匹配。等等,网络数据,字符串“<!–” 不就是常见网络数据html的注释符么,那么猜测此部分的功能是对获取的网络数据进行格式检查,检测是否是html文件。
    在这里插入图片描述在这里插入图片描述
  5. 在这个程序中有任何基于网络的指示吗?
    1) 访问访问恶意网址“www.practicalmalwareanalysis.com”
    2) 从该网址获取html文件
    结合前面几个问题的回答,我们可以总结出该程序会通过IE 7.5版本的浏览器访问恶意网址“www.practicalmalwareanalysis.com” 然后从其中获取html文件。
  6. 这个恶意代码的目的是什么?
    结合前面的分析,我们指导该程序的目的是
    1) 获取当前计算机的网络连接状态
    2) 如果连接正常则向恶意网址发送请求
    3) 从恶意网址获取html文件

Labs-06-3实验

静态分析:

  1. 先查壳:无壳 C++ 6.0编写
    在这里插入图片描述
  2. 用PEID进行导入函数分析,三个dll中重要的导入函数分别有
    KERNEL32.dll:创建文件夹、复制文件、删除文件、结束进程、获取系统版本、
    WININET.dll:当前网络状态判定、打开和读取网络文件、利用URL进行网络访问
    ADVAPI32.dll:打开和修改注册表
    在这里插入图片描述
  3. Strings分析其中的字符串,根据这些字符串猜测此程序可能的功能:
    I) 进行网络状态检查
    II) 进行网络连接,向指定的网址发送请求获取指定的文件
    III) 修改注册表
    IV) 恶意程序自启动
    在这里插入图片描述

问题回答

  1. 比较在main函数与6-2的main函数的调用,此main函数调用新的函数是什么?
    回答: 新的函数是 sub_401130
    在这里插入图片描述

  2. 这个新的函数使用的参数是什么?
    回答: 使用了两个参数:分别是一个字符——请求网络文件的第五个字符,一个文件的文件名——当前程序的文件名。
    1)进入该函数进行分析
    在这里插入图片描述
    2) 分析该函数的调用过程:
    在这里插入图片描述
    3) 发现两个函数分别是由变量var_8和argv决定。往前追溯发现,argv是main函数的参数,也就是当前运行程序的文件名;var_8是由函数sub_401040决定.
    在这里插入图片描述
    4) 进入函数sub_401040进行分析,发现这就是Labs-06-2中第4个问题中分析的函数;看看此函数最后对eax的修改,发现除了模块9对al操作外,其他模块均会将al清零,所以返回的内容取决于模块9。
    在这里插入图片描述
    5) 我们在Labs-06-2中第4个问题中分析了该函数的模块3、4、5和6分支是对读取的网络数据进行字符串“<!–”匹配。,其中的模块8和10均会打印字符串“ Error… “,说明它们都是读取文件失败或者匹配失败的逻辑,那么模块9就是正确读取文件后的逻辑。
    在这里插入图片描述
    6) 我们再看看模块9,al 赋值的变量和模块3、4、5和6 的变量很相似,跟进去发现它们处于内存中相邻的地址,根据之前的分析,我们猜测它应该是一个数组;模块9应该是该数组的第5个字符。
    在这里插入图片描述
    因此函数的另一个字符参数就是获取的网络文件的第五个字符

  3. 这个函数主要的代码结构是什么?
    回答: Switch语句
    用图模式分析这个函数,IDA已经明确地分析出这是一个switch语句。
    在这里插入图片描述
    在这里插入图片描述

  4. 这个函数能够做什么?
    回答: 能够在指定文件夹下复制恶意文件并且修改注册表进行自启动。
    1) 分析switch跳转前的功能,传入函数的字符arg_0被赋值为局部变量var_8,然后赋值给ecx,然后减去0x61h (其实是字符“a“),然后根据减去的结果进行switch跳转。
    在这里插入图片描述
    2) 在witch的跳转中,可以非常明显地分辨出左边是具体的跳转,右边是默认的跳转(即defaults)
    3) 分析左边的具体分支的功能
    在这里插入图片描述
    4) 第一个分支,调用CreateDirectoryA进行指定路径文件夹(C:\Temp)的创建
    在这里插入图片描述
    5) 第二个分支,调用CopyFileA函数,并且利用了传入的第二个参数(此应用程序的文件名),说明此分支是在指定路径下(C:\Temp\cc.exe)进行恶意程序的自我复制。
    在这里插入图片描述
    6) 第三个分支,调用函数DeleteFileA,其中的参数(路径)是“C:\Temp\cc.exe “;程序会进行指定程序删除。
    在这里插入图片描述
    7) 第四个分支,调用函数RegOPenKeyExA和RegSetValueExA,根据其中的字符串可以轻松的判定出,此分支将修改注册表将恶意程序(C:\Temp\cc.exe)设置为自启动。
    在这里插入图片描述
    8) 第五个分支,进行睡眠,十六进制0x186A0h的十进制是100000,也就是说会睡眠100秒。
    在这里插入图片描述

  5. 这个恶意代码在有什么本地特征吗?
    1) 注册表的键和值,因为添加了注册启动项。
    2) 指定路径下的文件——“C:\Temp\cc.exe “

  6. 这个恶意代码的目的是什么?
    1) 首先对目标计算机的网络状态进行判断,如果没有网络连接则直接推出,
    2) 如果有网络连接,则向指定网址发送请求并且获取指定网页
    3) 根据获取的网页内容进行程序在指定路径下进行自我复制和开机自启动设置

Labs-06-4实验

    偷了个懒 ~ (* ^ _ ^ *) ~
    请参考i春秋由相关实验的视频 教程

猜你喜欢

转载自blog.csdn.net/weixin_39561364/article/details/108851433