2020-2021 恶意代码 20181230实验五——动静态联合调试
实践目标:
部分一:
1.将样例代码上传到在线杀毒中心进行分析并查看报告,从报告可以看出什么信息?
2.这个文件是否加壳了?如果加壳了,请进行脱壳;
3.有没有导入函数能够暗示出这个程序的功能?如果有,你认为是哪些函数,从这些函数你可以得到什么信息?
4.有没有什么线索可以被用来在被感染主机上进行该恶意代码的查找?
5.这个文件的作用可能是什么?
部分二:
1.当计算机重启后,这个程序如何确保它继续运行;
2.为什么这个程序会一直使用一个互斥量;
3.可以用来检测这个程序的基于主机特征是什么;
4.检测这个恶意代码的基于网络特征是什么;
5、这个程序的目的是什么;
6、这个程序什么时候完成;
实践过程:
部分一:Lab01-02.exe
将Lab01-02.exe文件上传至http://www.VirusTotal.com/进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗?
分析报告如下


69家机构有50个显示存在恶意代码,并且显示进行了upx加壳。
下面是该病毒的一些特征:

由上图可以得出该病毒具有一下特征:
Trojan/Win32.StartPage.C26214 修改浏览器主页
Trojan Clicker 木马点击病毒
Trojan Generic:拥有与特洛伊木马病毒疑似功能的代码;
TR/Downloader.Gen 有下载功能
malware.gen 记录键盘输入,并传出
问题二:
是否有这个文件被加壳或混淆的任何迹象?如何是这样,这些迹象是什么?如果该文件被加壳,请进行脱壳,如果可能的话。
通过PEiD的检测,检测结果为Nothing Found。即没有找到壳,这种情况可能有两种原因:1.该程序没有加壳;2.该程序加壳了,但该壳比较新,该软件检测不出来。

但注意到了EP Section中的标识为UPX1,说明这个exe文件很可能用了一个UPX技术的变种,所以PEiD才会识别不出来.
然后我们用Dependency Walker,我们就会发现这个代码的导入表KERNEL32.DLL 中有两个函数LoadLibraryA,GetProcAddress.这两个函数都是加壳的迹象,因为加壳的程序运行时候脱壳是必须要这两个函数的。

下面再使用PE viewer进一步检测:



首先该程序的节部分很奇怪,显示的是UPX0,UPX1,UPX2.而不是常见的.text .data .rdata .rsrc,很明显这是UPX加壳后的表现.下面通过虚拟大小与原始数据大小的对比就能发现端倪。
| 分节 | 虚拟大小 | 原始数据大小 |
|---|---|---|
| UPX0 | 00004000 | 00000000 |
| UPX1 | 00001000 | 00000600 |
| UPX2 | 00001000 | 00000200 |
在IMAGE_SECTION_HEADER UPX0中可得出Virtual Size 为00004000 Size of Raw Data为00000000, 所以Virtual Size 比Size of Raw Data大
且IMAGE_SECTION_HEADER UPX1和IMAGE_SECTION_HEADER UPX2中的也是Virtual Size比Size of Raw Data大,所以可以确定该程序被加壳了.
并通过查资料该程序可能是UPX加壳,所以我们尝试一下脱壳:
使用UPX.exe进行脱壳,过程如下:
将Lab01-02.exe复制到upx所在文件夹下
命令行运行upx.exe

执行命令:upx -d Lab01-02.exe进行脱壳,显示成功。

再把已脱壳的文件放到http://www.VirusTotal.com/进行分析并查看报告,可以发现文件以及脱壳了。

问题三:
有没有任何导入函数能够暗示这个程序的功能?如果有,是哪些导入函数,它们会告诉你什么?
现在我们继续对脱壳后的程序分析,使用Dependency Walker对该程序进行分析:

由上图可以看见该程序共有四个动态链接库:
KERNEL32.DLL ADVAPI32.DLL MSVCRT.DLL WININE.DLL
KERNEL32.DLL

SystemTimeToFileTime 是一个进程,即系统时间本地时间。
GetModuleFileNameA 获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载。
CreatWaitableTimerA 创建计时器对象
ExitProcess 退出程序
OpenMutex 打开互斥
SetWaitableTimer 启动一个可等待计时器
WaitForSingleObject
CreatMutex 创建一个互斥体
CreatThread 创建一个线程
ADVAPI32.DLL

Advapi32.dll,使用了注册表,提醒我们注意程序中象注册表键值的字符串,还有服务管理.可能会恶意关闭一些服务是某些程序不能运行,或者自动开启一些服务。
CreateServiceA 创建一个服务对象,并将其添加到指定的服务控制管理器数据库
StartServiceCtrlDispatcherA 调用服务程序
OpenSCManagerA 建立一个连接到服务控制管理器并打开它的数据库
WININET.DLL

WININE.DLL使用了网络服务,InternetOpenUrl,可以访问网站,这里值得警惕,该恶意木马可能会通过访问网络下载更多病毒,或者实时监控该主机,InternetOpenA 初始化一个应用程序
问题四:
有没有什么线索可以被用来在被感染主机上进行该恶意代码的查找?
使用Strings.exe查看脱壳的程序,内容如下:

出现可疑的URL: www.malwareanalysisbook.com 还有IE8.0 推测应该是使用IE打开该网站
猜测可以通过查看浏览器浏览记录来推测是否有感染的可能。
问题五:
这个文件的作用可能是什么?访问一个非法网站
部分二:Lab07-01.exe
利用PEID分析目标程序导入函数:

ADVAPI32.dll:
两个API函数:
CreateServiceA
OpenSCMangerA
推测是创建一个服务来保证系统启动后也能继续运行——问题1。
WININET.dll:
InternetOpenUrlA
InternetOpenA
推测程序会连接一个网站
利用IDApro进行分析
main函数:

API 函数:
StarServiceCtrIDispatcherA:用于实现服务,决定服务控制管理器所调用的服务控制函数(这里是sub_401040),sub_401040在StarServiceCtrIDispatcherA被调用完后再被调用。
双击打开sub_401040

首先调用OpenMutexA函数,该函数会尝试获取名为HGL345互斥量的句柄,如果互斥量存在则调用ExitProcess结束程序,如果不存在则按照右边的流程继续执行程序。
如果互斥量不存在则在该流程中会先调用CreateMutexA创建名为HGL345的互斥量,该互斥量是该恶意程序的一个本地特征,通过该互斥量以及这些函数通过图中的编码方式是为了保证在任意时刻在夕惕若只有一个该程序运行。

OpenSCManagerA函数用于打开一个服务控制管理器,以便于该程序可以添加和修改服务,接着调用GetCurrentProcess来获取当前进程的伪句柄(可以被复制,但不能被继承,而且在程序最后不需要调用closehandle来关闭句柄)
GetModuleFileNameA:获取当前所运行程序的完整路径。获取之后调用CreateServiceA,用来创建一个新的服务。
三个特别重要的参数:

lPBinaryPathName:用于保存获取的当前所运行程序的完整路径,用于服务的安装。
dwStartType:服务的启动选项,这里是2,对应ServiceAutoStart,意思是服务会系统启动时自动运行。
dwserviceType:服务的类型,这里是10h,表明该服务运行于独立进程的服务程序。
服务名称为:Malservice
综上所述:该程序会创建一个名为Malservice的服务来保证在每次系统启动后可以自动运行,从而到达持久化的驻留。

edx先自我异或以到达置零的效果,方便后续赋值操作。
SystemTime:windows一个关于时间的结构体。wYear,wDayOfWeek,wHour,wSecond
分别是年,星期,小时,秒,将这四个变量设置为0(edx),之后将年赋值为834h,换10进制为2100,即2100年。这些赋值下来意思为2100年1月1日的0点0分0秒。之后调用SysTimeToFileTime将系统的时间转换为文件的时间。
三个API函数:
CreateWaitableTimerA,SetWaitableTimer,WaitForSingleObject。
而SetWaitableTimer存在一个IpDuetime参数,为SysTimeToFileTime返回的FileTime(文件的时间),即需等待到的时间。然后调用WaitForSingleObject函数,进入等待,一直等待到上面所设置的2100年1月1日的0点0分0秒才继续执行。

到达时间继续执行后,存在一个名为esi的计数器,将14h(十进制20)赋值给esi。并且循环最后esi会自减(dec esi),即循环执行20次。
在循环里程序调用CreateThread创建线程函数,其中lpstartaddress参数会显示那些函数会在线程创建后得到执行。
双击打开lpstartaddress

程序首先调用InternetOpenA来初始化一个网络连接,接着执行循环,在循环中调用InternetOpenUrlA,循环最后有一个无条件跳转jmp跳转到loc_40116D即该循环的起始位置,进行无限循环,不会终止,即一直不停的调用InternetOpenUrlA函数来访问图中的网址。并且是启用20个线程不断访问该网址。
综上所述这是一个典型的DDoS攻击(分布式拒绝服务攻击)。
浙公网安备 33010602011771号