PHP混淆zym解密

PHP混淆zym解密

最近二开过程中,碰到PHP混淆zym加密的问题,刚开始找了好多网站都是付费的,后来在吾爱破解找到了解决方法。
大神解密及调试过程,详见原文:https://www.52pojie.cn/thread-693641-1-1.html

源码

decrypt.php

<?php

function decrypt($data, $key)
{
    $data_1 = '';
    for ($i = 0; $i < strlen($data); $i++) {
        $ch = ord($data[$i]);
        if ($ch < 245) {
            if ($ch > 136) {
                $data_1 .= chr($ch / 2);
            } else {
                $data_1 .= $data[$i];
            }
        }
    }
    $data_1 = base64_decode($data_1);
    $key = md5($key);
    $j = $ctrmax = 32;
    $data_2 = '';
    for ($i = 0; $i < strlen($data_1); $i++) {
        if ($j <= 0) {
            $j = $ctrmax;
        }
        $j--;
        $data_2 .=  $data_1[$i] ^ $key[$j];
    }
    return $data_2;
}

function find_data($code)
{
    $code_end = strrpos($code, '?>');
    if (!$code_end) {
        return "";
    }
    $data_start = $code_end + 2;
    $data = substr($code, $data_start, -46);
    return $data;
}

function find_key($code)
{
    // $v1 = $v2('bWQ1');
    // $key1 = $v1('??????');
    $pos1 = strpos($code, "('" . preg_quote(base64_encode('md5')) . "');");
    $pos2 = strrpos(substr($code, 0, $pos1), '$');
    $pos3 = strrpos(substr($code, 0, $pos2), '$');
    $var_name = substr($code, $pos3, $pos2 - $pos3 - 1);
    $pos4 = strpos($code, $var_name, $pos1);
    $pos5 = strpos($code, "('", $pos4);
    $pos6 = strpos($code, "')", $pos4);
    $key = substr($code, $pos5 + 2, $pos6 - $pos5 - 2);
    return $key;
}

$input_file = $argv[1];
$output_file = $argv[1] . '.decrypted.php';

$code = file_get_contents($input_file);

$data = find_data($code);
if (!$code) {
    echo '未找到加密数据', PHP_EOL;
    exit;
}

$key = find_key($code);
if (!$key) {
    echo '未找到秘钥', PHP_EOL;
    exit;
}

$decrypted = decrypt($data, $key);
$uncompressed = gzuncompress($decrypted);
// 由于可以不勾选代码压缩的选项,所以这里判断一下是否解压成功,解压失败就是没压缩
if ($uncompressed) {
    $decrypted = str_rot13($uncompressed);
} else {
    $decrypted = str_rot13($decrypted);
}
file_put_contents($output_file, $decrypted);
echo '解密后文件已写入到 ', $output_file, PHP_EOL;

使用

php decrypt.php encrypt.php

encrypt.php为需解密的文件

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段代码是在 2048 游戏中初始化界面的方法 initView()。具体解释如下: 首先,通过 findViewById() 方法获取界面中的各种控件,包括 nowScore(当前得分)、bestScore(最高得分)、reset(重置按钮)、zymBtn(作者信息按钮)等。同时,通过 setOnClickListener() 方法设置按钮的点击监听事件。 接下来,通过 PreferenceManager.getDefaultSharedPreferences() 方法获取 SharedPreferences 对象 sp,用于保存游戏数据。同时,通过 sp.edit() 方法获取 SharedPreferences.Editor 对象 editor,用于向 sp 中写入数据。 然后,通过 AnimationUtils.loadAnimation() 方法加载一个动画 compot,用于在游戏中控制方块的合并动画效果。 接下来,通过 LayoutInflater.from() 方法从 game_alert.xml 布局文件中获取一个 View 对象 view1,用于在游戏结束时弹出提示框。然后,通过 AlertDialog.Builder() 方法创建一个 AlertDialog 对象 dialog,设置其为不可取消,将 view1 设置为其视图,最后通过 create() 方法创建弹窗。 接着,分别获取弹窗视图中的两个按钮 alert_retrun(返回主界面)和 alertRestart(重新开始游戏),并分别设置它们的点击监听事件,用于在游戏结束时处理相应的操作。 最后,获取界面中的作者信息按钮 zymBtn,并设置其点击监听事件。当点击该按钮时,可以跳转到作者的个人主页等。 总之,这段代码实现了 2048 游戏中界面的初始化,并设置了相应的按钮点击监听事件,为游戏的正常进行奠定了基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值