Alleged RC4
这个算法是在阅读 shc 项目里面发现的,我为这个项目fork了一个注释 版本。
shc项目是可以将shell command编译成为C代码,最终编译成为可执行文件,用于漏洞攻击使用的。
既然是攻击漏洞,那么可执行文件需要:1. 在用户没有防备的情况下面执行,如果发现当前执行环境 是安全人员构造的沙盒的话,那么就自动退出;2. 提高安全人员反编译的难度,比如我们不会直接把 shell command以明文的方式写在text里面。shc来提供了许多额外的选项来限制可执行程序只能运行在 更加安全的环境中而不被反编译。
ARC4这个算法就是在生成C代码阶段将shell command混淆并且加速随机数据,而在运行阶段将这些 混淆的数据反解析回来用于执行。代码的要点在于,混淆和反混淆的操作必须是对称的。
我仿照下面的C代码自己测试了一下Python的 实现
/** * This software contains an ad hoc version of the 'Alleged RC4' algorithm, * which was anonymously posted on sci.crypt news by cypherpunks on Sep 1994. * * My implementation is a complete rewrite of the one found in * an unknown-copyright (283 characters) version picked up from: * From: allen@gateway.grumman.com (John L. Allen) * Newsgroups: comp.lang.c * Subject: Shrink this C code for fame and fun * Date: 21 May 1996 10:49:37 -0400 * And it is licensed also under GPL. * *That's where I got it, now I am going to do some work on it *It will reside here: http://github.com/neurobin/shc */ /* 'Alleged RC4' */ // TODO(yan): 这个算法值得好好研究一下 static unsigned char stte[256], indx, jndx, kndx; /* * Reset arc4 stte. */ void stte_0(void) { indx = jndx = kndx = 0; do { stte[indx] = indx; } while (++indx); } /* * Set key. Can be used more than once. */ void key(void * str, int len) { unsigned char tmp, * ptr = (unsigned char *)str; while (len > 0) { do { tmp = stte[indx]; kndx += tmp; kndx += ptr[(int)indx % len]; stte[indx] = stte[kndx]; stte[kndx] = tmp; } while (++indx); ptr += 256; len -= 256; } } /* * Crypt data. */ void arc4(void * str, int len) { unsigned char tmp, * ptr = (unsigned char *)str; while (len > 0) { indx++; tmp = stte[indx]; jndx += tmp; stte[indx] = stte[jndx]; stte[jndx] = tmp; tmp += stte[indx]; *ptr ^= stte[tmp]; ptr++; len--; } } /* End of ARC4 */
update@20200210: 今天看到RC4的 wiki, 上面写着
RC4开始时是商业机密,没有公开发表出来,但是在1994年9月份的时候,它被人匿名公开在了Cypherpunks 邮件列表上,很快它就被发到了sci.crypt 新闻组上,随后从这传播到了互联网的许多站点。随之贴出的代码后来被证明是真实的,因为它的输出跟取得了RC4版权的私有软件的输出是完全相同的。由于算法已经公开,RC4也就不再是商业秘密了,只是它的名字“RC4”仍然是一个注册商标。RC4经常被称作是“ARCFOUR”或者"ARC4"(意思是称为RC4),这样来避免商标使用的问题。RSA Security从来没有正式公布这个算法,罗纳德·李维斯特在2008年的自己的课程笔记中给出了一个指向RC4的英文维基百科文章的链接,并且在2014年的文件[3]中确认了RC4及其代码的历史。
让我想到了这个算法搞不好就是RC4. 对比了一下wiki上面给出的伪代码,确认这就是RC4.