Windows 沙箱开发踩坑

最近在开发Online Judge沙箱,因为在Linux下面的一大把,而在Windows下的基本都很简陋或者不会用,所以就打算自己写一个.于是途中遇坑无数

1. Windows内核作业 (JOB OBJECT)

这个东西看上去十分美好,但是几乎除了《Windows核心编程》上那几个过时的例子和完全没有实例的MSDN文档之外,就没有几个像样的教程了. WOC!!!
我表示非常无奈.所以建议大家还是不要去碰这个鬼东西,比Cgroup还难用.我在做的时候,可以限制内存和时间,但是内核作业明明应该已经结束的时候,却无法受到signaled信号,导致WaitForSingleObject函数无法返回.要么是程序就没有被终止.完全调不出来.于是就愉快地放弃了.顺便一提,网上仅有的例子似乎在高版本的MSVC里面因为结构体重写过了,于是乎不能用了(VC6据说还是可以的), 我是在StackOverflow上翻了好久才翻到的.

然而HUSTOJ的Windows judge采用了轮询的方式, 感觉与其这样还不如自己写一个...

顺便吐槽一下,即使是它的V2版本,还是写得比较令人难受,C++用太多了...C++最好少用,做成dll给J/C#调用比较好. 然而这又是一个大坑,不过至少还是有比较多的文档的.

2.自己去写限时和限内存, 并以低权限用户启动

这个比较好写,有几份比较古老的代码,我参考了一下,重写了一份在我的机子上能用的.不过并不能限制其他的东西,于是就想到了组合Windows内核作业(不死心).但是发现放在job里面的进程只能由CreateProcessAsUser来启动,然而这个函数需要令牌,再然而用一般的登陆函数,比如LogonUser获得的令牌不知道为什么权限不够,如果提权就没什么意义了.正在纠结中,还不知道怎么做.虽然看到HUSTOJ有一个小项目,可以尝试用WinApiHook来做这个

不过,既然OJ是一个整体, 我们就可以不用挖空心思去想如何限制程序的运行.**

很多人说Windows不好, 然后爆吹一波*nix. 但是我的评价是, 他们疯了. 就我的感觉而言, Windows是"很多地方很好, 但是也有一些败笔", 然而Linux是"本质上就是反人类, 虽然也有一些值得肯定的地方".这里也是一样的. 既然是Windows, 那么没有头文件P都干不了.因为MinGW的编译器和MSVC不一样, 它是POSIX那一套, 和Windows的头文件干系不大, 也比较好删, 正好也没有Linux下面比较难以修改的东西. 所以只要删掉Windows特有的头文件, 小学生就基本凉凉了. 然后再卡一卡磁盘访问权限什么的, 就基本做好了.

posted @ 2018-09-23 23:15  Prisrak  阅读(1389)  评论(0编辑  收藏  举报