[英]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.