原创:gavin
最近想给某一程序加密,防止别人直接从硬盘把可执行文件拷贝出来然后反汇编得到源代码,网上搜索了一下资料。想用CryptoFS和FUSE来做。基本思路是首先用FUSE改写某一个现成基于fuse写的文件系统,比如把文件系统的头修改了,再虚拟出一块磁盘,把该磁盘的文件系统置成fuse改写的文件系统类型。那别人就无法读取该虚拟出来的磁盘。第二步就是给存放文件的虚拟磁盘加密。这样就可以双重保护了。
第二步比较简单,所以先在普通的文件系统里做。接下来再想用FUSE修改现成的文件系统,大家有什么好的建议吗?现在先把第二步的方法写下来。
1.
libgpg-error-1.1
tar xvf libgpg-error-1.1.tar.gz && cd libgpg-error-1.1 && ./configure && make && make install && cd ..
(想卸载重装的话用make uninstall)
2.
libgcrypt-1.2.2
tar xvf libgcrypt-1.2.2.tar.gz && cd libgcrypt-1.2.2 && ./configure && make && make install && cd ..
3.
安装fuse,这个现在有问题,我一开始用的kernel2.6.19,配置内核的时候没有在file systems 里选择对Filesystem in Userspace support (fuse)的支持,按下面的方法把fuse装上是可以用的
tar xvf fuse-2.7.3.tar.gz
tar xvf fuse-2.7.3.tar.gz && cd fuse-2.7.3 && ./configure && make && make install && modprobe fuse
但是后来用kernel2.6.15,选择对Filesystem in Userspace support (fuse)的支持,按下面的方法再把fuse装上发现不可以使用
tar xvf fuse-2.7.3.tar.gz
tar xvf fuse-2.7.3.tar.gz && cd fuse-2.7.3 && ./configure --disable-kernel-module && make && make install
[root@LFS6 ~/fuse-2.7.3]$modprobe fuse
FATAL: Module fuse not found.
只找到了
/lib/modules/2.6.19.7rtaifb/kernel/fs/fuse/fuse.o
而不想在kernel2.6.19下可以找到
/lib/modules/2.6.19.7rtaifb/kernel/fs/fuse/fuse.ko
我想应该是fuse-2.7.3下./configure --disable-kernel-module这样的配置是给内核2.4配置的,现在没有想到方法解决。不过不管了,以后想用,那么内核不配上对fuse的支持就可以了。
4.
cryptofs- 0.6.0
tar xvf cryptofs-0.6.0.tar.tar && cd cryptofs-0.6.0 && ./configure
如果你用的是lfs6.2.5的话,可能会提示:
checking for FUSE... no
打开cat config.log,可以看到下面的一段话。
No package 'fuse' found
configure:19527: $? = 1
configure:19542: $PKG_CONFIG --exists --print-errors " fuse "
Package fuse was not found in the pkg-config search path.
Perhaps you should add the directory containing `fuse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'fuse' found
configure:19545: $? = 1
No package 'fuse' found
看起来是/etc/ld.so.conf里的路径没有包含fuse.pc,所以搜索:
[root@LFS6 ~/cryptofs-0.6.0]$find / -name "fuse.pc"
/usr/local/lib/pkgconfig/fuse.pc
原来fuse.pc在/usr/local/lib/下新建了pkgconfig一个文件,所以
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
再./configure,可以看到
checking for FUSE... yes
表示配置fuse已经没有问题了。
make && make install && cd ..
总的来说:
tar xvf cryptofs-0.6.0.tar.tar && cd cryptofs-0.6.0 && export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ && ./configure && make && make install && cd ..
这就可以安装了
5.如何加密
mkdir /root/encrytedfilestest
mkdir /mnt/mencrytedfile
cp cryptofs-0.6.0/cryptofs.conf encrytedfilestest/.cryptofs
.cryptofs是你要用的加密配置,可以根据要求去调。
[root@LFS6 ~]$cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile
cryptofs: error while loading shared libraries: libfuse.so.2: cannot open shared object file: No such file or directory
ldconfig更新/etc/ld.so.conf
再运行cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile就可以了。
到现在为止,已经把fuse和cryptofs安装好了,并且建立了source文件夹/root/encrytedfilestest和dest文件夹/mnt/mencrytedfile。以后的要运行的程序放到/mnt/mencrytedfile里,自动的会在/root/encrytedfilestest里生成一个加密的文件。比如现在我把一个叫test的可执行文件拷贝到/mnt/mencrytedfile里:
[root@LFS6 ~]$ls /mnt/mencrytedfile/
test
[root@LFS6 ~]$ls /root/encrytedfilestest/
yi+j9g==
[root@LFS6 ~]$cd /mnt/mencrytedfile/
[root@LFS6 /mnt/mencrytedfile]$./test
1, 2, 3, 4
可以看到test是可以执行的。
不用的时候,可以:
[root@LFS6 /mnt/mencrytedfile]$cd ~
[root@LFS6 ~]$umount /mnt/mencrytedfile
再
[root@LFS6 ~]$ls /mnt/mencrytedfile/
[root@LFS6 ~]$ls /root/encrytedfilestest/
yi+j9g==
这样就实现了加密了。如果想使用test,那么
[root@LFS6 ~]$cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile
Enter password:(如果输入密码错误)
可以看到你还是不能执行test
[root@LFS6 ~]$ls /mnt/mencrytedfile/
?U#?
密码对的时候才可以执行:
[root@LFS6 ~]$umount /mnt/mencrytedfile/
[root@LFS6 ~]$cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile
Enter password:
[root@LFS6 ~]$ls /mnt/mencrytedfile/
test
[root@LFS6 ~]$/mnt/mencrytedfile/test
1, 2, 3, 4
这样就实现了加密。
总的来说:
ldconfig
mkdir /root/encrytedfilestest
mkdir /mnt/mencrytedfile
cp cryptofs-0.6.0/cryptofs.conf encrytedfilestest/.cryptofs
cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile
运行的东西拷贝到/mnt/mencrytedfile下,并在这个目录下运行,不用的时候:
umount /mnt/mencrytedfile/
想再用就再执行一次:
cryptofs --root=/root/encrytedfilestest /mnt/mencrytedfile