2017-08-14 11 views
0

J'ai un morceau de code obfuscated que je veux revenir à la normale.Comment regex match et regex remplacer la chaîne en php

Je suis venu avec une idée de preg_replace_callback() simple et un preg_match() emboîtés dedans pour le remplacement.

Pour une raison que mon code ne veut pas correspondre, en particulier la preg_match dans le rappel

Voici un extrait de mon code.

Dans mon debbuging les tableaux de preg_match_all() (j'ai essayé aussi régulièrement preg_match()) retourner vide bien que cela fonctionne en dehors du rappel.

<?php 
$code = ' 
public function encrypt($UDw2y33pQ_22) { 
     goto eKGyEfM327pq; 
    YlzBCxTNCJzo: 
     $p7nCDJiybOtp = mcrypt_create_iv($I9ryzFUJtil4, 
    MCRYPT_RAND); 
     goto zqGNmmifhK7G; 
    eKGyEfM327pq: 
     $IE19PrOpdkbJ = "*[email protected]$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; 

Résultat réel:

public function encrypt($UDw2y33pQ_22) { 

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

eKGyEfM327pq: 
    $IE19PrOpdkbJ = "*[email protected]$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: 
} 

Résultat attendu:

public function encrypt($UDw2y33pQ_22) { 
    $IE19PrOpdkbJ = "*[email protected]$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

Quelle est la réponse réelle et attendue? – ggdx

+0

Désolé, merci de signaler cela. J'ai édité le post pour refléter ceux-ci – Repastificationer

+0

Vous essayez de désobjecter le code? Est-ce votre code? Semble bizarre que vous essayez de désobferger une fonction de chiffrement. – GrumpyCrouton

Répondre

2

$code est undefined la fermeture. Vous devez le passer par l'instruction use. Exemple:

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

Vous devriez également vérifier les clés existantes avant d'essayer de revenir $a[0][2].