相关疑难解决方法(0)

如何创建轻量级C代码沙箱?

我想构建一个C预处理器/编译器,允许从本地和在线资源收集功能.即:

#fetch MP3FileBuilder http://scripts.com/MP3Builder.gz
#fetch IpodDeviceReader http://apple.com/modules/MP3Builder.gz

void mymodule_main() {
  MP3FileBuilder(&some_data);
}
Run Code Online (Sandbox Code Playgroud)

这很容易.

困难的部分是我需要一种可靠的方法来"沙箱化"导入的代码,直接或不受限制地访问磁盘或系统资源(包括内存分配和堆栈).我想要一种方法来安全地运行不受信任的C代码(模块)的小片段,而没有将它们放在单独的进程,VM或解释器中的开销(尽管可以接受单独的线程).

要求

  • 我需要对其访问数据和资源(包括CPU时间)进行配额.
  • 我将阻止直接访问标准库
  • 我想阻止创建无限递归的恶意代码
  • 我想将静态和动态分配限制为特定限制
  • 我想捕获模块可能引发的所有异常(例如除以0).
  • 模块只能通过核心接口与其他模块交互
  • 模块只能通过核心接口与系统(I/O等)进行交互
  • 模块必须允许位操作,数学,数组,枚举,循环和分支.
  • 模块不能使用ASM
  • 我想限制指针和数组访问为模块保留的内存(通过自定义safe_malloc())
  • 必须支持ANSI C或子集(见下文)
  • 系统必须是轻量级和跨平台的(包括嵌入式系统).
  • 系统必须与GPL或LGPL兼容.

我很乐意接受C的一个子集.我不需要像模板或类这样的东西.我主要对高级语言不能像快速数学,位操作以及二进制数据的搜索和处理这样的事情感兴趣.

这是现有C代码可以不加修改地重复使用,以创建一个模块的意图.目的是要求模块符合一组规则和限制,旨在将模块限制为基本逻辑和转换操作(例如视频转码或压缩操作).

这种编译器/预处理器的理论输入是单个ANSI C文件(或安全子集),带有module_main函数,NO包含或预处理器指令,没有ASM,它将允许循环,分支,函数调用,指针数学(限于分配给模块的范围),位移,位域,强制转换,枚举,数组,整数,浮点数,字符串和数学.其他任何东西都是可选的.

示例实施

这是一个伪代码片段,可以更好地解释这一点.这里一个模块超出了它的内存分配配额,并且还创建了无限递归.

buffer* transcodeToAVI_main( &in_buffer ) {
    int buffer[1000000000]; // allocation exceeding quota
    while(true) {} // infinite loop
    return buffer;
}
Run Code Online (Sandbox Code Playgroud)

这是一个转换版本,我们的预处理器添加了观察点来检查内存使用和递归,并将整个事件包装在异常处理程序中.

buffer* transcodeToAVI_main( &in_buffer ) {
    try {
        core_funcStart(__FILE__,__FUNC__); // tell core we're executing this function
        buffer = …
Run Code Online (Sandbox Code Playgroud)

c sandbox

36
推荐指数
5
解决办法
1万
查看次数

窗户锁定屏幕后面会发生什么?

我一直致力于Windows自动化和监控.

当我锁定Windows机器的屏幕时到底发生了什么?

我目前正在使用Windows 7,如果我切换到Vista或服务器版本,行为会有很大差异吗?还有可以通过api访问的桌面吗?我知道我仍然可以将键击和鼠标点击发送到特定的窗口(通过ControlSendControlClick),但似乎没有"桌面"本身.

有人可以对这一切有所了解,或者指出一个可读的来源,我可以对这个主题进行概述吗?

windows winapi autohotkey

21
推荐指数
1
解决办法
2万
查看次数

创建Sandbox C#

有没有关于如何使用C#创建沙箱的教程?

我想个性化我自己的,谢谢

c# sandbox

9
推荐指数
1
解决办法
1万
查看次数

标签 统计

sandbox ×2

autohotkey ×1

c ×1

c# ×1

winapi ×1

windows ×1