Seccomp和系统调用过滤
Seccomp v1
Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
read(), write(), exit(), sigreturn()
Seccomp是2005年Andrea Arcangeli在Linux内核加的一个功能,为了给*Grid计算中的应用*提供sandbox模型。运行在Seccomp模式下的进程,只能执行下面几个系统调用:
read(), write(), exit(), sigreturn()
stratagus的前身是freecraft。freecraft重写了Blizzard公司的经典游戏Warcraft II的RTS游戏引擎。后因版权问题改名。freecraft改名后分成了几个部分,stratagus项目承接了其游戏引擎的部分,wargus在stratagus引擎上进行二次开发,几乎完美重现了Warcaft II的功能。下面是Wargus/Stratagus的效果:
Windows平台上的编译工程工具很多,Visual C++ 6的dsp文件,2003以后用的vcproj,以及最近2010支持的用msbuild编译的vcxproj,加上古老的nmake,cygwin、msys移植的make,等等很多。
make的问题是扩展性比较差,尤其是在Windows平台上,nmake的功能更弱,导致写一个工程文件很费劲,管理多个工程有大量的重复工作要做。make最大的问题是不能automake那种简洁的工程写法(automake同样存在扩展问题,m4语言不懂).
最新的msbuild 4.0试用了一下,感觉不是很好,很费劲。因为最近迷恋上了命令行,一直不愿意安装完整的Visual Studio 2010 Beta 2,直接把2010的命令行拷贝出来用cl.exe之类的。想只装.Net Framework 4.0就试试msbuild,发现不行,把2010里的msbuild相关资源拷贝出来也不行。而且用XML手写工程文件很麻烦。
猛然想起之前听说过,鼎鼎大名,但之前简单了解后放弃了的scons。再次使用之后,才发现scons的妙处。
1. 主页 http://www.libpng.org/pub/png/libpng.html
2. 最新稳定版本 1.2.40
源码下载 http://download.sourceforge.net/libpng/lpng1240.zip
3. 编译依赖
依赖zlib。要求名为zlib的目录位于和libpng源码平级的目录下。libpng会自行编译zlib的源码,而zlib 1.2.3版本中的汇编代码在VC 2008下编译存在问题,参见zlib的编译说明。
4. 编译方法
打开源码中的projects\vc71\libpng.sln工程文件。编译DLL ASM Release和LIB ASM Release就可以了。会得到libpng.lib、libpng13.lib、libpng13.dll。
5. 注意
ligpng会编译自己的zlib1.dll和zlib.lib,不知道编译参数和zlib自己的工程文件是否一样,也不知道和zlib工程文件编译出的dll和lib会不会冲突。这个问题留待考察。
1. 项目主页 http://www.lua.org/
2. 当前最新稳定版本 5.1.4,2008年8月发布
源码下载 http://www.lua.org/ftp/lua-5.1.4.tar.gz
3. VC编译方法
解压后,用Visual Studio 2008命令行环境进入lua目录,运行etc\luavs.bat。之后会在src目录下生成lua.exe、luac.exe、lua51.dll
4. 注意
默认的luavs.bat只会生成DLL,如果需要编译静态链接库,可以自行修改luavs.bat,修改两处地方
1. 删除cl.exe的编译选项 /DLUA_BUILD_AS_DLL
2. 生成DLL的命令改成 lib.exe /nologo /out:lua.lib *.obj
记录下Visual C++ 2008编译zlib的过程,以备不时之需。
1. 项目主页 http://www.zlib.net/
2. 当前最新稳定版本 1.2.3,2005年7月发布
源码下载 http://www.zlib.net/zlib123.zip
3. VC编译方法
解压后,打开项目文件projects\visualc6\zlib.dsw,新版本的VC会提示要做工程格式转换。一般只编译其中zlib项目的DLL Release和LIB Release就好了。
4. Bug
如果想编译zlib的DLL ASM Release和LIB ASM Release,会出现下面的错误:
contrib\masmx86\inffas32.asm(647) : error A2070:invalid instruction operands contrib\masmx86\inffas32.asm(649) : error A2070:invalid instruction operands contrib\masmx86\inffas32.asm(663) : error A2070:invalid instruction operands contrib\masmx86\inffas32.asm(720) : error A2070:invalid instruction operands
这是因为VC2008的MASM语法更严格了,导致之前的代码语法检查不过。参照这里的说明,把inffas32.asm改好就OK了。或者下载我改好的
最近在Windows平台上编译SDL,过程记录下来备忘。说是用VC 2008编译,其实和用VC 2005和VC 2010编译过程都是一样的。
1. SDL 主页 http://www.libsdl.org/
2. 当前最新稳定版本 1.2.14
源码 http://www.libsdl.org/release/SDL-1.2.14.zip
3. VC编译方法
SDL-1.2.14.zip解压后,再解压其中的VisualC.zip,然后用VC打开VisualC\SDL.sln。编译SDL和SDLmain两个工程。
4. 编译依赖
DirectX SDK中的dsound.h, dinput.h几个头文件,和dxguid.lib这个库文件。最新的DirectX SDK 2009 Auguest可以从微软(http://is.gd/4Q3Mo)下载。或者只下载其中include目录和lib目录打包(http://is.gd/4Q416)。
5. 注意
这样通过SDL.sln编译出的SDL.dll依赖msvcr90.dll,需要目的端也装了VC 2009的redistributable才行。要么就用外置manifest文件的方法发布,还没搞懂,搞懂再写。
ezgdi是我最近做的一个小项目, 将用于字体美化的gdi++动态链接库移植到x64平台上. 原始想法来源于极限主题论坛的相关讨论[1][2][3].
gdi++替换了操作系统的gdi接口功能, 可以提供更加伤心悦目的字体渲染效果. 而gdi++的一个重要特点, 即操作系统接口替换, 是依赖于微软研究院发布的一个库, 叫detours, 现在detours版本号是2.1, express版可以免费使用, 但不支持64位程序. 而支持64位的Professional版本不免费, 要$1000, 而且有钱也不能用, 因为微软禁止你用detours开发GPL类开源软件. 据我所知, 很多很好的项目都依赖于detours, 以至于迟迟不能提供对64位的支持.
64位是未来的趋势, Linux, Windows现在发布, 都主推64位版本. 如果gdi++不支持64, 会严重影响我升级64位操作系统的决心. 所以我觉得gdi++移植到64位windows, 是一件挺有意义的事情.
首先, easyhook提供与detours类似的操作系统API劫持功能. 并且开源, 支持x64平台. 所以将gdi++对detours的依赖移植到easyhook上, 可以编译出64位的gdi++.dll, 用于渲染64位Windows程序.
截止到8月26日, 从detours到easyhook的移植工作基本完成雏形. 这意味着, 使用easyhook代替detours的方案是可行的.
将来64位的gdi++.dll和32位的gdi++.dll会并存, 分别负责渲染64/32位程序. 虽然目前只支持注册表加载, 但实现成gditray的支持那种也是可行的.
虽然我目前是基于freetype版做出的修改, 但其实修改的内容都和freetype没关系, 所以推广到其他版本应该也不是问题.
总的来说, 从使用来讲没什么不一样的. 想试用当前的版本, 可以参见安装说明.
目前把gdi++从detours移植到easyhook的工作已经基本完成, 32-bit和64-bit的DLL都能正确生成. 但运行不稳定. 尤其是x64的dll, 会导致IE crash. 即使这样, 如果你还是感兴趣, 可以下载试用.
现在我有两个忧虑, 一是性能, 我怕easyhook相对detours的实现会产生明显的性能瓶颈, 二是全面性, 目前已经发现有些操作系统的界面easyhook不能渲染, 不知道是不是easyhook做不到.
上述两个问题有可能是植根于easyhook本身的技术实现, 无法解决的. 所以最坏的结果是, 走了一圈, 发现此路不通.
非常需要, 我一个人的精力能力毕竟有限. 如果觉得ezgdi有一点价值, 可以关注ezgdi项目的主页. 上面有一些文档, 和我改动之后的代码
目前的ezgdi尚有很多较为严重的问题没有解决, 大概有下面几点:
1. 只支持注册表加载, 需要将gditray这种也用easyhook改写才能支持其他加载方式
2. 有些程序中渲中文字体不能渲染(SVN中r27应该已经解决, 至少一部分)
3. x64的DLL非常不稳定, 肯定有从32位到64位移植遗留的bug没有发现. 访问中文站点会导致IE 64-bit崩溃
4. 不能正常截获开始菜单, IE等Windows主界面的内容, 怀疑和easyhook有关, 还未确认.
完善, 不断完善. 尤其是改善x64的DLL稳定性, 因为移植到easyhook的优点就是支持x64平台.
Debian下目前有3个可以用的usplash主题包,分别是usplash-theme-debian,debian-edu-artwork-usplash,brdesktop-artwork-usplash。目前在lenny下制作出来的效果都有问题。截图:
为了解决这个问题,我先分析了usplash主题的制作原理。usplash的主题制作过程大概如下:
而产生前面截图那样的错误,是因为图片的调色板没有统一。而调色板不统一的原因,是因为usplash用的图片转换工具修改了统一调色板的方法。
本来,usplash 用的统一调色板的方法,是通过imagemagick提供的convert命令,先将png转换到gif,再转换回png的方法。(可能是因为convert对png格式的调色板支持不好)。方法如下:
convert image.png +dither -map ./cmap.gif gif:- | convert gif:- image.png
后来这种方法不管用了。原因是从gif转回png格式时,convert不再保留调色板。
经过网上的搜索,发现新版本的imagemagick应该用下面的命令设置调色板:
convert +dither image.png -type Palette -depth 8 -map cmap.gif image.png
修改Makefile中相关语句后,再次编译usplash主题,就会出现正确的效果了:
附usplash-theme-debian的patch:
--- a/Makefile 2009-08-20 00:51:49.000000000 +0800 +++ b/Makefile 2009-08-20 00:34:28.000000000 +0800 @@ -88,8 +88,8 @@ %.c: %.png cmap.gif $(E) " PNGSRC " $@ - $(Q) convert $< +dither -map cmap.gif gif:- | \ - convert gif:- $< + $(Q) convert +dither $< -type Palette -depth 8 -map cmap.gif $<.new + $(Q) mv $<.new $< $(Q) pngtousplash $< > $@ #cmap.gif: background.svg progress.png
Debian Live 是一款制作可从移动介质直接启动的 Linux 系统的工具,支持生成 iso 镜像,USB 磁盘镜像和 NFS 镜像。
Debian Live 定制性很强,下面简单介绍几项定制内容:
1. 定制 Debian Mirror 地址
如果你的工作机无法访问官方 mirror,一定要通过下面 lh_config 的 5 个参数,配置可以访问的 mirror:
lh_config
[-m|--mirror-bootstrap URL]
[--mirror-binary URL]
[--mirror-binary-security URL]
[--mirror-chroot URL]
[--mirror-chroot-security URL]2. 定制 syslinux splash 图像
syslinux 使用一种特殊的图像格式(RLE 或 LSS),需要用下面的方法准备:
ppmtolss16 '#d0d0d0=7' < splash.ppm > splash.rle
得到 LSS 格式的图像之后,需要:
LH_SYSLINUX_SPLASH="config/binary_syslinux/splash.rle"
然后 lh_clean && lh_build 生成新的镜像。
3. 定制默认用户配置
Debian 以及其他 Linux 发行版在创建新用户时,会将 /etc/skel 目录下的所有文件复制到新用户 HOME 目录下。借助这一特色,可以通过将配置文件放在 /etc/skel 目录下,起到默认配置的作用。
Debian Live 系统每次启动时会生成全新用户 HOME 目录,同样会拷贝 /etc/skel 目录下的所有文件。因此需要将配置文件放入 Debian Live 系统的 /etc/skel 目录下。
在 config/chroot_local-includes/ 目录下,创建 etc/skel 子目录,在生成 binary 时,这些文件会自动拷贝到文件系统上。
lh_clean && lh_build 生成新的镜像。
4. 定制 splashy
splashy 可以在系统启动时,显示图形化的进度栏。splashy 的定制过程如下:
#!/bin/sh splashy_config -s debian-moreblue || true update-initramfs -u -k all
最后,lh_clean && lh_build 生成新的镜像。
5. 定制 usplash
usplash 与 splash 类似,同样可以显示图形化启动进度。由于 splashy 不支持 initramfs,有一部分启动过程无法图形化,而 usplash 能弥补这一缺陷。
6. 最小化生成 image
通常减少 Debian/Linux 系统空间的方法无外乎:1 删除不用的 locale 信息,2 删除 APT 缓存。可以参照上面定制过程,在 config/chroot_local-hooks/ 目录下,创建 hooks 脚本实现。
#!/bin/sh rm -r /var/lib/apt/lists/mirror.ivic.org.cn* rm -r /var/cache/apt/*.bin debconf-set-selections <<EOF debconf localepurge/nopurge select en, en_US.UTF-8 debconf localepurge/nopurge seen true debconf localepurge/mandelete select true debconf localepurge/mandelete seen true debconf localepurge/dontbothernew select false debconf localepurge/dontbothernew seen true debconf localepurge/showfreedspace select true debconf localepurge/showfreedspace seen true debconf localepurge/verbose select false debconf localepurge/verbose seen true debconf localepurge/quickndirtycalc select true debconf localepurge/quickndirtycalc seen true EOF dpkg-reconfigure -u -phigh localepurge
最后 lh_clean && lh_build 生成新的镜像。
7. 使用 fluxbox
fluxbox 是一款小巧的 X Window Manager。生成使用 fluxbox 的 Debian Live 系统的过程如下:
## LH: Fluxbox #include <standard-x11> fluxbox gdm ##desktop-base
最后 lh_clean && lh_build 生成新的镜像。
最近评论