关于PHP的代码保护 -- 两个凡是

宏哥 发布于 2016/12/01 15:04
阅读 1K+
收藏 6

Serverless 架构就不要服务器了?>>>

早期可以用 bcompiler 把 PHP编译成bycode进行代码保护

实际上可以用zephir把PHP直接编译成C模块, 这样强度更高

两个凡是就是这么做的

我知道有些人想破解

你知道又怎么样

一样破解不了

以下是话题补充:

@宏哥:开放源代码一样需要保护。 保证不能篡改, 保证不能非授权使用。开源和版权保护不冲突。 (2016/12/01 15:32)
加载中
1
eechen
eechen
https://github.com/liexusong/php-beast/
代码可以用国人开源的php-beast加密,支持PHP7.
发布时把php-beast模块和加密过的代码给对方就好了.
php-beast只支持Unix-like系统,对Windows支持不好.
1
乌龟壳
乌龟壳

@eechen

代码加密这块我接触比较少,以前做的以软件形式卖出去的都是.net或者delphi写的,delphi直接编译成汇编不谈,.net做的也有混淆功能。

从源码角度来说,只要把变量名全部替换成无意义的,删除注释,这样基本别人就看不懂了。当然还有一些更改逻辑级别的混淆,.net里有相关工具做,我见过但忘了。但是php作为动态语言,不到运行时很难知道一些代码细节具体代表什么,所以能做的比较少。

另一种就是你说的AES加密,AES的秘钥根本就没有遮掩的必要,AES加密有两个参数,一个可以人为是公钥,另一个就是AES的私钥,你每次重新编译解密模块,无论公钥放在文件里或者从系统里提取mac之类的无论什么方式,只要私钥不变,@宏哥 说的方式就没办法找到私钥。至于怎么保护私钥,方法很多,如私钥数据通过算法生成等,让人很难定位私钥怎么来的。还有更高级的做法就是自己设计加密算法,让别人更摸不着头脑。

但是无论怎么对源代码加密,最终还是会在内存里以php的bytecode形式存储,如果有心人对内存进行监控,说不定可以提取出来,反编译出源代码。

最好还是将php编译成机器码,就是宏哥提到的zephir,这样破解难度就比较大了。

当然如果zephir只会编译成调用一系列动态库的函数,一一对应bytecode实现的逻辑,这样和没编译一样,只不过bytecode换了一种形式而已。

例如if ($a == $b) echo 'c';

bytecode假设是01 a b 4 05 c(01表示if a == b goto 第4个bytecode,05表示echo)

编译成c语言是:libphp.if(a, b, 4) 4: libphp.echo(c)

这样编译出来的汇编代码是很有规律的,能直接反推出bytecode

最好还是期待zephir读懂php的逻辑,如上面例子的直接生成c代码

if (strcmp(a, b) == 0) echo ("c");

这样通过c编译器一优化,妈都看不出来原来是什么代码了。但是要理解PHP的if ($a == $b)显然不是那么简单的,$a是什么类型?$b是什么类型?他们比较相等的真正逻辑是什么?这玩意很不好做。我也没研究过 zephir,这个原理说了,谁有空可以去研究下。

所以回到一开始,如果要对php这种动态语言做代码做保护,可能混淆就够了吧。其它方式除非能真正读懂php代码的实际逻辑,不然也就最多是bytecode换种形式而已。

乌龟壳
乌龟壳
回复 @eechen : 我这么说是为了方便理解,http://php.net/manual/zh/function.mcrypt-generic-init.php,你看下iv参数就知道我在说什么了
eechen
eechen
RSA才区分公钥和私钥吧,AES只有一个用来加解密的密钥吧.
1
_
_Yud

破解后你给一千万. 就会被破解.

0
李虎头
李虎头
我预感,这里将要变成一片战场
0
宏哥
宏哥

引用来自“eechen”的评论

代码可以用国人开源的php-beast加密,支持PHP7.
发布时把php-beast模块和加密过的代码给对方就好了.
php-beast只支持Unix-like系统,对Windows支持不好.

这个加密强度不够。 

我的加密更高级, 可以锁定服务器, 可以中心端接管授权服务

但是你这种PHP菜鸟无法理解的


eechen
eechen
https://github.com/liexusong/php-beast/ 提供只能在指定的机器上运行的功能。要使用此功能可以在 networkcards.c 文件添加能够运行机器的网卡号。
honey_fansy
honey_fansy
@eechen PHP菜鸟
官万人员
官万人员
哈哈哈
0
宏哥
宏哥

@eechen  

我的库承受了专业的安全公司团队近一年的破解都没有成功

你那个库破解太容易了。 

很容易从二进制找到秘钥进行破解的

百世经纶之傲笑红尘
百世经纶之傲笑红尘
回复 @eechen : php-beast这种,可以认为代码还存着,但代码活力已死
eechen
eechen
回复 @宏哥 : @liexusong
宏哥
宏哥
回复 @eechen : 做beast这种人根本不懂加密应该如何做。根本不知道加密算法应该如何使用。流程很重要。这种强度对安全公司就是1个小时之内的事情。
宏哥
宏哥
回复 @eechen : 两次用不同的秘钥进行编译beast,立刻就定位到秘钥位置了。 其它人提供的包,直接找到位置就是秘钥,只有你这种蠢驴不懂
eechen
eechen
回复 @宏哥 : 呵呵,你就会吹吹牛,你以为我不知道你底细.
下一页
0
百世经纶之傲笑红尘
百世经纶之傲笑红尘
已成战场,目测eechen要在宏哥这吃瘪
0
eechen
eechen
@乌龟壳 AES密钥保存在二进制文件中的安全性问题.
宏哥说通过修改密钥重新编译然后对比二进制文件找出不同从而找出密钥.

main.c
#include <stdio.h>
static char arr[] = {'a', 'b', 'c', 'd'};
int main(int argc, char *argv[]) {
    int size=sizeof(arr)/sizeof(arr[0]);
    printf("%i\n", size);
    return 0;
}

gcc main.c -o main1
hexdump -C main1 > main1.txt

把arr中a改为v重新编译:
gcc main.c -o main2
hexdump -C main2 > main2.txt

diff main1.txt main2.txt 后能看到变量值
eechen@ubuntu:~$ diff main1.txt main2.txt
41,42c41,42
< 00000280  47 4e 55 00 6d 2e 91 6f  ab a1 ad 30 60 41 36 23  |GNU.m..o...0`A6#|
< 00000290  3c 29 50 22 5b 61 3e 39  01 00 00 00 01 00 00 00  |<)P"[a>9........|
---
> 00000280  47 4e 55 00 9b 09 75 c2  64 54 fe c4 cc d4 a9 ab  |GNU...u.dT......|
> 00000290  fd 34 34 c8 e5 5e b5 73  01 00 00 00 01 00 00 00  |.44..^.s........|
147c147
< 00001040  61 62 63 64 47 43 43 3a  20 28 55 62 75 6e 74 75  |abcdGCC: (Ubuntu|
---
> 00001040  76 62 63 64 47 43 43 3a  20 28 55 62 75 6e 74 75  |vbcdGCC: (Ubuntu|
eechen
eechen
回复 @宏哥 : 不服, @乌龟壳 给了解决方法,就是密钥通过算法生成,并且可以自定义修改加密算法.
宏哥
宏哥
服了没有
554330833a
554330833a
为什么能看到的?不同秘钥加密其他文本应该也变了才对啊
0
554330833a
554330833a
各位程序员,纯css可以定义html标签吗?
0
mickelfeng
mickelfeng
宏哥,具体说说
返回顶部
顶部