Как регулярное выражение сопоставить и заменить строку в переполнении стека

У меня есть часть запутанного кода, который я хочу вернуть к нормальной жизни.

У меня возникла идея простого 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);
}

0

Решение

$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],

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]