首页
社区
课程
招聘
[原创]检测Kaspersky沙盒之OpenProcess大法
发表于: 2010-2-2 19:15 9073

[原创]检测Kaspersky沙盒之OpenProcess大法

2010-2-2 19:15
9073

最近看到不少人讨论如何检测程序是否运行于Kaspersky的沙盒中。

有的人想到Sleep(XXXXXXXX);;有的人想到访问一个不存在的网络地址然后根据结果判断;有的人想到通过复杂运算折腾死虚拟机。。。 。。。

花样层出不穷,其实这些方法非常山寨,而且还不稳定、不准确。

下面贴出我的源代码~~~

//
//AUTHOR:黑客守卫者
//BLOG:c80K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6A6K9s2S2V1k6h3j5`.
//url:6e6K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3S2A6i4K6u0W2j5X3q4A6k6s2g2Q4x3X3g2U0L8$3#2Q4x3V1k6A6K9s2S2V1k6h3k6Q4x3V1k6T1L8r3!0Y4i4K6u0r3K9i4c8W2L8g2)9J5c8U0R3%4k6e0S2S2x3X3p5$3x3X3j5#2x3K6g2V1z5h3g2V1x3o6b7K6y4e0R3#2k6g2)9J5k6h3S2@1L8h3H3`.
//

#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>

//
//Define
//
int DetectSandBox(void);

//
//Routine
//
int DetectSandBox(void)
{
   //
   //Routine Description:
   //
   //This routine detect if is run in real OS or SandBox.
   //Tested in win xp.
   //Not for win Vista or later version

   //
   //Arguments:
   //
   //None

   //
   //Return Value:
   //
   // -1 for error
   // 0 for run in real OS
   // 1 for run in SandBox

   //
   //Adjust Token Privileges
   //
    HANDLE hToken = NULL;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;

    if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
   {
        return -1;
    }
    if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
   {
        CloseHandle(hToken);
        return -1;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
   {
        CloseHandle(hToken);
        return -1;
    }

   //
   //Detect SandBox
   //
   DWORD dwProcCount = 0;
   DWORD dwFaultCount = 0;

   HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   PROCESSENTRY32 pe;
   pe.dwSize=sizeof(PROCESSENTRY32);

   if(hSnap)
   {
      Process32First(hSnap,&pe);
      do
      {
         if(
            pe.th32ProcessID == GetCurrentProcessId() ||
            pe.th32ProcessID == 0 ||
            pe.th32ProcessID == 4
         )
         {
            continue;
         }

         HANDLE hProc = NULL;
         hProc = OpenProcess( PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,pe.th32ProcessID);      
         if( !hProc )
         {
            dwFaultCount++;
         }
         CloseHandle(hProc);

         dwProcCount++;
      }
      while(Process32Next(hSnap,&pe));
      CloseHandle(hSnap);
   }
   else
   {
      return -1;
   }

   //
   //Check the result
   //
   if( (dwProcCount - dwFaultCount) <= 4 )
   {
      return 1;
   }
   else
   {
      return 0;
   }

   return -1;
}

//
//Entry
//
int main(void)
{
   int iRet = DetectSandBox();
   if( iRet == 1 )
   {
      MessageBox(NULL,"RUN IN SANDBOX! DAMN IT!","NOTICE",MB_ICONSTOP);
   }
   else
   if( iRet == 0 )
   {
      MessageBox(NULL,"RUN IN REAL OS!","NOTICE",MB_ICONINFORMATION);
   }
   else
   {
      MessageBox(NULL,"UNKNOWN ERROR! DAMN IT!","NOTICE",MB_ICONSTOP);
   }

   return 0;
}


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 21
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
测试过了,有效,再细细看下代码,楼主赞一个
2010-2-2 19:59
0
雪    币: 95
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
很好 ,顶一个。。
2010-2-2 20:18
0
雪    币: 270
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
此帖必火,占座留名
2010-2-2 21:22
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
弱弱的问一句

if( (dwProcCount - dwFaultCount) <= 4 )
   {
      return 1;
   }
为什么是4???

请LZ解释???
2010-2-2 21:42
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
是不是说在沙盒 中,进程是不能打开其它进程的?

还是沙盒中遍历不到其它进程?
2010-2-3 03:36
0
雪    币: 18
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在沙盒中是可以打开其它进程的
2010-2-3 05:11
0
雪    币: 445
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
呵呵,好方法~,
2010-2-3 10:34
0
游客
登录 | 注册 方可回帖
返回