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

mój obfuskator - problem projektowy

18 views
Skip to first unread message

Jivanmukta

unread,
Oct 11, 2022, 8:22:28 AM10/11/22
to
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ę 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.

Roman Tyczka

unread,
Oct 15, 2022, 1:52:44 PM10/15/22
to
On 11.10.2022 14:22, Jivanmukta wrote:
> Czy takie rozwiązanie jest do przyjęcia, tzn. że pierwsza obfuskacja
> może trwać nawet kilka godzin, ale późniejsze już w minutach?

A co jest tak długotrwałym procesem? Bo te kilka godzin to jakieś grube
nieporozumienie. Czytanie dysku to sekundy, może kilkadziesiąt, a
parsowanie na wielu wątkach też powinno wyrywać z kapci, zatem... co
tyle trwa?

--
pzdr
Roman


Jivanmukta

unread,
Oct 19, 2022, 2:10:19 AM10/19/22
to
W dniu 15.10.2022 o 19:52, Roman Tyczka pisze:
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"


Jivanmukta

unread,
Oct 19, 2022, 6:32:41 AM10/19/22
to
Ponadto dla każdego pliku wywołuję skrypt PHP robiący tokenizację.

Jivanmukta

unread,
Jan 14, 2024, 10:27:05 AM1/14/24
to
Mam jeszcze jedno pytanie:
Mój obfuskator ma możliwość sprawdzania poprawności składniowej kodu
obfuskowanego projektu (php -l). Używa do tego zainstalowanej wersji
PHP. Z pewnych przyczyn musi to być >= 8.0. Jednak projekt może być
napisany w starszej wersji, np. 5.6. Dobrze by było sprawdzać projekt
dla tej wersji, tzn. przydałaby się opcja w obfuskatorze: --phpver=5.6
Jak podejść do tego problemu, bo chyba w C++ nie da się zmienić numeru
wersji używanego PHP...
0 new messages