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

2024-02-07 21:08

本文主要是介绍恶意代码分析实战 第十六章课后实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

先来整体分析一下,

整体看一下发现很多地方都调用了函数  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。

这篇关于恶意代码分析实战 第十六章课后实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/688934

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统