代码解密cxx

做淘宝优惠券的时候,搞了一套网站的源码,不过是加密的,现在来尝试解密来熟悉正则表达式

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/9/9
 * Time: 23:07
 */

namespace app\admin\controller;


class Decode extends Controller
{

    public function index()
    {
        $CommonVar = [
            '$_SERVER' => [],
            '$_GET' => [],
            '$GLOBALS' => [],
        ];

        foreach ($GLOBALS as $key => $value) {
            $encode = mb_detect_encoding($key, array("ASCII"));

            if ($encode !== 'ASCII') {
                //$CommonVar['$GLOBALS'][$key] = $value;
            }
        }
        foreach ($_GET as $key => $value) {
            $encode = mb_detect_encoding($key, array("ASCII"));

            if ($encode !== 'ASCII') {
                //$CommonVar['$_GET'][$key] = $value;
            }
        }
        foreach ($_SERVER as $key => $value) {
            $encode = mb_detect_encoding($key, array("ASCII"));

            if ($encode !== 'ASCII') {
                //$CommonVar['$_SERVER'][$key] = $value;
            }
        }


        //halt(get_defined_constants());
        header('Content-type:text/html;Charset=utf-8');

        $filePath = 'application/index/controller/Goods.php';


        $output = file_get_contents($filePath);


        //dump($output);
        $allVar = [];

        getphpCode($output, $allVar, $ErrString);


        $pat_array = [];

        $this->replace_all_isset_global($output, $CommonVar);

        //最后的文本将$this->request->{'param'}类似的转化
        $pattner = '/\{\'([a-zA-Z_]*?)\'\}/';
        preg_match_all($pattner, $output, $pat_array);

        foreach ($pat_array[0] as $key => $value) {
            $output = str_replace($value, $pat_array[1][$key], $output);
        }

        //将最后的文本  defind(xx,xxx); 删掉
        $pattner = '/define\([\s\S]*?\)\;/';
        preg_match_all($pattner, $output, $pat_array);

        foreach ($pat_array[0] as $key => $value) {
            $output = str_replace($value, '', $output);
        }

        //将最后的文本中 return $this->success(    ->   $this->success(
        //将最后的文本中 return $this->error(    ->   $this->error(
        $output = str_replace('return $this->success(', '$this->success(', $output);
        $output = str_replace('return $this->error(', '$this->error(', $output);

        dump($pat_array);
        dump($CommonVar);
        dump($output);
        put_stop($output);
        die;

    }


