简体   繁体   English

如何在PHP中进行正则表达式匹配和正则表达式替换字符串

[英]How to regex match and regex replace string in php

i have a piece of obfuscated code that i want to turn back to normal. 我有一段混淆的代码,我想恢复正常。

I came up with an idea of simple preg_replace_callback() and a preg_match() nested within it for the replacement. 我想到了一个简单的preg_replace_callback()和嵌套在其中的preg_match()进行替换的想法。

For some reason though my code does not want to match, specially the preg_match in the callback 由于某些原因,尽管我的代码不想匹配,特别是回调中的preg_match

Here is a snippet of my code. 这是我的代码片段。

In my debbuging the arrays of preg_match_all() (I've tried regular preg_match() as well) return empty although it works outside of the callback. 在调试过程中, 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;

Actual result: 实际结果:

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: 
}

Expected result: 预期结果:

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 is undefined within the closure. $code在闭包内未定义。 You need to pass it via use statement. 您需要通过use语句传递它。 Example: 例:

$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);

You should also check for existing keys before trying to return $a[0][2] . 您还应在尝试返回$a[0][2]之前检查现有键。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM