恶意代码分析实战 第十六章课后实验

恶意代码分析实战 第十六章课后实验

先来整体分析一下,

恶意代码分析实战 第十六章课后实验

整体看一下发现很多地方都调用了函数  sub_401000,也出现了很多fs:30h。下面分析一下函数sub_401000:

恶意代码分析实战 第十六章课后实验

 

在这里可以看到一个_exit,也就是离开,还调用了函数ShellExecuteA,我们可以使用OD来分析一下,使用OD跳转到地址004010DE,然后下个断点,执行一下:

恶意代码分析实战 第十六章课后实验

在堆栈窗口可以看到这里调用了cmd和一个del来进行自我删除。那么就可以推测这是一个不断进行验证的程序,只要有哪一次验证不成功程序就会退出。

下面分析一下第一处验证:

恶意代码分析实战 第十六章课后实验

这里判断了PEB结构中的BeingDebugged是否为0 ,若是0程序正常向下执行,若不是则调用函数sub_401000退出。

下面继续向下分析:

恶意代码分析实战 第十六章课后实验

这里查看了processheap的forceflag标志,值为0则说明没有在调试状态,

恶意代码分析实战 第十六章课后实验

这里查看了NTGlobalFlag,值为70h则表示是调试状态。

问题1:

恶意程序通过检查PEB中的BeingDebugged、ProcessHeap以及NtGlobalFlag标志的值,来判断自己是否处于调试状态。

问题2:

删除自身并终止运行。

问题3:

可以使用OD中的PhantOm插件。

问题4:

在OD中进行修改。

问题5:

PhantOm插件。

恶意代码分析实战 第十六章课后实验

问题1:

恶意代码分析实战 第十六章课后实验

发现要求输入4个字符。

问题2:

恶意代码分析实战 第十六章课后实验

随便输入了4个字符,提示为错误的密码,再试一次。

问题3:

byrr(经过最后的分析可知)

问题4:

恶意代码分析实战 第十六章课后实验

在地址40123A处调用了函数_strncmp。

问题5:

将实验文件Lab16-02.exe载入到OD:

恶意代码分析实战 第十六章课后实验

运行发现程序停留在了retn的位置。

问题6:

使用peid查看实验文件Lab16-02.exe

恶意代码分析实战 第十六章课后实验

这里发现了.tls区段,表示这个程序很有可能使用了反调试技术。

问题7:

回到ida,使用快捷键Ctrl+E:

恶意代码分析实战 第十六章课后实验

可以看到这个回调函数就在401060位置。

问题8:

我们来到回调函数的位置:

恶意代码分析实战 第十六章课后实验

回调函数一开始就将arg_4与1进行比较,说明反调试技术仅仅在程序启动过程中被执行,下面程序调用了函数FindWindowA,用来查看窗口是否有类名为OLLYDBG的窗口。我们可以使用插件PhantOm来对抗这种反调试技术。

问题9:

使用OD,在文件处选择打开文件,输入asdf

恶意代码分析实战 第十六章课后实验

单击打开,然后跳转到地址40123A位置,F2,运行一下发现:

恶意代码分析实战 第十六章课后实验

可以看到将asdf与[email protected]比较,比较前4个字节的内容,密码就有可能是byrr。

问题10:

恶意代码分析实战 第十六章课后实验

可以看到密码就是byrr。

恶意代码分析实战 第十六章课后实验

问题1:

使用strings打开实验文件Lab16-03.exe:

恶意代码分析实战 第十六章课后实验

发现了cmd以及cmd.exe,还有一大串的API函数。

问题2:

运行实验文件Lab16-03.exe发现了一闪而过的cmd窗口,之后就没有什么了。

问题3:

使用ida载入实验文件Lab16-03.exe,来到main函数的位置,发现了一连串的字符入栈操作,使用快捷键R来将其进行转化:

恶意代码分析实战 第十六章课后实验恶意代码分析实战 第十六章课后实验

恶意程序分别创建了两个字符创“1qbz2wsx3edc”和“ocl.exe”

恶意代码分析实战 第十六章课后实验

后面程序又调用了函数  _strncmp,使用OD查看,将断点停留在401518,运行,

恶意代码分析实战 第十六章课后实验

发现将文件名与qgr.exe比较。

将文件名改为qgr.exe运行后依然没有什么发现,说明这个是错的。

继续分析:

使用OD来到401286位置,把401292位置的语句用nop填充掉,

恶意代码分析实战 第十六章课后实验

然后保存这个打过补丁的程序。

 

利用OD打开这个打过补丁的程序,来到401518位置查看,可以看到这里将peo.exe与qgr.exe进行了比较

 

恶意代码分析实战 第十六章课后实验

peo.exe就是正确的文件名。

问题4:

分析一下函数QueryPerformanceCounter

恶意代码分析实战 第十六章课后实验

利用OD结合ida分析可知这两条语句的作用就是获取当前EIP的值,并将其保存到eax寄存器中。后面程序会将401254入栈。后面程序会引发一个除零异常,来调用401254处的语句,其实就是删除异常处理的例程。其实这样我们就知道了,运行在调试器中的程序会花费较多的时间来进行异常的处理。通过这个时间差,于是就能够判定当前程序是否运行在调试器中了。

在main函数的位置发现了GetTickCount的调用,分析一下:

使用OD在401584处下断点运行直接报错终止了,回到ida:

恶意代码分析实战 第十六章课后实验

这里两次调用了函数GetTickCount。还出现了sub_401000函数的调用。双击进入发现,这里再次出现了除零异常。接下来会比较两次计时的差值是不是等于1毫秒,如果超出了1毫秒,就会执行eax的异或指令,之后将edx中的内容保存到地址为0的内存空间中,那么这显然是一个非法操作,因此程序就会崩溃。为了修正这个位置,可以将0x004015B2到0x004015B6位置的语句全都nop掉。

继续分析:

恶意代码分析实战 第十六章课后实验

这里调用了函数sub_401300,双击进去看一下:

恶意代码分析实战 第十六章课后实验

这个指令计算的是系统启动以来的时钟数。恶意程序使用两个rdtsc指令的目的在于计算二者的差值,而在这两处指令中间,又是一个除零异常。时间差会保存在var_4中,并与0x7A120进行比较,如果时间差超过这个值,就会执行sub_4010E0函数。该函数的作用在于删除恶意程序自身。那么我们可以在OD中将这里的call语句nop掉,就能够对抗这种反调试技术了。

一共使用三种反调试技术,原理都是利用时间差值。

问题5:

1,如果QueryPerformanceCounter检查成功,恶意程序会修改它正常运行所需的字符串;

2,如果GetTickCount检查成功,恶意程序会产生一个导致程序崩溃的异常;

3,,如果rdtsc检查成功,恶意程序会从硬盘上删除自身。

问题6:

在两个计时函数调用之间,加入了恶意程序自己的异常处理例程,这样它就可以捕获一个它处理的异常。异常在调试器内处理比在调试器外处理慢得多。所以呢就能成功了。

问题7:

使用OD在4015DB下断点运行程序就可以看到域名了:

adg.malwareanalsysisbook.com。