Aramızda PHP ile yakından ilgilenen arkadaşlar olduğu için bugün karşılaştığım bir olayı sizlerle paylaşmak istedim. Ben 2002 yılından beri Zend Encoder (yeni ismiyle Zend SafeGuard Suite ya da kısaca Zend Guard) kullanıyorum. Bu tool PHP dosyalarını byte codelara çevirip, daha sonra exe benzeri bir yapıya getirerek hem şifrelemiş oluyor, hem de birçok optimizasyon ile daha hızlı çalışmasını sağlıyor. Ancak çok uzun süreli lisans satmıyor Zend firması, senelik lisanslar alabiliyoruz. Bu yüzden de her sene ister istemez versiyon upgrade'i yapmamız gerekiyor.
Encode edilmiş dosyaların web server üzerinden çalışabilmesi için ise servera ücretsiz olan Zend Optimizer install edilmesi gerekiyor. Aslında mantık güzel. Kodlarını saklamak isteyen firma parayı basıyor, ancak müşteriye satarken ekstra bedel gerektirmediği için ürünün fiyatına yansımıyor.
şimdi bu ön bilgilerden sonra gelelim en son updatei yaptıktan sonra başıma gelen olaya. Yeni Guard toolu (encoder) bazı eklentilerle geldi. Bunlardan security amaçlı "Obfuscation Level" dikkatimi çekti. Bu reverse engineering gibi bazı tekniklere karşı alınmış bir önlem ve 3 seçenek sunuyor size. "Encoding only", "Basic" ve "Strong". Elbette ki encoding only seçtiğinizde bu seçeneği kapatmış oluyorsunuz. Default'u Strong'da geldiği için ben de bu şekilde kullanmayı denedim ve bir de baktım ki arayüzden garip garip hatalar alıyorum (aynı hatalar Basic seçtiğinde çıkmıyor). Encode ettikten sonra fonksiyon ve classların isimleri bozuluyor, çeşitli hatalar alıyorum. Bunun üzerine tam Zend'de bir support ticket açacaktım ki knowledge baselerinde bu sorunun yer aldığını gördüm. Hemen copy&paste ediim buraya.
Running PHP files encoded with Zend Guard 4.0.0 causes an undefined function error
Article #208
Product: Zend SafeGuard Suite, Zend Encoder
Symptoms
After you encode a PHP project with Zend Guard 4.0.0, running the files causes an errors. E.g.:
Fatal error: Call to undefined function: some_string() in some_script.php
on line x
or -
Fatal error: Cannot instantiate non-existent class: my_A_Class in C:InetpubwwwrootmyPHP_appmyClass.inc.php on line 3350
Cause
This may happen as a result of encoding your PHP code using strong
obfuscation.
Encoding code with Strong obfuscation provides the most efficient
security coverage for PHP code.
In order to successfully obfuscate code there are several preparations
that have to be made. These preparations entail identifying functions
classes, methods etc. that should not be obfuscated called “Exclude
Preferences”.
Resolution
Exclude Preferences include entities that should not be obfuscated (Such
as function names, function calls, classes and class functions that should
not be obfuscated). Most entities can be identified through a preliminary
setup procedure, by using the Suggest feature that automatically
generates an initial list of entities that should be included in the
“Exclude List”.
The error you got probably indicate that you need to exclude the
function called/declared in the script that is specified in the error.
Due to the loose and non-strict nature of PHP, obfuscation can introduce situations of indirect calls (etc.) to functions/classes that will require some functions/classes to bear non-obfuscated names in the encoded version of the script. The process of finding those functions/classes includes iterations of encoding the code, running it and finding those "problematic" identifiers and "excluding" them, then retrying. Usually, only very small part of the code needs to be un-obfuscated.
For more information about this, please refer to the user guide.
* Bu linki yalnızca registered Zend kullanıcılarının ulaşabileceği bir alana link verildiği için kaldırdım *
The information in this article applies to
Zend Guard 4 and above.
Keywords
undefined function, encoded, error
Last Updated: 2006-05-31 13:00:28
Bu yazıyı okuduğumda fark ettim ki "Strong" seçtiğim zaman "Exclude Preferences" bölümü aktif hale geçiyor ve buraya projenizde kullandığınız fonksiyon ve class isimlerinizi eklemeniz gerekiyor!!! E tabii büyük projelerde manyaklık bu ancak adamlar neyse ki "Suggest" diye bir link koymuşlar. Yine de bu link her zaman işe yaramayabiliyor. Manual olarak da uğraşmanız gerekebiliyor.
PHP+Zend ile ilgili benim gördüğüm son gelişmeler bunlar. Security olayının dibne vururken basic userların da dibe vuracağını pek düşünmemişler bence. Eminim yüzlerce kişi aynı konuda ticket açmıştır knowledge base'i incelemeden. En azından default'u Basic'de gelebilirdi Obfuscation Level'ın. Başlarına iş açmış adamlar