PHP Enconding - Obfuscation Level

17 replies · 8,253 views

PHP Enconding - Obfuscation Level
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 🙂
PHP Enconding - Obfuscation Level
lisansli bir Zend SafeGuard kullanicisi olarak, 3.6.0 kullaniyom.. sorun cikarmadi simdiye dek.. eski 3.x'lerde iken "optimizations"'dan dolayi cok sorun yasamistim, encoder'dan oldugunu ongormeyip, kodlarim arasinda dolanip durmustum.. o gun bugundur optimizations'i hep "none" tutuyorum..
birde su zend_optimizer.optimization_level 'i aciklayan bir metin bulsam..
PHP Enconding - Obfuscation Level
cagrilacak fonksiyon adini dinamik generate ettirme gibi maymunluklar yapiyorsan normal, adamlarin dedigi de bu.
yani
void dunyayielegecir($p)
{
echo "su parametrelerle ele gecirilecek: ".$p."
";
}

$x="dunyayielegecir";
$x("parametreler");

ya da
$degiskenimcokguzel=14;
$a="degiskenimcokguzel";
echo "degiskenimin degeri soyledir boyledir: ".$$a."
";

yaparsan alet tabi ki calismayacak. buna benzer ornekler disinda oluyosa garip ama gercekten.
PHP Enconding - Obfuscation Level
@Disq: Evaluation kullanımı da problem yaratıyor.
Örnek:
for($i = 1; $i < 10; $i++)
 eval("$a".$i."=".($i*2).";");
	echo $a5;

Kısacası adamlar indirect calllar derken biraz genelleme yapmışlar. PHP'de daha birçok özel durum var problem yaratan.
PHP Enconding - Obfuscation Level
azıcık off-topic olsa da, yine de zend encoding ile ilgili:
her ne kadar iş çalışmalarında kodların kapalı yapılmasını tercih etsem de, türk iş anlayışındaki "parasını veriyorsam herşeyi yaptırırım" mantalitesi sayesinde zend encoder'ı kullanmak çok mümkün olamamakta. oysa licensing, date-bomb gibi özellikleriyle ilk gününden beri ilgimi çektir zend. diğer bir sorun da işi kurduğunuz server yerli ise, alın başınıza belayı; netone'da daha yeni gördüm, zend dışında birçok 'standart' olabilecek modülün de yüklenmemiş olduğunu.
bu yüzden ilgilenenlere öncelikle kullanacakları environment'i test etmelerini öneririm. server'a zend yüklü değilse ve yükletemiyorsanız bırakın kalsın.
PHP Enconding - Obfuscation Level
Originally posted by skate@Jul 4 2006, 10:17 AM
@Disq: Evaluation kullanımı da problem yaratıyor.
Örnek:
for($i = 1; $i < 10; $i++)
 eval("$a".$i."=".($i*2).";");
	echo $a5;

Kısacası adamlar indirect calllar derken biraz genelleme yapmışlar. PHP'de daha birçok özel durum var problem yaratan.
[post=8046]Quoted post[/post]


e tabi yapar, dedigimden biraz akli olan biri eval'in -bu sekilde kullaniminin- da sorun cikartacagini cikrtabilir diye ustune basa basa soylemedim. aklin nerede sıkeytim.
PHP Enconding - Obfuscation Level
no comment...
PHP Enconding - Obfuscation Level
Originally posted by skate@Jul 6 2006, 05:11 PM
no comment...
[post=8063]Quoted post[/post]


alinmissindir da simdi 🙂
PHP Enconding - Obfuscation Level
Originally posted by disq+Jul 12 2006, 08:20 AM--><div class='quotetop'>QUOTE(disq @ Jul 12 2006, 08:20 AM)</div><div class='quotemain'><!--QuoteBegin-skate@Jul 6 2006, 05:11 PM
no comment...
[post=8063]Quoted post[/post]


alinmissindir da simdi 🙂
[post=8111]Quoted post[/post]

[/b][/quote]
Beni tanıyanlar bilir, ben alınmam, ağzının payını veririm. No comment dediysem boşa olta salladın demektir.
PHP Enconding - Obfuscation Level
Originally posted by skate+Jul 12 2006, 12:01 PM--><div class='quotetop'>QUOTE(skate @ Jul 12 2006, 12:01 PM)</div><div class='quotemain'>
Originally posted by disq@Jul 12 2006, 08:20 AM
<!--QuoteBegin-skate
@Jul 6 2006, 05:11 PM
[b]no comment...
[post=8063]Quoted post[/post]


alinmissindir da simdi 🙂
[post=8111]Quoted post[/post]

[/b]

Beni tanıyanlar bilir, ben alınmam, ağzının payını veririm. No comment dediysem boşa olta salladın demektir.
[post=8113]Quoted post[/post]

[/b][/quote]
hadi canim. 😛
PHP Enconding - Obfuscation Level
zend guard 4.x 'de obfuscation level'i strong secmezseniz (ki o zamanda zendoptimizer 3.x kurulu olmasini istiyor), dezend ile source'u elde etmek mumkun..
PHP Enconding - Obfuscation Level
içimden bir ses execute edebilen herşey reverse engineer edilir diyor ama neyse 🙂 bence en fazla değişken, fonksiyon isimleri v.s. kurtarılamaz.
PHP Enconding - Obfuscation Level
lisans zamanim geldi de, ondan dolayi biraz once telefon ile zend'den birisiyle gorustum.. guvenlik felan filan diyodu, dezend felan diyince, obfuscation'i anlatmaya basladi.. "strong'u sevmiyorum abicim, 3.x istiyo, yok kitapcigi oku code'u ona gore yaz istiyo" felan dedim.. ozet olarak "acikcasi yapcak bisi yok, piyasadaki tum programlari cozuyorlar, zaten siteleri de gormussun" dedi..
araya post processor yazsan, zend'i kendine gore patch'lesen de bu sefer script'in kurulacagi yere, abi arada sunlari da koyarmisin deme sansin yok..
netce itibari ile gorunen o ki, 597$ verip yeni lisans almiycam..
PHP Enconding - Obfuscation Level
temel kurallar serisi #1211513: encode edilen, şifrelenen, formatı kayıpsız değiştirilen her dosya elbette geri döndürülür; sadece ne kadar emek ve süre isteyeceği belirsizdir.
kısacası konan her kilit ve engel, daha iyisini bilen birisi tarafından kaldırılabilir. sadece işleri zorlaştırır, genele erişimi azaltırsın.
ps: millet unplugged takılmak babında dalga geçmek için lockpicking yapıyor artık partilerde. olayın ne kadar konan engeli kaldırmak olduğunu ve opensource gibi bi nevi opendoor (komün yaşam da biraz opensex, opengf değil mi, hahaha) düşüncesi ortaya çıkabilir.

Last edited: 2007-05-25 13:54

PHP Enconding - Obfuscation Level
bu arada bizim şirket en son 2005'de Zend lisansını yeniledi. Artık Zend Guard 4.x serisi expire olmuyor bizim. Sonsuza dek kullanabiliyoruz. Ama support birkaç ay içinde expire olacak. Ben genellikle online chat yapmayı seviyorum Zend elemanlarıyla. Birkaç yıl önce Türkiye Dünya Kupasına mı ne katılmıştı ya, en son görüşme bitterken Zend'in support elemanlarından biri bana "bu akşamki maçta başarılar" dedi, dumur oldum 😃