打印
[Cortex-M0技术交流]

如何加密混乱C源代码(转帖)

[复制链接]
1328|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呆板书生|  楼主 | 2013-4-3 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天和9g,冬发兄聊起混乱C代码,上网查过,觉得这个比较搞笑,故转来,

如何加密/混乱C源代码(转载)
下面是一个找出素数的程序:
01 void primes(int cap)
02 {
03 int i, j, composite;
04
05 for(i = 2; i < cap; ++i) {
06 composite = 0;
07 for(j = 2; j * j < i; ++j) {
08 composite += !(i % j);
09 }
10 if(!composite){
11 printf("%dt", i);
12 }
13 }
14 }
15
16 int main()
17 {
18 primes(100);
19 }

下面我们来看看如何把上面这段代码搞得复杂难懂。
第一步、把for变成while

通常来说,for循坏要以while循坏简单一些,上面的程序有二重for循环,我们不但要把其变成while循环,而且还要把二重循环的变成一重的循环,然后使用大量的if-else语句来判断。
01 void primes(int cap)
02 {
03 int i, j, composite, t = 0;
04
05 while(t < cap * cap) {
06 i = t / cap;
07 j = t++ % cap;
08 if(i <= 1);
09 else if(!j)
10 composite = j;
11 else if(j == i && !composite)
12 printf("%dt",i);
13 else if(j > 1 && j < i)
14 composite += !(i % j);
15 }
16 }
17
18 int main()
19 {
20 primes(100);
21 }
第二步,把循坏变成递归

递归在某些时候是可以把代码变得简单,但大多数的情况下是把代码变得复杂,而且很没有效率。下面是把上面的while循环变成了递归。变成了递归后,函数的参数都变成3个了。
查看源代码
打印帮助
01 void primes(int cap, int t, int composite)
02 {
03 int i,j;
04 i = t / cap;
05 j = t % cap;
06 if(i <= 1)
07 primes(cap,t+1,composite);
08 else if(!j)
09 primes(cap,t+1,j);
10 else if(j == i && !composite)
11 (printf("%dt",i), primes(cap,t+1,composite));
12 else if(j > 1 && j < i)
13 primes(cap,t+1, composite + !(i % j));
14 else if(t < cap * cap)
15 primes(cap,t+1,composite);
16 }
17
18 int main()
19 {
20 primes(100,0,0);
21 }
第三步,弄乱代码结构/使用没有含义的变量名

关于如何弄乱代码结构,其中一个小技巧是,使用“?”表达式代替if-else语句。
01 void primes(int m, int t, int c)
02 {
03 int i,j;
04 i = t / m;
05 j = t % m;
06 (i <= 1) ? primes(m,t+1,c) : (!j) ? primes(m,t+1,j) : (j == i && !c) ?
07 (printf("%dt",i), primes(m,t+1,c)) : (j > 1 && j < i) ?
08 primes(m,t+1,c + !(i % j)) : (t < m * m) ? primes(m,t+1,c) : 0;
09 }
10
11 int main()
12 {
13 primes(100,0,0);
14 }
第四步,取消临时变量

临时变量一般用来保存反复使用的一个表达式的值。使用大量重复的表达式来取消这些临时变量的也可以让代码复杂起来。
01 void primes(int m, int t, int c)
02 {
03 ((t / m) <= 1) ? primes(m,t+1,c) : !(t % m) ? primes(m,t+1, t % m) :
04 ((t % m)==(t / m) && !c) ? (printf("%dt",(t / m)), primes(m,t+1,c)) :
05 ((t % m)> 1 && (t % m) < (t / m)) ? primes(m,t+1,c + !((t / m) % (t % m))) :
06 (t < m * m) ? primes(m,t+1,c) : 0;
07 }
08
09 int main()
10 {
11 primes(100,0,0);
12 }
第五步,继续弄乱变量名

我们知道,下划线是合法的变量名,所以,我们不妨用__,___,____来代替m,t,c。函数名也可以使用下划线来代替。让我们来看看求素数的函数能变成什么。
01 void _(int __, int ___, int ____)
02 {
03 ((___ / __) <= 1) ? _(__,___+1,____) : !(___ % __) ? _(__,___+1,___ % __) :
04 ((___ % __)==(___ / __) && !____) ? (printf("%dt",(___ / __)),
05 _(__,___+1,____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ?
06 _(__,___+1,____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
07 _(__,___+1,____) : 0;
08 }
09
10 int main()
11 {
12 _(100,0,0);
13 }
第六步,移除常量

在上面的程序中,还有一些常量,你可以通过增加一个宏定义,或是增加一个函数的形参来取代这一常量。
01 void _(int __, int ___, int ____, int _____)
02 {
03 ((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
04 ((___ % __)==(___ / __) && !____) ? (printf("%dt",(___ / __)),
05 _(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
06 _(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
07 _(__,___+_____,____,_____) : 0;
08 }
09
10 int main() {
11 _(100,0,0,1);
12 }

相关帖子

沙发
xyz549040622| | 2013-4-3 23:18 | 只看该作者
书生太狠了

使用特权

评论回复
板凳
缥缈九哥| | 2013-4-4 16:13 | 只看该作者
晕了。。。

使用特权

评论回复
地板
呆板书生|  楼主 | 2013-4-6 06:50 | 只看该作者
不是我写的,只是转帖,我从来没有做过这种事

使用特权

评论回复
5
phones| | 2013-4-8 22:54 | 只看该作者
时间长了自己都不清楚是什么意思了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

868

帖子

2

粉丝