美文网首页PHP7编什么程
win下编译tonyenc扩展并使用加密php代码

win下编译tonyenc扩展并使用加密php代码

作者: 沙蒿同学 | 来源:发表于2020-05-28 17:13 被阅读0次

    事出有因,因为公司的web项目是安装在win上的(不要疑惑,就是win,受限于领域和市场等要素,以后再聊这个),提出要对php代码进行加密,经讨论确定使用tonyenc扩展进行php代码加密(之前说使用yakpro.po进行代码混淆,所有工程弄完发现不妥,然后自己有尝试来php-beast扩展,然后还是用不上,大家有需要在出教程吧)

    然后我上网查到有现成的tonyenc.dll扩展可用,可无奈php版本对不上,无法加载使用,会报错

    [26-May-2020 01:22:53 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:/ipwebV2/PHP7/ext\php_tonyenc_php70_x64_nts.dll' - %1 不是有效的 Win32 应用程序
    

    于是乎上网查资料,看到有前人已实现,PHP7VS2015,故在其基础之上实操并完善下教程,并不是说原博主的文章有误,只是添加了些细节,毕竟遇到了各种坑。

    其中我省去了编译安装php的过程,因为我本机已安装来php7.0.1,直接安装自己需要的扩展就好了。

    一、准备工具和文件

    以下工具都是本人成功编译php7.0.1的工具列表,可能如果你要编译的php版本不同需要不同对应不同版本工具或运行库。

    如果你所在的网络不稳定,可能第一步就需要花你很长时间;如果你软件安装过程中出错,你可能需要花更多的时间;如果你坚持,那你花的时间都是值得的。

    Visual Studio 2015

    下载地址

    image.png

    网上说php7要用Visual Studio 2015

    VC14运行库

    下载地址

    image.png

    vc14运行库在哪个地方下载都可以,当然无毒是前提。

    如果你本地已安装更高版本的运行库,例如2017,可能你安装不了,需要卸载在重新安装vc14。

    cygwin工具

    下载地址

    image.png

    Cygwin是一个在windows平台上运行的类UNIX模拟环境,是cygnus solutions公司开发的自由软件(该公司开发的著名工具还有eCos,不过现已被Redhat收购)。它对于学习UNIX/Linux操作环境,或者从UNIX到Windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用GNU工具集在Windows上进行嵌入式系统开发,非常有用

    默认安装到C:\cygwin,这样就不需要修改ext_skel_win32.php

    php7的sdk工具

    下载地址

    image.png

    下载deps-7.1-vc14-x86.7z

    下载地址

    image.png

    php7.0.1源码

    下载地址

    image.png

    下载tonyenc扩展源码

    下载地址

    二、方法步骤

    1、解压sdk工具包

    解压PHP-sdk-binary-tools-20110915.zip,例如解压到D:\vcmyprojects\php-sdk,目录结构如下:

    > D:\vcmyprojects\php-sdk
    > -- bin
    > -- script
    > -- share
    
    image.png

    2、打开VS2015开发人员命令行提示(切记)

    在win左下角的搜索里输入vs2015,然后进入目录D:\vcmyprojects\php-sdk

    D:
    cd D:\vcmyprojects\php-sdk
    
    image.png

    3、设置环境变量

    添加D:\vcmyprojects\php-sdk\bin到path

    D:\vcmyprojects\php-sdk\bin

    4、编辑phpsdk_buildtree.bat

    编辑D:\vcmyprojects\php-sdk\bin\phpsdk_buildtree.bat
    在GOTO EXIT前加入

    MD %_%\vc14\x86\deps\bin
    MD %_%\vc14\x86\deps\lib
    MD %_%\vc14\x86\deps\include
    MD %_%\vc14\x64\deps\bin
    MD %_%\vc14\x64\deps\lib
    MD %_%\vc14\x64\deps\include
    

    5、创建php-sdk目录phpdev

    phpsdk_buildtree.bat phpdev

    查看D:\vcmyprojects\php-sdk目录下多了一个phpdev文件夹

    6、解压deps-7.0-vc14-x86.7z覆盖

    解压deps-7.0-vc14-x86.7z的内容覆盖到D:\vcmyprojects\php-sdk\phpdev\vc14\x86\deps,是我们必要的库文件和工具


    image.png

    7、解压php7.0.1源码

    解压php7.0.1源代码(如果你下载的文件带php.exe就不是源码)到D:\vcmyprojects\php-sdk\phpdev\vc14\x86,命名为php-7.0.1-src


    image.png

    8、编译php的tonyenc扩展

    进入前面生成的扩展文件夹内,执行ext_skel_win32.php文件

    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\ext
    php ext_skel_win32.php --extname=tonyenc
    

    然后你就在ext文件夹内看到生成来tonyenc文件夹


    image.png

    9、使用VS2015打开并设置参数

    打开软件,如果新建出错看下是不是缺少c++的运行环境,根据错误查下缺了什么吧。
    我们来新建一个现有项目


    image.png

    选择C + +


    image.png

    选择你的php扩展文件夹路径,命名tonyenc


    image.png

    选择动态链接库(DLL)项目


    image.png

    直接下一步,后面再设置


    image.png

    设置Release


    image.png

    右键项目属性,C/C++,常规,附加包含目录,编辑


    image.png
    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src
    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\main
    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\main
    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\Zend
    D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\ext\standard
    
    image.png

    右键项目属性,C/C++,预处理器,预处理器定义,编辑,加入以下变量:

    WIN32
    NDEBUG
    _WINDOWS
    _USRDLL
    TONYENC_EXPORTS
    
    image.png

    再链接器-常规中加入

    D:\ipwebV2\PHP7\dev
    
    image.png

    再链接器-输入中加入

    php7.lib
    
    image.png

    然后把 D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\win32\build\config.w32.h.in 复制到 D:\vcmyprojects\php-sdk\phpdev\vc14\x86\php-7.0.1-src\main\config.w32.h (注意没有了后面的 in),然后在 config.w32.h 中加入:

    #define PHP_COMPILER_ID "VC14"
    

    10、覆盖tonyenc代码

    用网上下载tonyenc代码,覆盖tonyenc下代码,点击生成,生成解决方案,将可以在tonyenc目录下存在一个tonyenc.dll文件,这个就是我要的加密扩展了。


    image.png

    三、使用tonyenc扩展加密代码

    image.png

    在win,基于php7.0.1版本下,使用VS2015编译了tonyenc.dll扩展。

    1、加密特征头和密钥

    16进制,自己随便改,这样别人将不容易解密你的代码了

    /* Modify tonyenc_header to disguise your encrypt file */
    const u_char tonyenc_header[] = {
            0x66, 0x88, 0xff, 0x4f,
            0x68, 0x86, 0x00, 0x56,
            0x11, 0x61, 0x16, 0x18,
    };
    /* Modify tonyenc_key to set the secret key */
    const u_char tonyenc_key[] = {
            0x9f, 0x49, 0x52, 0x00,
            0x58, 0x9f, 0xff, 0x23,
            0x8e, 0xfe, 0xea, 0xfa,
            0xa6, 0x33, 0xf3, 0xc6,
    };
    

    2、win使用扩展

    • 将仅加密的tonyenc.dll扩展放置php扩展加载目录中
    • 编辑php.ini文件,添加使用扩展

    3、检验是否加载扩展成功

    如果在win下设置了php环境变量则
    php -m
    

    4、加密方法

    指定加密文件或某一目录下的php文件进行加密(如果是相对路径必须确保能找到改文件或目录)),然后执行命令,例:(执行文件见附件)

    加密文件
    php tonyenc.php test.php
    
    加密目录

    test下有a.php b.php 均会被加密

    php tonyenc.php test
    
    效果

    原文件内容

    <?php
        echo "Hello World";
    

    加密后内容

    fˆÿOj‹[�b��<_pÅp   
    �eÕh 1H�l`o‡WÙrÚdÝ;
    

    5、验证方法

    将刚刚加密后的源代码在任何未集成该tonyenc php扩展的运行环境中,全部报错,无法运行,同时打开源代码,发现全部是大小写字母、数字、特殊字符等等组成的加密文件,完全无法辨识,当在有集成该tonyenc php 扩展的运行环境中打开时,运行完全正常。

    6、测试

    加密扩展 代码 功能 性能
    加载 加密 正常 待测试
    加载 不加密 正常 待测试
    不加载 不加密 正常 待测试
    不加载 加密 不正常 待测试

    7、tonyenc.php代码

    <?php
    /**
     * tonyenc.php: Encrypt or decrypt the script with tonyenc.
     *
     * A high performance and cross-platform encrypt extension for PHP source code.
     *
     * @author:  Tony
     * @site:    lihancong.cn
     * @github:  github.com/lihancong/tonyenc
     */
    if (version_compare(PHP_VERSION, 7, '<'))
        die("PHP must later than version 7.0\n");
    if (php_sapi_name() !== 'cli')
        die("Must run in cli mode\n");
    if (!extension_loaded('tonyenc'))
        die("The extension: 'tonyenc' not loaded\n");
    if ($argc <= 1)
        die("\nusage: php tonyenc.php file.php ...     encrypt the php file(s) or directory(s)\n\n");
    array_shift($argv);
    foreach ($argv as $fileName) {
        if (is_file($fileName)) {
            handle($fileName);
        } elseif (is_dir($fileName)) {
            $DirectoriesIt = new RecursiveDirectoryIterator($fileName, FilesystemIterator::SKIP_DOTS);
            $AllIt         = new RecursiveIteratorIterator($DirectoriesIt);
            $it            = new RegexIterator($AllIt, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
            foreach ($it as $v)
                handle($v[0]);
        } else {
            echo "Unknowing file: '$fileName'\n";
        }
    }
    function handle($file)
    {
        if ($fp = fopen($file, 'rb+') and $fileSize = filesize($file)) {
            $data = tonyenc_encode(fread($fp, $fileSize));
            if ($data !== false) {
                if (file_put_contents($file, '') !== false) {
                    rewind($fp);
                    fwrite($fp, $data);
                }
            }
            fclose($fp);
        }
    }
    
    

    相关文章

      网友评论

        本文标题:win下编译tonyenc扩展并使用加密php代码

        本文链接:https://www.haomeiwen.com/subject/wjyaahtx.html