首页
论坛
课程
招聘
[原创]恶意程序分析-去除恶意程序混淆-学习记录
2021-6-14 10:34 4688

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

2021-6-14 10:34
4688

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

一;什么是混淆?

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

二;如何去除混淆?

    2.1;去除混淆原理


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

    2.2;案例调试

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

    

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

    

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

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

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

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

    

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

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

    

三;分析混淆程序

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

    3.1;复制程序

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

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

  • 在“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”位置得值加一,用来表示第二个值。如此循环。

    逻辑图如下:

    源数据内容:

    目标数据内容:

    3.2;解密程序

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

    

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

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

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


  总结:

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

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

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


N;学习课程


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

最后于 2021-6-14 13:40 被天象独行编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 124
活跃值: 活跃值 (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
透明色 活跃值 2 2021-6-27 09:25
2
0
直接 hook  VirtualProtect()  , 屏蔽掉  PAGE_EXECUTE_  , 让程序在执行入口的时候断下来 不就可以了 ?
雪    币: 1220
活跃值: 活跃值 (3780)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-6-27 12:35
3
0
透明色 直接 hook VirtualProtect() , 屏蔽掉 PAGE_EXECUTE_ , 让程序在执行入口的时候断下来 不就可以了 ?
受教了。谢谢
雪    币: 230
活跃值: 活跃值 (267)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wx_全都怪我 活跃值 2021-6-28 18:55
4
0
这不是姜晔的课程内容吗
雪    币: 1220
活跃值: 活跃值 (3780)
能力值: ( LV11,RANK:185 )
在线值:
发帖
回帖
粉丝
天象独行 活跃值 2 2021-6-28 21:30
5
0
wx_全都怪我 这不是姜晔的课程内容吗[em_4]
是啊,我不是把课程贴出来了嘛?
游客
登录 | 注册 方可回帖
返回