9

[原创]恶意程序分析-去除恶意程序混淆-学习记录

 2 years ago
source link: https://bbs.pediy.com/thread-268078.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
[调试逆向] [原创]恶意程序分析-去除恶意程序混淆-学习记录
2021-6-14 10:34 2068

恶意程序分析-去除恶意程序混淆-学习记录

一;什么是混淆?

    混淆说白了就是恶意程序的作者自己发明的一种壳。它会将想要隐藏执行的PE文件经过加密以后植入自身内部,当自身运行时候,对其执行解密操作并执行,于是就达到了隐藏运行的目的。

二;如何去除混淆?

    2.1;去除混淆原理

    恶意程序在解密去除混淆得过程中,一定会需要分配一个内存空间,那么可以在分配空间得函数下断点(例如:VirtualAlloc)。然后在带程序解密完成之后dump 出来。这样,我们就可以找出恶意程序得本体了。

    2.2;案例调试

    利用OD程序打开软件,并且在函数VirtualAlloc里面下断点。之后F9运行程序,程序会自动断在VirtualAlloc()位置。

    911429_X5PS7QP436DSV8W.jpg

    这里我们发现,它存在多个断点位置(VirtualAlloc多次调用),一般判断是否是解密混淆所需要得空间,可以通过划分得虚拟空间大致猜测判断。如下地址“7C809A81”划分空间224,一般意义得PE程序不会这么小。即排除。

    911429_UJBT7RGQ2RS2ZWQ.jpg

    地址“7C809AA2”划分空间903680,则,很有可能是一段PE程序需要得空间。

911429_5TYWSFCHTJ9Y4MN.jpg

    接下来,我们将光标定位到“7c809a99”,该位置是刚好执行完VirtualAlloc。执行完之后,将申请得空间地址返回至寄存器EAX。

911429_EQ7AS98T8K57JHT.jpg

    我们在“D00000”位置下硬件断点。之后执行程序,程序会断在试图修改该内存空间得位置。

911429_TJ6W7BPSNTVCBMM.jpg

    程序在如下位置,再次断开,经过分析,该段程序指令得作用,就是将混淆文件,加载到“D00000”位置。

    911429_772U73JQF6WJ6BE.jpg

    继续程序运行,至如下图位置,这个时候我们发现PE程序已经加密完成。

911429_ZHPG439E8A6H3Y5.jpg

    导出程序本体,(备份-保存数据到文件)

    911429_HN6DAP3PBCKCZMD.jpg

三;分析混淆程序

    首先,我们已经知道了,混淆程序执行了是两个功能,1;将程序复制到“D00000”位置。2;将"D00000"位置得程序解密。接下来,我们来分析,它是如何做到这两个功能得。

    3.1;复制程序

    我们先通过OD将程序定位到地址“0012F9D6”位置。这个时候,我们通过初步得单步执行,发现整个复制程序就在12f9cd~12f9f6之间循环。

911429_E3HHMTUAVSJKXWG.jpg

    通过初步观察,我们得到如下信息:

  • 在“12F9D3”位置,我们发现,该程序指令就是将数据放入“D00000”位置得指令,即拷贝目标地址在该程序中使用得是[eax+edi]表示得。

  • 由“12F9CD~12F9D3”位置我们发现,拷贝源是使用[ebp+ecx*4-0x54]来表示得。我们来看表达式ebp+ecx*4-0x54,很明显知道,随着ecx寄存器得值得变化,这将是一个偏移四个单位得变化。

  • “12F9D6~12F9DE”位置指令,我们发现,在将[ebp+ecx*4-0x54]得值放入目标地址当中之后,会立刻指向[ebp+ecx*4-0x54]下一个位置得值。

  • “12F9E2~12F6E6”这些指令得作用是,ecx 得值加一,用来表示循环得次数,通过cmp 得比较,我们知道,它会循环8次。并且会将值放入[ebp-0x8]位置存储,方便之后重新调用。

  • “12F9F0~12F9F6”我们知道,[ebx+0x10]位置保存得值是复制程序得大小,DEI当中得值就是用来限定复制多少进入目标地址。

    好了,经过分析,其实,我们大概知道了,复制得原理。大致如下:

  1. 第一轮复制,是将地址“12F66C~12F688”位置得值(间隔四个单位)作为地址,然后寻找内容然后放入目标空间,执行完成之后,立刻将12F66C~12F688”位置得值加一,用来表示第二个值。如此循环。

    911429_C26FF53SWP64T6F.jpg

    逻辑图如下:

    源数据内容:

911429_9DB7SC5S8MZUJ5J.jpg

    目标数据内容:

911429_38PU6RAAMURHQJV.jpg

    3.2;解密程序

    接着上面,我们继续F9,让他再次断点下来,(之前,我们在“D00000”位置下得断点,在解密得步骤中一定会再次涉及该位置,所以直接断点就可以),我们发现程序再次停在如下位置。

911429_453MCRVFA73TZV9.jpg    

    我们从“12FA08”位置开始查看,因为在下面“12FA2E”位置处得一个jb 指令得位置就是“12FA08”。我们有理由怀疑这是循环解密得程序。程序首先是将[ebp-0x8]位置得值放入寄存器EDI当中,我们发现该位置得值为0,结合下面“12FA13~12FA14”位置指令inc edi cmp edi,0xf 。可以合理得推测edi 在这里是扮演得一个计时器得角色。

911429_B5GMEXVC2DTFB7C.jpg

    紧接着,“12fa08~12fa0e”执行异或操作,结合edi 得计数器,我们可以想到在[edi+ebx]位置,16个数字依次参与运算。

911429_ZBXRUY8AXGURTSM.jpg

    [eax+edx]值得位置就是目标地址“D00000”。dl 得值即为相对“00D0 0000”得偏移。

911429_MNR3YZJ6N99PGJE.jpg

  • 程序通过两次异或来解密。

  • 第一次异或是从“D00000”原始数据,以行为单位,以16个数据为一组,分别与0x0053FA20中的0x0F个数据分别进行异或操作。

  • 第二次异或,是将刚才的这个异或结果与它所在的位置偏移进行异或,位置偏移只取最低一个字节的内容。于是就得到了最终的PE文件。

N;学习课程

911429_Q4MMAUHHFGPAFTQ.jpg

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-6-14 13:40 被天象独行编辑 ,原因:

上传的附件:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK