如何正则表达式匹配和正则表达式替换php中的字符串

再塑化剂

我有一段混淆代码,我想恢复正常。

我想出了一个简单的想法,preg_replace_callback()并在其中preg_match()嵌套进行替换。

出于某种原因,虽然我的代码不想匹配,特别是回调中的 preg_match

这是我的代码片段。

在我的调试中,preg_match_all()(我也尝试过常规preg_match()的数组返回空,尽管它在回调之外工作。

<?php
$code = '
public function encrypt($UDw2y33pQ_22) { 
        goto eKGyEfM327pq; 
    YlzBCxTNCJzo: 
        $p7nCDJiybOtp = mcrypt_create_iv($I9ryzFUJtil4, 
    MCRYPT_RAND); 
        goto zqGNmmifhK7G; 
    eKGyEfM327pq: 
        $IE19PrOpdkbJ = "*97@$S8&8&*as&*SA7sa*SA7alnIU&7#$%gf^IsPj8"; 
        goto uR63Cxb5ZtRs; 
    uR63Cxb5ZtRs: 
        $I9ryzFUJtil4 = mcrypt_get_iv_size(MCRYPT_BLOWFISH, 
    MCRYPT_MODE_ECB); 
        goto YlzBCxTNCJzo; 
    TdHsUlVktK5b: 
        return base64_encode($pcLABic8Iiv1); 
        goto XJlxnac4pgAr; 
    zqGNmmifhK7G: 
        $pcLABic8Iiv1 = mcrypt_encrypt(MCRYPT_BLOWFISH, $IE19PrOpdkbJ, utf8_encode($UDw2y33pQ_22), MCRYPT_MODE_ECB, $p7nCDJiybOtp); 
        goto TdHsUlVktK5b; 
    XJlxnac4pgAr: 
}';
$deobfuscated = preg_replace_callback("/goto ([a-zA-Z0-9_]+);/", function($match){
    preg_match_all("/({$match[1]}:)((\s|\S)*?)([a-zA-Z0-9]{12}:)/ms", $code, $a);
    return $a[0][2];
},$code);

echo $deobfuscated;

实际结果:

public function encrypt($UDw2y33pQ_22) { 

YlzBCxTNCJzo: 
    $p7nCDJiybOtp = mcrypt_create_iv($I9ryzFUJtil4, MCRYPT_RAND); 

eKGyEfM327pq: 
    $IE19PrOpdkbJ = "*97@$S8&8&*as&*SA7sa*SA7alnIU&7#$%gf^IsPj8"; 

uR63Cxb5ZtRs: 
    $I9ryzFUJtil4 = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 

TdHsUlVktK5b: 
    return base64_encode($pcLABic8Iiv1); 

zqGNmmifhK7G: 
    $pcLABic8Iiv1 = mcrypt_encrypt(MCRYPT_BLOWFISH, $IE19PrOpdkbJ, utf8_encode($UDw2y33pQ_22), MCRYPT_MODE_ECB, $p7nCDJiybOtp); 

XJlxnac4pgAr: 
}

预期结果:

public function encrypt($UDw2y33pQ_22) { 
    $IE19PrOpdkbJ = "*97@$S8&8&*as&*SA7sa*SA7alnIU&7#$%gf^IsPj8"; 
    $I9ryzFUJtil4 = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); 
    $p7nCDJiybOtp = mcrypt_create_iv($I9ryzFUJtil4, MCRYPT_RAND); 
    $pcLABic8Iiv1 = mcrypt_encrypt(MCRYPT_BLOWFISH, $IE19PrOpdkbJ, utf8_encode($UDw2y33pQ_22), MCRYPT_MODE_ECB, $p7nCDJiybOtp); 
    return base64_encode($pcLABic8Iiv1);
}
尼尔斯·鲁克曼

$code在闭包中未定义。您需要通过use语句传递它例子:

$deobfuscated = preg_replace_callback("/goto ([a-zA-Z0-9_]+);/", function($match) use ($code) {
    preg_match_all("/({$match[1]}:)((\s|\S)*?)([a-zA-Z0-9]{12}:)/ms", $code, $a);
    return $a[0][2];
},$code);

您还应该在尝试返回之前检查现有密钥$a[0][2]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章