Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

mój obfuskator - problem projektowy

4 views
Skip to first unread message

Jivanmukta

unread,
Oct 24, 2022, 9:38:52 AM10/24/22
to
Piszę tutaj bo na pl.como.lang.php nie dostałem odpowiedzi.

Napisałem w C++ obfuskator PHP 5/7/8. Obfuskator umożliwia m.in.
zaciemnienie projektu wykorzystującego Composera, tzn. katalog vendor.
Ponieważ obfuskuję samą aplikację a nie frameworki i biblioteki z
katalogu vendor potrzebuję zrobić żeby identifikatory z vendor nie były
zastępowane losowymi. W tym celu analizuję kod frameworków i bibliotek z
katalogu vendor w poszukiwaniu identyfikatorów (zmiennych, funkcji,
metod, właściwości itd.). Problem w tym że jeśli katalog vendor jest
duży, tzn. liczy wiele podkatalogów, proces analizy trwa długo, nawet
kilka godzin. Żeby nie analizować katalogu vendor wielokrotnie (przy
każdej obfuskacji projektu) zapamiętuje znalezione w vendor
identyfikatory w cache'u (pliku xml-owym). Modyfikacja katalogu vendor
(np. dodanie Composerem nowej biblioteki lub update) nie powoduje u mnie
ponownego parsowania całego vendor bo zapamiętuję w cache'u timestampy
podkatalogów vendor.

Czy takie rozwiązanie jest do przyjęcia, tzn. że pierwsza obfuskacja
może trwać nawet kilka godzin, ale późniejsze już w minutach?
Jeśli nie, to czy ktoś mógłby mi rzucić pomysł jak rozwiązać ten
problem? Chcę żeby mój obfuskator był uniwersalny, tzn. potrafił
zaciemnić projekt wykorzystujący różne frameworki i różne biblioteki.

Dużo czasu zajmuje przetwarzanie wyrazeniami regularnymi kazdego wiersza
kazdego pliku duzego katalogu vendor.

const string remembering_regexps[index_what_num][2] =

{{"(static|abstract|final)?\\s*(public)?\\s*(static|abstract|final)?\\s*(function)\\s+("
+ ::identifier + ")\\s*\\(", ""},

{"(static|abstract|final)?\\s*(private|protected|public)?\\s*(static|abstract|final)?\\s*(function)\\s+("
+ ::identifier + ")\\s*\\(", ""},
{"\\b(function)\\s+(" + ::identifier + ")\\s*\\(", ""},

{"(static|private|protected|public)?\\s*(readonly)?\\s*([_a-zA-Z0-9]+)?\\s*(\\$("
+ ::identifier + ")\\s*=.*,?\\s*)+", // uproszczenie

"(static|private|protected|public)?\\s*(readonly)?\\s*([_a-zA-Z0-9]+)?\\s*(\\$("
+ ::identifier + ")\\s*,?\\s*)+"}, // uproszczenie

{"(?!(private|protected|public))\\s*(\\s*|[^:\\-][^:>])\\s*(\\\\\\\\)*\\$("
+ ::identifier + ")", ""}}; // pasuje do "instanceof
$var" a nie pasuje do "self::$prop;" czy "->$prop"

Ponadto dla każdego pliku wywołuję skrypt PHP robiący tokenizację.

Jivanmukta

unread,
Oct 24, 2022, 9:40:42 AM10/24/22
to
Przepraszam omyliłem grupy,chciałem wysłać na pl.comp.programming.

0 new messages