#我的武器库系列#之沙箱逃逸核心技术实现

       沙箱技术发展已非常成熟,与之而来的沙箱逃逸技术也多种多样,如基于主机名、内存、开源沙箱的特征等等进行判断,如为沙箱环境,则关闭自身系统(所检测沙箱特征越多越好)。本文沙箱逃逸比较简单,主要是通过键盘、鼠标、时间差等三个维度进行检测,超出指定阈值则退出。

一、源代码

# -*- coding: UTF-8 -*-
import ctypes
import random
import time
import sys


user32 = ctypes.windll.user32;
kernel32 = ctypes.windll.kernel32;

keystrokes = 0; #键盘
mouse_clicks = 0; #鼠标
double_clicks = 0; #双击

#最后输入事件的时间戳
class LastInputInfo(ctypes.Structure):
    __file__ = [("cbSize",ctypes.c_uint),"dwTime",ctypes.c_ulong];

#获取最后输入事件
def get_last_input():
    struct_lastInputInfo = LastInputInfo();
    struct_lastInputInfo.cbSize = ctypes.sizeof(LastInputInfo);
    #获取上次输入操作的时间
    user32.GetLastInputInfo(ctypes.byref(struct_lastInputInfo));
    #获取机器运行的时间
    run_time = kernel32.GetTickCount();

    elapsed = run_time - struct_lastInputInfo.dwTime;

    print ("间隔时间 %d" % elapsed);

    return elapsed;

#获取鼠标左键数量、左键按键时间、键盘数量
def get_key_press():
    global mouse_clicks; #鼠标
    global keystrokes; #键盘
    #0xff换成十进制为255。A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。
    for i in range(0,0xff):
        if user32.GetAsyncKeyState(i) == -32767:
            if i == 0x1: #鼠标左键
                mouse_clicks += 1;
                return time.time();
            elif i>32 and i<127:
                keystrokes += 1;
    return None;

#沙箱
def detect_sandbox():
    global mouse_clicks;
    global keystrokes;

    max_keystrokes = random.randint(10,25);#允许最大按键次数

    max_mouse_clicks = random.randint(5,25);#允许最大点击次数

    double_clicks = 0 ;#双击
    max_double_click = 10;#双击最大次数
    double_click_threshold = 0.250 ;#双击时间差
    first_double_click = None;#第一次双击时间

    max_input_threshold = 30000; #毫秒 两次双击时间差

    previous_timestamp = None; #先前时间戳

    detection_complete = False; #安全监测

    last_input = get_last_input();

    if last_input >=max_input_threshold: #判断键盘时间超过最大时间,则退出
        sys.exit(0);
    while not detection_complete:
        keypress_time = get_key_press(); 
        if keypress_time is not None and previous_timestamp is not None:
            #计算两次间隔时间
            elapsed =  keypress_time - previous_timestamp;
            #间隔时间短则默认为双击
            if elapsed <=double_click_threshold:
                double_clicks +=1;
                #初始化第一次双击时间
                if first_double_click is None:
                    first_double_click = time.time();
                else:
                    if double_clicks == max_double_click:
                        #短时间内,连续双击
                        if keypress_time - first_double_click <=(max_double_click*max_input_threshold):
                            sys.exit(0);
            if keystrokes >=max_keystrokes and double_clicks >=max_double_click and mouse_clicks >=max_mouse_clicks:
                return;  
            previous_timestamp = keypress_time;
        elif keypress_time is not None:
            #先前时间戳初始化
            previous_timestamp = keypress_time;
detect_sandbox();
print("监测正常");
         

二、说点其它

       基于python的渗透及防护内容暂时告一段落,下一步我打算深入操作系统,以C++为主要编程语言,实现基于windows操作系统的渗透与防范(包括:注册表、进程注入、逆向、hook等),希望丰富自身安全经验同时,可以更好的帮助用户解决安全问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章