恶意代码分析实战-实验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
标志值。
让程序自己解密,看到输出了结果,因为只比较前四位,所以密码是bzqr
(BeingDebugged
这种OD自动过了,我手动改了一下标志)
正确的密码,其实后面的p@ss
可以不要的,因为前面已经分析过了,只需要前四位一致即可。
但是有一个问题,就是本程序只在XP生效,在win7,win10上运行的时候,密码正常会是bzrr
,因为跑的时候OutputDebugStringA
会成功执行,但是为什么,我不太清楚。
这里可以写这样的代码测试
1 |
|
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. 哪种反调试技术为调试器和命令行设置不同的密码?如何防御它们?
OutputDebugStringA
和BeingDebugged
标志,检测是否在调试中运行。都可以通过手动修改来进行避免。
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. 这个恶意代码使用了哪些反调试技术?
使用了QueryPerformanceCounter
、GetTickCount
、rdtsc
三种方法检测时间,计算差值判断是否正在被调试。
5. 对每一种反调试技术而言,如果恶意代码确定它运行在调试器中,它将做什么?
QueryPerformanceCounter
会让程序名解密出现错误;GetTickCount
直接退出;rdtsc
会执行自删除。
6. 为什么反调试技术在这个恶意代码中能够成功?
它在其中还用了手动构造SEH
链,当你调试的时候,进入的话时间花费会较长,肯定会大于规定好的最大的差值。
7. 恶意代码使用了哪些域名?
使用了adg.malwareanalsysisbook.com
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!