• 反沙箱——SetErrorMode


    目录

    1.前言

    2.原理讲解

    3.代码实现

    4.参考

    1.前言

    利用SetErrorMode进行反沙箱的技术,在2010年就有被提出,但是之前搜了很久都没有相关内容,这里简单的说一下这个反沙箱的实现。反沙箱参考GandCrab5.2。

    2.原理讲解

    首先讲一下SetErrorMode这个函数,SetErrorMode是用于设置如何处理程序错误的,设置不同的值有不同的作用,下面是机翻的结果。

     

    而SetErrorMode有一个特点就是返回值为上次设置的值,如下代码和结果。

     1 #include<Windows.h>
     2 #include<stdio.h>
     3 
     4 int main()
     5 {
     6   DWORD dwCode;
     7   //开始没有设置任何值,所以返回值为0
     8   dwCode = SetErrorMode(SEM_FAILCRITICALERRORS);
     9   printf("the first dwCode:0x%x
    ", dwCode);
    10 
    11   //这里设置值SEM_NOGPFAULTERRORBOX是2,返回值为前面设置的值所以为1
    12   dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    13   printf("the second dwCode:0x%x
    ", dwCode);
    14 
    15   return 0;
    16 }

     

    但是这里有一个特别的参数SEM_NOALIGNMENTFAULTEXCEPT,简单来说就是设置这个值后就不会消除这个值。

     1 #include<Windows.h>
     2 #include<stdio.h>
     3 
     4 int main()
     5 {
     6   DWORD dwCode;
     7   //开始没有设置任何值,所以返回值为0
     8   dwCode = SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT);
     9   printf("the first dwCode:0x%x
    ", dwCode);
    10 
    11   //这里设置为SEM_NOGPFAULTERRORBOX,返回值为上次设置的值为0x4
    12   dwCode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    13   printf("the second dwCode:0x%x
    ", dwCode);
    14 
    15   //这里设置为SEM_FAILCRITICALERRORS,返回值却不为0x2,这是由于前面设置的SEM_NOALIGNMENTFAULTEXCEPT不会清除,所以叠加0x4+0x2
    16   dwCode = SetErrorMode(SEM_FAILCRITICALERRORS);
    17   printf("the second dwCode:0x%x
    ", dwCode);
    18 
    19   return 0;
    20 }

    3.代码实现

    那上面讲解的内容和反沙箱有什么关系呢?我们先看看cuckoosandbox里的一段代码,沙箱会预先设置值用于监控错误的发生,这里就用到了SetErrorMode并且其中的参数有SEM_NOALIGNMENTFAULTEXCEPT。

    由于沙箱和运行的样本类似于进程和之进程的关系,所以利用SetErrorMode才可以检测,如果是同一系统下的两个进程设置了SetErrorMode是不会相互影响的。那么就可以利用这个设置来模拟一下沙箱环境下代码的运行情况,代码和效果如下

     1 #include<Windows.h>
     2 #include<stdio.h>
     3 
     4 int main()
     5 {
     6   //模拟沙箱环境设置
     7   SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
     8 
     9   DWORD dwCode ;
    10   dwCode = SetErrorMode(0x400);    //虽然没有参数的值为0x400,但是这里设置也可以正常运行
    11   //这里返回前面设置的值,0x1+0x2+0x4+0x8000=0x8007
    12   printf("the first dwCode:0x%x
    ", dwCode);
    13   dwCode = SetErrorMode(0x0);
    14   //由于之前设置了SEM_NOALIGNMENTFAULTEXCEPT,所以这里返回值为是0x400+0x4=0x404
    15   printf("the second dwCode:0x%x
    ", dwCode);
    16   //在沙箱下返回0x404与0x400不相等,所以可以判断是在沙箱下。如果在正常情况下返回0x400
    17   if (dwCode != 0x400)
    18   {
    19     printf("In Sandbox
    ");
    20   }
    21   else
    22   {
    23     printf("In normal machine
    ");
    24   }
    25 
    26   return 0;
    27 }

    4.参考

    http://joxeankoret.com/blog/2010/02/23/antiemulation-techniques-malware-tricks-ii/

    https://asec.ahnlab.com/1202

  • 相关阅读:
    高性能MySQL--创建高性能的索引
    error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
    高性能MySQL--MySQL数据类型介绍和最优数据类型选择
    Elasticsearch入门和查询语法分析(ik中文分词)
    裁员浪潮,互联网人该何去何从?
    django+mysql的使用
    很详细的Django入门详解
    (2021年1月5日亲测有效)最新PyCharm 安装教程&激活破解,Pycharm激活,Pycharm破解
    (2021年1月5日更新)!最新的pycharm永久激活办法,亲测有效
    太干了!一张图整理了 Python 所有内置异常
  • 原文地址:https://www.cnblogs.com/QKSword/p/10739142.html
Copyright © 2020-2023  润新知