拯救rm误删的文件

即便采用了定时备份,云盘同步,甚至GIT,却还总是不及随手的一个rm来的杀伤力大。

今天又又又遇到了这个问题,rm随手把刚刚写好的一个cpp文件给删了,一瞬间脚都软了,上周写了一周的ROP,劳民伤财且洋洋洒洒几百行。

Linux下有很多文件恢复类的软件,前序操作一般是umount磁盘,再备份磁盘,最后用这些软件扫描分区,找到误删文件。

只不过现在遇到的情况有点特别,ext4格式的磁盘位于虚拟机当中,整个分区差不多200G,编译Android代码用的。光找个空闲磁盘存放这么大的分区就足够苦恼了,如果还要对这么大的磁盘进行磁盘恢复,时间肯定久到不敢想。

毕竟这个cpp我还是定期备份的,相比之前备份的版本,只是增加了几百行代码而已,现在只要能找到增加的这几行,哪怕有些错乱,理论上再调整下格式就可以了,并不需要传统的文件恢复工具重磅来访。

首先,在分区中搜索新增文字片段中的关键字,关键字要稍微长一点避免重复,比如我的例子中:

fgrep -a -b 'memcpy(mem + 0xA000' /dev/sda3
fgrep: 搜索字符串为文本,而不是正则表达式,会比grep快很多
-a: 搜索时把目标文件当做文本而不是二进制,否则只会输出Binary File Matched字样,而不打印结果
-b: 搜索结果会显示目标字符串所在的文件偏移

通过上面的搜索,可以很快(十分钟以内)找到目标字符串所属偏移(好几组)。

接下来只要从目标分区取回文件内容片段:

dd if=/dev/sda3 of=text.save bs=1 skip=offset_from_fgrep count=8000
skip: 调到fgrep所指的文件偏移附近开始转储文件内容

到此,基本上text.save里存着的就是你的文件内容了,毕竟fgrep时输出的偏移好几组,dd时倒是可以换几个试试,看哪个输出的结果最好。

Linux下编译WebKit和JSC

Safari和Chrome的内核都是webkit,无论是打算自己开发个浏览器还是在程序里集成完整的HTML解析功能,webkit都是为数不多的选择。特别是webkit分支中的jsc,可以命令行下解释执行javascript,真是想想就让人亢奋的玩物。编译环境选择的是Ubuntu 15.04 x86_64,由于玩心太重,所以首先考虑把jsc编译出来。

下载代码

有大概三种途径弄到代码,git,svn和直接下载tar.xz,我只试了后面两种

svn checkout https://svn.webkit.org/repository/webkit/trunk webkit

或者从webkitgtk直接下载tar.xz

准备编译环境

执行webkit/Tools/gtk/install-dependencies可以安装大部分缺失的库代码,另外再手动补下刀

sudo apt-get install libgstreamer*

其余的库要是还缺,apt-cache search+apt-get install 缺啥补啥吧

编译

如果下载的tar.xz的话,参考linuxfromscratch进入webkit目录执行以下代码,编译好的jsc位于./build/bin/jsc

sed -e 's/“/"/' -e 's/”/"/' 
    -i Source/WebCore/xml/XMLViewer.{css,js} &&

mkdir -vp build &&
cd        build &&

cmake -DCMAKE_BUILD_TYPE=Release 
 -DCMAKE_INSTALL_PREFIX=/usr 
 -DCMAKE_SKIP_RPATH=ON 
 -DENABLE_GEOLOCATION=OFF 
 -DPORT=GTK 
 -DLIB_INSTALL_DIR=/usr/lib 
 -DUSE_LIBHYPHEN=OFF 
 -DSHARED_CORE=OFF 
 -DCMAKE_C_COMPILER=/home/jack/afl/afl-gcc 
 -DCMAKE_CXX_COMPILER=/home/jack/afl/afl-g++ 
 -DBUILD_SHARED_LIBS=OFF 
 -DENABLE_MINIBROWSER=ON 
 -Wno-dev .. &&
make -j10

如果是svn得到的代码,进入webkit目录后执行编译脚本得到./WebKitBuild/Release/bin/jsc

./Tools/Scripts/build-jsc --gtk --makeargs="-j10"

Linux下运行Flash独立播放器

Adobe很早就停止了对Linux下Flash的功能更新,和最新的Flash 18相比,Linux下的Flash仍然停留在11.2。

即便如此,Flash 11.2日常播放个简单的动画还是绰绰有余的,点击下载Flash独立播放器

直接运行绝对报错,形式类似:

(flashplayer:23126): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer
(flashplayer:23126): GLib-GObject-CRITICAL **: g_signal_handlers_disconnect_matched: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

官方也没详细说明,后来在64位的ubuntu 14上折腾一阵,发现安装以下的依赖库就OK了

sudo apt-get install 
  libglib2.0-0:i386 
  libxt6:i386 
  libxcursor1:i386 
  libnss3:i386 
  libgtk2.0-0:i386 
  libcurl3:i386 
  libxcursor1:i386