解密rwkgyg-CFwarp脚本 原理与实践

wget -N https://gitlab.com/rwkgyg/CFwarp/raw/main/CFwarp.sh

看第一眼, 就是上次的加密方法.

用上次的方法解密, 

bash <(curl https://gitlab.com/crazypeace/tuic-yg-unpack/-/raw/main/unpack.sh) CFwarp.sh

发现脚本为分2部分.

前面部分是安装 bzip2, 后面部分是下载这个脚本并执行

wget -qN https://gitlab.com/rwkgyg/CFwarp/raw/main/1CFwarp.sh

那么就是说, 这个 1CFwarp.sh 才是本体.

下载了打开看一看.


这个 1CFwarp.sh 是用 bz2-shell 项目"加密"的. 

原理是用bzip2把原脚本进行压缩, 在执行时再解压缩.

脚本分为2部分, 前面部分是通用的解压流程, 后面部分是被bzip2压缩过的数据.

经过阅读代码, 可以发现, 第67行是为解压后的脚本添加可执行权限, 第69行是执行解压后的脚本.

那么, 我们的思路就是, 把这个"解压后的脚本"拷贝出来就好了呀.

在第67行添加

cp "$bztmp" /tmp/CFwarp-unpack.sh

注意, bash把两个语句写在同一行, 用 ; 号分隔

当然, 你可以把用于实际执行的第69行注释掉, 这样就只解密不执行了.

好了, 我们执行一下 1CFwarp.sh 看看.

嗯, 看到了 /tmp/CFwarp-unpack.sh 文件, 内容就是"解密"后的原始脚本呀.



把整个过程用脚本表达, 就是这样:

bash <(sed '69s@^@#@; 67s@$@\; cp "$bztmp" /tmp/_tmp.sh@' ${1})
mv /tmp/_tmp.sh ${1} 

这其中,  使用了单引号' 字符串, 这样其中$的表达就不会被当作变量, 而是原样; 而且 使用了@作为sed的分隔符, 因为考虑到需要用到文件路径的/, 还有注释符号#.

并且, 这其中有一个; 为了不被当作sed多个语句并列的意义, 需要用\转义

把这样的脚本保存为 unpack.sh

然后执行

bash unpack.sh 1CFwarp.sh

发现报错, bzip2 无法解压.

想了一想. 有可能是因为二进制文件内容的原因. 查了一圈, sed和perl都是处理文本的, head tail cat 可以处理二进制.

于是先用head和tail把前后两部分 分开, 再用sed处理前半部分, 然后再合起来用bash执行.

脚本修改为

head -n 74 ${1} | sed '69s@^@#@' | sed '67s@$@\; cp "$bztmp" /tmp/_tmp.sh@' > _part1
tail -n +75 ${1} > _part2
cat _part1 _part2 > _mix
bash _mix
mv /tmp/_tmp.sh ${1} 

测试正常了.


======

传到了Gitlab上.

https://gitlab.com/crazypeace/cfwarp-unpack

用法

wget -qN https://gitlab.com/rwkgyg/CFwarp/raw/main/1CFwarp.sh
bash <(curl https://gitlab.com/crazypeace/cfwarp-unpack/-/raw/main/unpack.sh) 1CFwarp.sh

评论

The Hot3 in Last 30 Days