恶意代码分析实战-实验16

本文最后更新于:2022-01-19 下午

Lab 16-1

分析

首先本程序是实验九的程序,流程都是一样的,只是加入了反调试的手段,就不再对程序本身进行分析了,分析在这里恶意代码分析实战-实验9

只分析一下反调试的内容。反调试的手段主要是这三个,PEB中的BeingDebugged标志,PEB中的processHeap中的flags属性和PEB中的NTGlobalFlag标志。

问题

1. 这个恶意代码使用了哪些反调试技术?

PEB中的BeingDebugged标志,PEB中的processHeap中的flags属性和PEB中的NTGlobalFlag标志。

2. 当每种反调试技术成功执行时,有什么现象?

执行sub_401000,里面是执行自删除

3. 如何应对这些反调试技术?

可以手动修改跳转或者这些值。

4. 如何在调试过程中手动修改检测的数据结构?

在OD中跟随到数据地址之后,可以直接进行修改,如图中,将地址的数值修改为0即可。

5. 哪一种OD插件可以帮你逃避恶意代码的反调试技术?

sharpOD

Lab 16-2

分析

当打开程序时,看到存在一个TLS回调函数,这是一个反调试的函数。看到当进程启动时,会查找是否存在OLLYDBG的窗口,当线程启动时,会调用sub_401020

这是检测当前是否是调试器加载运行的,SetLastError设置一个不存在的错误值,然后调用OutputDebugStringA,如果当前进程没有被调试器附加那么此函数会失败,错误值会被重新设置,而如果是附加状态,则错误值不会改变。如果是调试器附加状态,会给byte_40A968这个地址的数据加上1。而此影响到的是后续的密码计算。

来到主函数,看到会检查参数,如果没有带参数则会提示输入四位字符密码。然后会创建一个新的线程,之后调用strncmp进行比较,看到后面指定位数4,只比较前四位。

新线程是一些字节操作,主要是通过一系列计算得出输入的密码。

在这里注意两个地方,一个是这里,在这里会加上byte_40A968的值

第二个是这里,这里加上了BeingDebugged标志值。

让程序自己解密,看到输出了结果,因为只比较前四位,所以密码是bzqrBeingDebugged这种OD自动过了,我手动改了一下标志)

正确的密码,其实后面的p@ss可以不要的,因为前面已经分析过了,只需要前四位一致即可。

但是有一个问题,就是本程序只在XP生效,在win7,win10上运行的时候,密码正常会是bzrr,因为跑的时候OutputDebugStringA会成功执行,但是为什么,我不太清楚。

这里可以写这样的代码测试

1
2
OutputDebugStringA("helloworld\n");
printf("%d", GetLastError());

win7、win10执行都是不出错的。

所以说如果是XP的话要输入的就是byrr

win7上则是bzrr,当然根据分析也可以知道,实际上的正确密码就是byrr

问题

1. 在命令行中运行Lab16-2.exe时,会发生什么?

提示输入密码

2. 当使用猜测的命令参数运行Lab16-2.exe时,会发生什么?

提示错误

3. 命令行密码是什么?

byrr

4. 使用IDA pro加载Lab16-2.exe,在main函数的何处可以找到strncmp函数?

Sleep函数下面就是。

5. 在默认设置下,将这个恶意代码加载到OD中会发生什么?

会直接退出,因为有一个TLS回调函数。

6. Lab16-2.exe中PE结构的独特之处是什么?

有一个tls

7. 回调发生在哪些位置?

主要是进程启动和线程启动时

8. 恶意代码使用哪一种反调试技术使它在调试器中立即终止运行?如何避免这种检查?

一个是查找窗口,一个是OutputDebugStringA,都可以通过修改跳转条件来避免。

9. 当你禁用反调试技术后,你在调试器中看到的命令行代码是什么?

bzqr

9. 当你禁用反调试技术后,你在调试器中看到的命令行密码是什么?

byrr

10. 调试器中找到的密码在命令行中运行有效吗?

不管用

11. 哪种反调试技术为调试器和命令行设置不同的密码?如何防御它们?

OutputDebugStringABeingDebugged标志,检测是否在调试中运行。都可以通过手动修改来进行避免。

Lab 16-3

分析

本程序和Lab 9-2是相似的程序

sub_4011E0函数是第一个反调试的函数,主要是用QueryPerformanceCounter获取一个时间,然后再次获取,比较差值,如果差值较大,就说明现在正在被动态调试。最后对程序名ocl.exe进行一个处理,得到peo.exe,如果被检测到正在调试,则会让V3=2,那么就会得到错误的程序名qgr.exe

这里还有一个上一节的内容,自己插入SEH链,这里有个问题,如果动态调试了div ecx这一句,就会无限循环401254-401261这之间的语句,我也不知道为什么会这样,暂时不知道原因。

然后会利用GetTickCount来检测时间,判断是否被调试,sub_401000函数是一个计算的函数,没有任何意义,就是为了拖延时间。

sub_401300是用来解密域名的,里面用了rdtsc指令来获取时间,判断是否被调试,同时这个程序中也有和 sub_4011E0一样的一个手工构造的SEH链。如果被调试的话,调用sub_4010E0,里面执行自删除。

解密出来的域名

剩下的流程与Lab 9-2是一致的,就不分析了。

问题

1. 当使用静态分析法分析这个二进制文件时,你看到了哪些字符串?

2. 当运行这个二进制文件时会发生什么?

没有任何反应

3. 如何重命名它,才能使这个二进制文件正常运行?

将其重命名为peo.exe

4. 这个恶意代码使用了哪些反调试技术?

使用了QueryPerformanceCounterGetTickCountrdtsc三种方法检测时间,计算差值判断是否正在被调试。

5. 对每一种反调试技术而言,如果恶意代码确定它运行在调试器中,它将做什么?

QueryPerformanceCounter会让程序名解密出现错误;GetTickCount直接退出;rdtsc会执行自删除。

6. 为什么反调试技术在这个恶意代码中能够成功?

它在其中还用了手动构造SEH链,当你调试的时候,进入的话时间花费会较长,肯定会大于规定好的最大的差值。

7. 恶意代码使用了哪些域名?

使用了adg.malwareanalsysisbook.com