    /** info:替换所有的已经定义的变量
     * @param $output
     * @param $CommonVar
     */
    public function replace_all_isset_global(&$output,&$CommonVar){
        //先匹配是否有$Ser[xxx] = explode(xxx)格式的,将如$CommonVar
        //匹配是否有explode的数据
        $pattern = '/(\$_SERVER|\$_GET|\$GLOBALS)(\{(.*?)\}|\[(.*?)\])[\s]?\=[\s]?explode\(\'(.*?)\',[\s]*([\s\S]*?)\)\;/';

        $result = preg_match($pattern, $output, $pat_array);

        if($result){
            //explode\('([\s\S]*?)',[\s]*(gzinflate\(substr\('([\s\S]*?)',[\s\S]*?,[\s\S]*?\)\))\)\;
            $pattern = '/(\$_SERVER|\$_GET|\$GLOBALS)(\{(.*?)\}|\[(.*?)\])[\s]?\=[\s]?(explode\(\'(.*?)\',[\s]?(gzinflate\(substr\(\'([\s\S]*?)\',[\s\S]*?,[\s\S]*?\)\))\))\;/';

            $result = preg_match($pattern, $output, $pat_array_li);

            if($result){
                //匹配gzinflate 需要解压缩
                $pat_array = $pat_array_li;
                $explode_result = return_explode($pat_array[5]);

                if(empty($explode_result[0])){
                    $explode_result = explode($pat_array[6],gzinflate_decode($pat_array[8]));
                    if(empty($explode_result[0])){
                        getphpCode($output, $allVar, $gzinflateStr);
                        dump('错误!');
                        halt($gzinflateStr);
                    }
                }
                dump('解析出数组');
                dump($explode_result);
                $variable_name = $pat_array[1];
                if(!empty($pat_array[3])){
                    $key_name = $pat_array[3];
                }else{
                    $key_name = $pat_array[4];
                }
                $CommonVar[$variable_name][$key_name] = $explode_result;

                $str = PHP_EOL . $variable_name . '[' . $key_name . '] = ' . array_format_echo($explode_result) . ';' . PHP_EOL;
                //如果匹配上了的话,将字符串格式话成数组拼接转化
                $output = str_replace($pat_array[0], $str, $output);
                $this->replace_all_global_variable($output,$CommonVar);
                //put_stop($output);
                //转换之后  删除第一次匹配
                $output = str_replace($str, PHP_EOL, $output);

            }else{
                ob_clean();
                //没有匹配到需要gzinflate解码的数据
                //不需要解压缩,直接获得explode之后的数据
                //$pattern = '/(\$_SERVER|\$_GET|\$GLOBALS)(\{([\s\S]*?)\}|\[([\s\S]*?)\])[\s]?\=[\s]?explode\(\'([\s\S]*?)\',[\s]?\'(.*?)\'\)\;/';
                //注意: 由于正则表达式中 . 表示出换行符以外的所有单个字符,所以需要用到[\s\S]
                $pattern = '/(\$_SERVER|\$_GET|\$GLOBALS)(\{(.*?)\}|\[(.*?)\])[\s]?\=[\s]?explode\(\'(.*?)\',[\s]?\'([\s\S]*?)\'\)\;/';
                $result = preg_match($pattern, $output, $pat_array);
                dump('66');

                if($result){
                    $variable_name = $pat_array[1];
                    //如果匹配到第三个、第四个有一个OK
                    if(!empty($pat_array[3])){
                        $key_name = $pat_array[3];
                    }else{
                        $key_name = $pat_array[4];
                    }
                    //explode爆裂后的数据
                    $explode_result = explode($pat_array[5],stripcslashes($pat_array[6]));
                    if(count($explode_result)>1){
                        //加入全局数组
                        $CommonVar[$variable_name][$key_name] = $explode_result;
                    }else{
                        $explode_result = explode($pat_array[5],$pat_array[6]);
                        //加入全局数组
                        $CommonVar[$variable_name][$key_name] = $explode_result;
                    }

                    //将匹配到的explode格式话成数组格式
                    $str = PHP_EOL . $variable_name . '[' . $key_name . '] = ' . array_format_echo($explode_result) . ';' . PHP_EOL;
                    $output = str_replace($pat_array[0], $str, $output);

                    //替换所有变量
                    $this->replace_all_global_variable($output,$CommonVar);

                    //转换之后  删除第一次匹配
                    $output = str_replace($str, PHP_EOL, $output);
                }
            }
            dump($output);
            //替换文中引用全局变量的变量
            $this->replace_yinyong_variables($output,$CommonVar);
            dump($CommonVar);

            //持续替换已定义的变量
            $this->replace_all_isset_global($output,$CommonVar);

        } else{

            //ob_clean();
            //halt($CommonVar);
            //替换文中引用全局变量的变量
            //$this->replace_yinyong_variables($output,$CommonVar);
            //替换所有变量
            $this->replace_all_global_variable($output,$CommonVar);

        }
    }


    //替换所有的全局变量
    public function replace_all_global_variable(&$output,&$CommonVar){
        $End = 0;
        foreach($CommonVar as $variable_name=>$variable_value){
            $break = 0;
            foreach($variable_value as $key=>$value){
                $explode_result = $CommonVar[$variable_name][$key];
                dump($variable_name);
                dump($key);
                $key = trim($key,'\'');
                //四种   $variable_name[$value]
                //四种   $variable_name['\''.$value.'\'']
                //四种   $variable_name{$value}
                //四种   $variable_name{'\''.$value.'\''}
                $i=0;

                $pattern[1] = '/'.preg_quote($variable_name.'['.$key.']').'(\{([^\{^\[]*?)\}|\[([^\[^\{]*?)\])/';
                $pattern[2] = '/'.preg_quote($variable_name.'[\''.$key.'\']').'(\{([^\{^\[]*?)\}|\[([^\[^\{]*?)\])/';
                $pattern[3] = '/'.preg_quote($variable_name.'{'.$key.'}').'(\{([^\{^\[]*?)\}|\[([^\[^\{]*?)\])/';
                $pattern[4] = '/'.preg_quote($variable_name.'{\''.$key.'\'}').'(\{([^\{^\[]*?)\}|\[([^\[^\{]*?)\])/';
                foreach($pattern as $k=>$v){
                    preg_match_all($v,$output,$pat_array);
                    dump($pat_array);
                    if(count($pat_array[0])>0){
                        $this->replace_global_variable($output,$pat_array,$explode_result);
                    }else{
                        $i++;
                    }
                }
                if($i==4){
                    //如果四种模式都没有匹配,父级foreach跳出
                    $break=1;
                    continue;
                }
            }
            if($break==1){
                $End = 1;
                continue;
            }
        }
        if($End !== 1){
            $this->replace_all_global_variable($output,$CommonVar);
        }
    }

    public function replace_global_variable(&$output, $pat_array, $explode_result)
    {

        foreach ($pat_array[0] as $key => $value) {
            $index = $pat_array[2][$key];
            if ($index !== '') {
                //dump($index);
                if (isset($explode_result[$index])) {

                    $relace_str = $explode_result[$index];
                    //dump('有-'.$relace_str);
                    if (!function_exists($relace_str)) {
                        $relace_str = array_format_echo($relace_str);
                    }
                    //dump($value);dump('=>');dump($relace_str);
                    $output = str_replace($value, $relace_str, $output);
                }else{
                    //dump('没有');
                }
            }
        }

        //一个是字符串
        foreach ($pat_array[0] as $key => $value) {
            $index = $pat_array[3][$key];
            if ($index !== '') {
                if (isset($explode_result[$index])) {
                    $relace_str = $explode_result[$index];
                    //dump('有-'.$relace_str);
                    if (!function_exists($relace_str)) {
                        $relace_str = array_format_echo($relace_str);
                    }
                    //dump($value);dump('=>');dump($relace_str);
                    $output = str_replace($value, $relace_str, $output);
                }else{
                    //dump('没有');
                }
            }
        }
    }

    /** 匹配到 $var_xx = &$Goll[xx];
     * @param $output
     * @param $CommonVar
     */
    public function replace_yinyong_variables(&$output,&$CommonVar){

        $pattern = '/(\$var_[0-9]*?)+[\s]?\=[\s]?[\&]?[\s]?((\$_SERVER|\$_GET|\$GLOBALS)(\{([^\[^\{]+?)\}|\[([^\[^\{]+?)\]+?))\;/';
        preg_match_all($pattern, $output, $pat_array);
        //匹配所有经引用的变量
        dump('匹配所有经引用的变量');
        dump($pat_array);
        if (count($pat_array[0])>0) {
            foreach ($pat_array[5] as $key => $value) {
                $replcae_var = $pat_array[1][$key];
                $variable_name = $pat_array[3][$key];
                $key_name = $value;
                if(isset($CommonVar[$variable_name][$key_name])){
                    $decode_result = $CommonVar[$variable_name][$key_name];
                }else{
                    $decode_result = $CommonVar[$variable_name]['\''.$key_name.'\''];
                }
                $CommonVar[$replcae_var] = $CommonVar[$variable_name];

                if(!empty($decode_result)){
                    $pattern = '/' . preg_quote($replcae_var) . '(\{([^\[]+?)\}|\[([^\}]+?)\]+?)/';
                    preg_match_all($pattern, $output, $pat_array_li);
                    $this->replace_global_variable($output,$pat_array_li,$decode_result);
                    //清除无效的
                    $output = str_replace($pat_array[0][$key], PHP_EOL, $output);
                }

            }
            //开始替换:  方法里面重新定义变量,引用了全局变量
        }

    }

}


 

转载于:https://my.oschina.net/querying/blog/1555065

<think>好的,用户之前询问了如何在Linux系统中防止被录屏,现在转向安卓环境下对Linux代码进行加密以及防止录屏的解决方案。需要结合用户提供的引用内容,尤其是引用1到5,来构建回答。首先,用户的需求是双重的:代码加密和防录屏。 用户提到的引用中,引用1和4讨论了Adiantum加密和Android的文件级加密(FBE),这可能与代码加密相关。引用3和5涉及代码混淆和沙盒加密方案,这对保护代码有帮助。引用2提到数据静止加密,可能适用于存储中的代码保护。 首先,代码加密方面,需要考虑静态加密和动态保护。Adiantum加密适用于低端设备,而FBE和PDE则是Android内置的加密机制。另外,用户可能需要在应用层使用代码混淆和C/C++代码加密,如使用O-LLVM和动态加载.so文件。 防录屏方面,引用中的内容没有直接提到,但之前的回答涉及了Linux的防护措施,可能需要调整到安卓环境。安卓的FLAG_SECURE可以防止截屏和录屏,同时动态水印和硬件叠加层(如ARM的TrustZone)可能有效。 还需要考虑沙盒方案,如引用5提到的SDC沙盒加密,可能适用于源代码保护,但需要评估其适用性。此外,安全开发实践如权限管理和双向证书认证可以增强整体安全性。 需要整合这些点,分层次回答,涵盖加密方法、防录屏技术、沙盒方案和安全实践,并确保引用相关的引用内容。同时,检查是否有遗漏的用户需求,比如是否涉及内核模块或企业级解决方案,但根据当前问题,可能主要集中在应用层和系统层的防护。</think>### 安卓环境下Linux代码加密与防录屏综合方案 --- #### 一、代码加密技术 ##### 1. **静态代码加密** - **Adiantum文件加密** 针对低性能设备(无AES指令集),使用Android 9+支持的Adiantum算法加密代码文件: ```bash # 启用文件系统级加密(需内核支持) vdc cryptfs enable adiantum /dev/block/by-name/userdata ``` 加密后所有文件(包括Linux交叉编译的.so/.a库)内容及文件名均被加密[^1]。 - **FBE/PDE加密(File-Based Encryption)** 利用Android原生文件级加密机制,结合Linux内核的EXT4加密特性: ```c // 在Android.mk中声明加密策略 LOCAL_ENCRYPTION_MODULE := file LOCAL_ENCRYPTION_KEY := hardware_specific_key ``` 该方案通过vold服务管理CE(Credential Encrypted)和DE(Device Encrypted)密钥[^4]。 ##### 2. **动态内存保护** - **C/C++代码混淆加密** 使用O-LLVM(Obfuscator-LLVM)实现: ```cmake set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mllvm -sub -mllvm -bcf") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mllvm -fla -mllvm -split") ``` 配合资源混淆工具(如AndResGuard),将Linux库中的符号表加密为不可读格式[^3]。 - **动态加载保护** 通过分段加载加密的.so文件: ```java // 使用AndroidKeyStore管理解密密钥 KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); cipher.init(Cipher.DECRYPT_MODE, keyStore.getKey("lib_key", null)); // 动态解密加载 byte[] encryptedLib = Files.readAllBytes(Paths.get("encrypted_lib.so")); byte[] decryptedLib = cipher.doFinal(encryptedLib); System.loadLibrary(new String(decryptedLib)); ``` --- #### 二、防录屏技术 ##### 1. **系统级防护** - **FLAG_SECURE应用** 在Activity中设置防截屏标志: ```java getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` 该标志同时阻止第三方录屏工具(需配合Android 10+的`MediaProjection`白名单机制)。 - **安全显示协议** 使用Android特有的硬件叠加层(Overlay Composition): ```c // SurfaceFlinger配置 surface->setFlags(SurfaceControl::SECURE, SurfaceControl::SECURE); surface->setLayer(INT_MAX); // 置于最顶层 ``` 结合DRM框架(如Widevine L1)实现内容加密输出[^2]。 ##### 2. **应用层防护** - **动态水印注入** 基于OpenGL ES的实时渲染水印: ```glsl // 片段着色器添加动态水印 vec4 watermark = texture2D(u_Watermark, v_TexCoord); gl_FragColor = mix(originalColor, watermark, 0.3); ``` 水印信息包含用户身份与时间戳(加密存储于TEE环境)。 - **输入事件过滤** 拦截录屏触发的`MediaProjection`回调: ```java mediaProjection.registerCallback(new MediaProjectionCallback() { @Override public void onStop() { // 触发安全擦除操作 secureEraseFrameBuffer(); } }, null); ``` --- #### 三、沙盒化运行方案 ##### 1. **基于SEAndroid的强制访问控制** 定制安全策略限制代码访问范围: ```te # 限制Linux进程访问图形子系统 deny untrusted_app_type surfaceflinger_service:service_manager find; deny untrusted_app_type gpu_device:chr_file { read write }; ``` ##### 2. **硬件级隔离** 利用ARM TrustZone创建安全执行环境: ```c // 在TEE中运行敏感代码 TEEC_Result res = TEEC_InvokeCommand( &session, TA_CRYPT_CMD_ENCRYPT, &operation, &origin ); ``` 配合QSEE(Qualcomm Secure Execution Environment)实现密钥安全存储[^5]。 --- #### 四、企业级解决方案对比 | 方案类型 | 技术手段 | 防护强度 | 兼容性 | 实施成本 | |----------------|-------------------------|----------|--------|----------| | 静态加密 | Adiantum/FBE | ★★★★☆ | 高 | 低 | | 动态混淆 | O-LLVM+资源混淆 | ★★★☆☆ | 中 | 中 | | 硬件隔离 | TrustZone+DRM | ★★★★★ | 低 | 高 | | 沙盒化运行 | SEAndroid策略定制 | ★★★★☆ | 中 | 中 | --- ### 实施路线图 1. **基础防护**:优先启用FLAG_SECURE(防录屏)与FBE加密(代码保护) 2. **增强防护**:部署O-LLVM混淆+动态水印系统(需NDK开发支持) 3. **终极防护**:结合TEE安全芯片与定制SEAndroid策略(需硬件厂商配合) --- ### 相关问题 1. 如何检测Android设备是否支持Adiantum加密? 2. 在非root设备上如何实现.so文件的动态解密加载? 3. TrustZone技术在移动端安全防护中的具体应用场景有哪些? 4. 企业如何集中管理Android设备的防录屏策略? [^1]: Android官方文档关于低性能设备加密方案的技术规范 [^2]: ARM架构安全白皮书中关于TrustZone的实现细节 [^3]: OWASP Mobile Security Testing Guide中的代码混淆标准 [^4]: Linux内核文档中EXT4加密子系统的实现原理 [^5]: 芯片厂商(如Qualcomm)提供的TEE开发指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值