本文主要是介绍恶意代码分析实战 第十六章课后实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先来整体分析一下,
整体看一下发现很多地方都调用了函数 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与byrrp@ss比较,比较前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。
这篇关于恶意代码分析实战 第十六章课后实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!