恶意代码分析实战16-03

Posted Neil-Yale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战16-03相关的知识,希望对你有一定的参考价值。

本次实验分析Lab16-03.exe中的恶意代码。
问题
Q1.当使用静态分析法分析这个二进制文件时,你看到了哪些字符串?
Q2.当运行这个二进制文件时会发生什么?
Q3.如何重命名它,才能使这个二进制文件正常运行?
Q4.这个恶意代码使用了哪些反调试技术?
Q5.对每一种反调试技术而言,如果恶意代码确定它运行在调试器中,它将做什么?
Q6.为什么反调试技术在这个恶意代码中能够成功?
Q7.恶意代码使用了什么域名?

1.1实验任务一
Q1.当使用静态分析法分析这个二进制文件时,你看到了哪些字符串?
Peview载入查看字符串

A1:可以看到cmd,cmd.exe等
Q2.当运行这个二进制文件时会发生什么?
A2:一运行就立刻终止了

其他的问题我们需要做完整个实验才能解答。
载入IDA分析,打开imports窗口

看到了gethostbyname
这是恶意代码用于解析域名使用的
我们打开wireshark进行监听,并运行lab16-03.exe

wireshark中什么都没有捕获到
回到IDA继续分析
在main开始部分,就是将一连串的字符进行了入栈的操作

按r键,16进制转换为字符

继续往下

通过strncmp进行字符串的比较
这里的地址是00401518
我们打开od跳到这个地方,看看比较的字符串是什么

然后f2下断点直接运行过来

在右下角可以看到比较的是lab16-03.exe和qgr.exe
我们把文件改名为qgr.exe再次运行还是没有捕获到相关流量
对应着IDA,我们知道var_104是恶意代码的当前名字,var_29c是待比较的字符串,往前回溯,可以看到它在比较之前传递给了sub_4011e0

再往前可知其值

其实是ocl.exe
我们在IDA中跟入sub_4011e0

调用了两次QueryPerformanceCount,这个函数用于获取执行时间。

先来分析第二处的

第二次捕获的时间在var_110,第一次捕获的时间在lpPerformanceCount
两者相减的结果在var_114
00401286的cmp指令会将0x4b0与时间差结果比较,0x4b0是十进制的1200
如果时间差结果超过1200ms,则var_118被赋2,否则仍为初值1
之后是一个循环

循环中会使用var_118操作传入这个函数的字符串arg_0,也就是ocl.exe
所以我们也就知道,QueryPerformanceCounter检查会影响字符串的结果
我们看看如果在调试器中运行是怎样的
我们在00401286下断点,之后单步,看看之后的跳转是否有实现,从而明确var_118的值

可以看到跳转没有实现,那么var_118的值仍为1
如果是正常执行的话,var_118的值会是2
为了使得不论是否在调试器内,都让var_118保持为1,我们可以直接在00401292处通过nop实现
如下图操作即可

nop后的结果如下

然后将其复制到可执行文件

选择copy all

然后右键-》save file

我这里修改为qgr.exe
od载入该文件,跳到00401518

可以看到此时是将文件名qgr.exe与peo.exe进行比较
那么我们就将文件名改为peo.exe,启动wireshark进行监控后再运行

从抓到的流量看出,此时会有dns请求解析域名adg.malwareanalysisbook.com
说明此时程序可以正常运行了

回到IDA继续分析两个调用之间的指令的作用

结合od来看。我们跳到00401223
可以看到在IDA中显示的call $+5在od中显示的是call 00401228

单步

在右下角可以看到401128入栈
而pop指令则会将401228(目前的栈顶)出栈保存在eax中
单步之后可以看到确实如此

一旦恶意代码获取当前eip并存储到eax后
之后是将eax与0x2c相加,结果为0x401254,保存在eax
之后通过push将00401254入栈
如果在执行div ecx引发除零异常时,则会调用00401254处的指令

由于在00401229处ecx已经赋0了,所以一定会触发除零异常
而00401254处的指令就是用于删除异常处理的例程
我们知道,当进程运行在调试器中时,异常处理花费的时间更多,如果这一段时间差,恶意代码就知道自己是否运行在调试器中

接下来看看gethostbyname

地址是004015db,下断点执行过来,看看请求的域名是什么

但是可以看到恶意代码没有名字这个断点就终止了
这里的位置是004015b4
在IDA中定位到该位置

可以看到004015b4和gethostbyname是在两个分支中
再其上面看到了两次GetTickCount调用,当中出现了sub_401000的调用,跟入

看到了除零异常,这种操作和我们之前分析的是一样的
回到上层函数
两次GetTickCount结果保存在var_2b4,var_2bc
相减的结果保存在ecx
会比较ecx是否为1
如果ecx大于1,则往左边走
eax被置0,这是非法操作,所以恶意代码就会崩溃
也就是我们在od中遇到的情况
要想在调试器中能够走右边,我们可以将左边的三条指令nop掉

保存到可执行文件

将其命名为peo.exe
再次在gethostbyname下断点,执行,可是依旧报错

接着回到IDA
在调用gethostbyname前还调用了sub_401300

看到调用了两次rtdsc

rtdsc用于计算系统启动以来的时钟数

两次调用计算的差值保存在var_4
然后与7a120h进行比较,如果大于7a120h(10进制500000)则会往左调用sub_4010e0,跟入,关键部分截图如下


不难看出是实现了删除自身并终止进程的功能
所以我们可以将401380处的指令nop掉
还是同样的操作



此时再次在gethostbyname下断点,运行

可以看到成功了

Q3.如何重命名它,才能使这个二进制文件正常运行?
A3:重命名为peo.exe
Q4.这个恶意代码使用了哪些反调试技术?
使用了三种不同的反调试时钟检测技术: rdtsc、 GetTick Count 和QueryPerformanceCounter
Q5.对每一种反调试技术而言,如果恶意代码确定它运行在调试器中,它将做什么?
如果QueryPerformanceCounter 检查成功, 恶意代码 会修改它正常运行所需的字符串: 如果GetTickCount检查成功,恶意代码会产生一个导致程序崩溃的未处理异常;如果rdtsc检查成功,恶意代码将会从硬盘上删除自身
Q6.为什么反调试技术在这个恶意代码中能够成功?
这个反调试技术检查获得成功,因为恶意代码修改SEH机制,在两个计时检查函数调用之间包含恶意代码自己的异常处理例程,这样它就可以捕获-一个它处理的异常。异常在调试器内处理比在调试器外处理慢很多。
Q7.恶意代码使用了什么域名?
恶意代码使用的域名是adg.malwareanalysisbook. com。

以上是关于恶意代码分析实战16-03的主要内容,如果未能解决你的问题,请参考以下文章

恶意代码分析实战17-3

恶意代码分析实战21-1

2018/10/04-网络API-《恶意代码实战分析》

恶意代码分析实战18-3

恶意代码分析实战3-2

恶意代码分析实战3-2