恶意代码分析实战 Lab17

lab17-01

程序运行脚本之后,有三个地方红色高亮

第一个是使用sidt获取IDTR寄存器值,然后和FF比较,是FF就跳转到loc_40132D处调用sub_401000函数删除自身


第二个使用str来检测,注意三个跳转,其中loc_40124E是程序正常跳转,loc_401336最后还是会调用sub_401000删除程序


最后一个在这里,返回值为0DDCC0000h时候正常运行,否则跳转结束程序


看一下函数内部,使用sldt来检测,并且将得到的LDT值赋给eax作为函数返回值


现在运行程序看一下结果

xp和win7下都失败,可能是因为多核吧,不过现在cpu都是多核发展,这种技术应该是少见的.感觉了解一下即可


第二个str,还是无效,原因可能一样吧


看第三个sldt返回值为DDCC0000,还是无效的检测


所以,分析结束,这些技术都有些过时了


lab17-02

导出函数


搜索in,注意到只在sub_10006196函数里面调用


看到三个导出函数都调用了这个检测函数,我们将他命名为check_in,函数检测到虚拟机是返回1,否则返回0


依照题目运行程序(程序极其庞大,功能也很多,没必要全部分析,会吐的)

看到程序创建两个文件,一个xinstall.log一个是wvselfdel.bat而且


在后面回因cmd创建,注意到cmd删除了这个bat文件


打开.log文件


这个.log文件告诉我们他检测到虚拟机,并且安装失败,要想安装成功,字节修改sub_10006196里面的in指令为nop即可,in也只是一个字节大小

分别找这两个文件字符,注意到.bat只在,sub_10005567函数里面调用,查看函数可以确认,这里创建.bat并且运行脚本删除自身


看到三安装函数都调用他


同样方法查看.log文件的函数sub_10003592

注意到还有一个函数sub_10006119函数也是个检测函数,关键代码如下,不懂在做什么,课本的意思这是个函数空的?


注意开头这个判断是检查10019034偏移0Dh处是数字是不是0,(实际为5)不为0则做虚拟机检测


现在就看一下sub_1000D3D0是怎么安装dll就好了

进入程序一路看下来应该注意到不少提示信息,足够我们推测程序是通过注入dll到iexplorer.exe来实现安装自身的

关键证据在函数sub_1000D10D里面的createremotethread调用,这个注入dll的方法应该不陌生,可以证实,eax为loadlibrary,edi为dll文件绝对路径


因为都是熟悉的代码之前已经见过也分析过,所以只是简单这样提一下,而且本章重点也是反虚拟机技术

现在看一下第二个installSA

会发现程序基本一样,除了,最后调用的是sub_1000D920函数来安装自身

同样是见过的技术

看三个地方打开SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost注册项

然后再这个目录项下对netsvc设置值为dll的绝对路径


最后运行服务netsvc


看注册表变化


再看installSB

多调用一个sub_10005A0A函数

这个函数可以参考Lab12-04

总的说就是查找winlogon.exe向他注入线程执行sfc_os.dll的二号函数,来禁止window的文件保护

其中sub_10005778是提权函数

sub_10005937是查找winlogon.exe

最后sub_10005991是注入线程

回到函数,看最后一个sub_1000DF22函数调用

注意到那些提示字符串还有下面两个函数调用,推测是复制恶意代码到系统目录替换某个dll文件


我们直接运行程序,看注册表变化,可以直观看出,可以知道程序替换的是ntmssvc.dll



最后看一下三个安装的日志文件,要想程序不删除自身,最好还是把DVM后面的5改成0,不用管in


最后说一下这个程序极大而且功能极多,在此不详细分析每个功能,日后有时间我们再战.


Lab17-03

c程序开头存在两个函数调用分别使用两种反虚拟机技术,sub_401A80和sub_4011c0


其中sub_401A80是in检测,函数检测出来返回1,没测出来返回0


看一下sub_4011c0函数,参数是注册表 相关,应该是通过查找vmware再注册表痕迹来检测

打开注册项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses


读取项类名和子项数量


取出之前那个项下面的第一个子项名,

然后sub_401060函数将项名转化为小写,

sub_4010B0将项名和vmware比较,函数返回1代表比较成功,则对var_8赋值1,最后赋给eax作为sub_4011c0返回值


如果匹配失败这会向下搜索,继续调用sub_4011c0最多搜索两层,第三个参数决定

所以这个,函数其实是遍历HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses下面的子项深度为2,查找是否存在子项名字为vmware

这便是加载资源然后解密,返回资源数据地址


sub_401400函数则对之前得到的C:\Windows\System32\svchost.exe进行进程替换,用资源函数内容(参考12-2)


不同的是在上面两个函数的开头都存在呢反虚拟机技术

在sub_401670里面

先是得到返回数据大小


然后去申请空间,


然后再次调用


上面调用成功后就得到IP_ADAPTER_INFO结构的链表

下面比较type是以太网或者无线适配器802.11,都不是就链表指向下一个


找到呢以太网或无线适配器后,比较长度大于2,否则还是链表指向下一个

最后用前面函数开头的数据,和address(这里比较的的是mac地址开头为00:0c::29ollydbg实测)比较如果存在相同的,那么说明程序在虚拟机里面


那个var_40被设为1,程序不会加载资源文件就退出函数

再看sub_401400函数的反虚拟机技术


这一这里面都没有明文信息比较,所以不太好理解,要知道第一个参数就是一个密文,第二个参数是长度

函数先得到进程链表,然后调用sub_401060函数得到进程名的前6个字符的小写,arg_4就是第二个参数6


注意这里的sub_401000函数有两个参数,第一个是上面函数的返回值,头六个字符的小写,第二个还是arg_4,注意esp加4


这个函数是个加密函数,对六个字符加密得到返回值和0F30D12A5h作比较,如果相等说明存在虚拟机中(我们推测应该是检测以vmware开头的进程),则函数返回1,然后sub_401400函数也会结束,不会做进程的替换

ollydbg跟踪发现前三种技术都检测出来然而最后一个技术没有检测出来,虚拟机进程中,不存在vmware开头进程的,但是存在vmtool开头进程,所以实际上应该检测vmtool而不是vmware

为了验证检测的是vmware可以使用ollydbg修改函数sub_401400的参数为vmware看返回值,如下图,注意到返回值正是第一个参数的值


分析结束,至于程序的其他部分和lab12-02是一样的,可以参考之前的文章.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值