suche Regex für php variablen
TheOneAndOnly
- php
ich suche einen passenden regex um nach php variablen zu parsen, wobei allerdings variablen mit $_ wie zb $_SESSION ausgeschlossen werden sollen aber $variable_nr_1 möglich sind
hat da jemand was für mich??? Wenn Ihr wissen wollt wozu das ganze ... sagen
wir ich versuche variablen durch einen md5 des variablennamens zu ersetzen um
das ganze ein wenig unleserlicher vor der veröffentlichung gestalten zu können
und da ich festgestellt habe das die ganzen obfuscator nicht wirklich so funktionieren wie sie sollen versuche ich das jetzt mal per hand, oder gibts da iwo en tutorial zu???
würde das gehen "#$([A-Za-z0-9]+)([a-zA-Z_0-9]*)#" ???
Also ich hab jetzt mal mit dem o.g. regex probiert eine php datei nach variablen zu parsen und diese auszugeben, allerdings bekomm ich immer nur
array(0) {
}
ausgegeben anstatt die einzelnen variablen
hier mal der code dazu
#Öffne Die Datei, die geparst werden soll
$fh= fopen("database.php", "r");
#Durchlaufe mit einer Schleife jede Zeile
while(!feof($fh))
{
//Hole die beiden Strings für Variable und Wert
$input = fgets($fh, 1024);
//vor und nach Istgleich-Zeichen können 1 oder mehrere Leerzeichen stehen
preg_match("#\$([A-Za-z0-9]+)([a-zA-Z_0-9]*)#", $input, $find, PREG_OFFSET_CAPTURE);
echo "<pre>";
var_dump($find);
}
kann mir da mal bitte einer helfen das das funzt??? ich würde gerne letztendlich per preg_replace eine variable wie $variable durch $md5('variable') ersetzen
Also ich hab es jetzt mal soweit, dass er mir per vardump die passenden variablen ausgibt, allerdings hab ich dazu noch ne Frage
hier der derzeitige code
#Öffne Die Datei, die geparst werden soll
$fh= fopen("database.php", "r");
#Durchlaufe mit einer Schleife jede Zeile
while(!feof($fh))
{
//Hole die beiden Strings für Variable und Wert
$input = fgets($fh, 1024);
//vor und nach Istgleich-Zeichen können 1 oder mehrere Leerzeichen stehen
preg_match("#[\$]{1}([A-Za-z0-9]+[a-zA-Z_0-9]*)#", $input, $find);//, PREG_OFFSET_CAPTURE*/); //""
echo "<pre>";
var_dump($find);
}
allerdings bekomm ich ne ausgabe wie:
array(0) {
}
array(0) {
}
array(2) {
[0]=>
string(11) "$connection"
[1]=>
string(10) "connection"
}
array(2) {
[0]=>
string(17) "$num_active_users"
[1]=>
string(16) "num_active_users"
}
so ich hab das ganze auch mal mit preg_replace probiert, aber ich bekomme
die ursprünglichen Zeilen wieder genau wie sie waren in die neue Datei geschrieben
und würde das überhaupt funktionieren mit dem replace parameter: "$".md5("\1") in preg_replace???
Hi,
und würde das überhaupt funktionieren mit dem replace parameter: "$".md5("\1") in preg_replace???
Nein, weil der Funktionsaufruf ausgewertet wird, bevor das Ersetzen stattfindet. Da bräuchte es den Modifier e, bzw. preg_replace_callback.
Falls mir ein Kommentar zum Vorhaben an sich erlaubt ist - ich finde es hochgradig unsinnig.
MfG ChrisB
Ja ich weiss ich möchte es trotzdem probieren ob ich so ne Art Obfuscator hin bekomme. Ich habs auch soweit am laufen aber jetzt steh ich vor dem Problem, dass ich $this aus dem regex irgendwie ausschliesen muss, wie kann ich das machen? kann ich irgendwie sagen das $this bzw this nicht vorkommen darf??
im preg_match ginge das wahrscheinlich so: "#[$]{1}[this]{0}...., oder???
hier mal den testcode den ich bis jetzt zusammen habe:
<?php
#Öffne Die Datei, die geparst werden soll
$fi = fopen("database.php", "r");
$fo = fopen("database2.php", "w");
$search = array();
$replace = array();
$counter = 0;
#Durchlaufe mit einer Schleife jede Zeile
while(!feof($fi))
{
//Hole die beiden Strings für Variable und Wert
$input = fgets($fi, 1024);
//nach funktion matchen
preg_match("#function ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", $input, $find);
$search[$counter]["forc"]= $find[1]; // funktionsnamen in array speichern
$replace[$counter]["forc"]= md5($find[1]); // funktionsnamen encryptet speichern
//Setze den Zeilen-Zähler hoch
$counter++;
//nach class matchen
preg_match("#class ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", $input, $find);
$search[$counter]["forc"]= $find[1]; // classenamen in array speichern
$replace[$counter]["forc"]= md5($find[1]); // classennamen encryptet speichern
//Setze den Zeilen-Zähler hoch
$counter++;
// funktionsnamen ersetzen
$input = preg_replace("#function ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "function ".(md5("\\1")), $input);
// klassennamen ersetzen
$input = preg_replace("#class ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "class ".(md5("\\1")), $input);
// variablennamen ersetzen
$input = preg_replace("#[\$]{1}([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "$".md5("\\1"), $input);
//bezeichner aus array ersetzen
$input = preg_replace($search, $replace, $input);
fputs($fo, $input);
//echo $input."<br>";
}
//echo "<pre>";
//var_dump($array);
?>
sorry der code war etwas fehlerhaft hier mal den koriigierten mit dem ausgeschlossenen $this-> ...
allerdings bekomm ich es nicht hin, das er mir das search und replace array als preg_replace ausführt ... scheint irgendwie zu groß zu werden
<?php
#Öffne Die Datei, die geparst werden soll
$fi = fopen("database.php", "r");
$fo = fopen("database2.php", "w");
$search = array();
$replace = array();
$counter = 0;
#Durchlaufe mit einer Schleife jede Zeile
while(!feof($fi))
{
//Hole die beiden Strings für Variable und Wert
$input = fgets($fi, 1024);
//nach funktion matchen
preg_match("#function ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", $input, $find);
if(!empty($find[1])) {
$search[$counter] = "#".$find[1]."#"; // funktionsnamen in array speichern
$replace[$counter] = md5($find[1]); // funktionsnamen encryptet speichern
//Setze den Zeilen-Zähler hoch
$counter++;
}
if(!empty($find[1]) && $find[1]!= "") {
//nach class matchen
preg_match("#class ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", $input, $find);
$search[$counter] = "#".$find[1]."#"; // classenamen in array speichern
$replace[$counter] = md5($find[1]); // classennamen encryptet speichern
//Setze den Zeilen-Zähler hoch
$counter++;
}
// funktionsnamen ersetzen
$input = preg_replace("#function ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "function ".(md5("\\1")), $input);
// klassennamen ersetzen
$input = preg_replace("#class ([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "class ".(md5("\\1")), $input);
// variablennamen ersetzen
$input = preg_replace("#[\$]{1}(?!this->)([A-Za-z0-9]+[a-zA-Z_0-9]*)#", "$".md5("\\1"), $input);
//bezeichner aus array ersetzen
//$input = preg_replace($search, $replace, $input);
echo $input."<br>";
fputs($fo, $input);
//echo $input."<br>";
}
echo "<pre>";
var_dump($search);
var_dump($replace);
?>
ne funktioniert doch nicht so ganz ... er ersetz mir alles mit dem md5 von \1
anstatt mit dem gefundenen Ausdruck von dem regex
Hi,
ne funktioniert doch nicht so ganz ... er ersetz mir alles mit dem md5 von \1
anstatt mit dem gefundenen Ausdruck von dem regex
Als ob ich dich darauf nicht längst schon hingewiesen hätte.
MfG ChrisB
so das mit dem tokenizer klappt ganz gut soweit, dennoch hab ich ne Frage
ich lese das file mit file_get_contents in einen string ein und wollte mit nl2br die zeilenumbrüche schonmal umwandeln, funktioniert aber nicht so, und ich hab des mit dem Tokenizer nicht so ganz gebacken bekommen auf linebreaks zu matchen, wie kann ich das zum laufen bekommen dasser mir die linebreaks erkennt??
Hi,
Ich habs auch soweit am laufen aber jetzt steh ich vor dem Problem, dass ich $this aus dem regex irgendwie ausschliesen muss, wie kann ich das machen? kann ich irgendwie sagen das $this bzw this nicht vorkommen darf??
im preg_match ginge das wahrscheinlich so: "#[$]{1}[this]{0}...., oder???
Nein.
[this] wäre die Zeichenklasse, die die Zeichen t, h, i und s enthält.
Ja ich weiss ich möchte es trotzdem probieren ob ich so ne Art Obfuscator hin bekomme.
Dann würde ich da wenigstens mit dem Tokenizer rangehen.
Das erspart dir das Zerlegen des Codes mit aufwendigen regulären Ausdrücken.
Du müsstest dann nur schauen, welche Tokens du dir generell vornehmen und „ersetzen“ möchtest.
MfG ChrisB
ok hab ich zwar noch nicht mit gearbeitet, ich probiers mal ... das andere hab
ich erstmal soweit das es läuft, bis auf das wenn die funktionsbezeichner
wenn die funktion irgendwo aufgerufen wird noch nicht ersetz werden
Hi!
Ja ich weiss ich möchte es trotzdem probieren ob ich so ne Art Obfuscator hin bekomme.
Du wirst auf relativ einfache Weise nur die variablen Bestandteile des Codes - also alle selbst gewählten Bezeichner - ändern können. Alle anderen Bestandteile braucht PHP, um intentionsgemäß zu laufen. Du hast dann zwar sinnbildlich in einem Haus alle Türschilder und die Namen der selbst mitgebrachten Einrichtungsgegenstände entfernt, doch ein geübtes Auge kann immer noch die Funktions an gewissen Äußerlichkeiten und vor allem anhand der Arbeitsweise erkennen. Es lohnt sich nicht besonders, allgemeinen Code, wie er überall in rauhen Mengen zu finden ist, zum Beispiel Datenbankabfragen, zu verschleiern. Wenn du irgendwas verstecken willst, solltest du dich auf einmalige Geschäftslogik konzentrieren, die den entscheidenden Unterschied zur Konkurrenz darstellt.
Lo!
Hello,
ich suche einen passenden regex um nach php variablen zu parsen
Warum immer mit Kanonen auf Spatzen?
In get_defined_vars() stehen sie doch alle drin.
http://de.php.net/manual/de/function.get-defined-vars.php
Und dann brauchst Du sie nur noch nach Länge zu sortieren (längste zuerst) und eine Stringersetzung durchzuführen.
str_replace() sollte reichen.
Ggf. wirst Du vorher noch prüfen, ob direkt _nach_ dem String auch ein Variablen-Begrenzerzeichen folgt.
Bleibendes Problem wird allerdings die Stringbehandlung als solche bleiben. Doppelte gegen einfache Anführungszeichen - da wird vermutlich auch mal eine 'Variable' gesichtet werden können, die an dieser Stelle keine ist.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg