Root > Documents > Programlama > PHP : 10 Adımda Kod Şaşırtmaca(Gizleme)
Cyber-Warrior.Org \ Doküman \ Programlama > PHP : 10 Adımda Kod Şaşırtmaca(Gizleme)
Madde
  Yazar : Elçibey
  Date : 29.12.2015 11:14:31
 
# PHP : 10 Adımda Kod Şaşırtmaca(Gizleme)
 

Kod sasirtmaca (gizleme) baskalarinin dogrudan ne yaptiginizi anlamasini istemiyorsaniz yararli olabilir. Fakat, neden böyle bir sey istersiniz ki? Iyi bir kod yaziliminin amaci herkes için anlasilir ve kolay hale getirilmis olmasi degil midir? Iste tam burada anlasilir bir örnek var “Eger, size sormak gerekirse bu konuyu açiklamak kullanissiz olur.” ama biz yine de bunun üzerinde duracagiz. 

Sasirtmaca(Gizleme) : Fakat, neden?

Kod sasirtmaca(gizleme) ya da çok zor bir kaynak okumak için yapilan arastirma ile ilgilenen herhangi kisi ya da kisilerin kodu okunabilir ve anlasilabilir hale getirmek için ugrasmasi durumunun tam tersi durumdur. Ancak bu tam istediginiz gibi degil ve bildigim kadariyla bu durumlarin kapsadigi iki madde vardir.

Güvenlik

Yanlis sekilde yorumlanmasi gerekli olmasa da olasi bir seçenek ekstra güvenliktir. Bu gizleme (sasirtmaca) sadece zor okumak için yapilan bir eylemdir, ama kesinlikle imkansiz degildir unutmayin. Kodu çalistirmadan önce yapilmis olmasi gereken de çözülmüs olmasidir ve bunu herkes elle yapabilir, sadece çok zaman alir. Ancak sasirtmaca tahrifat veya kod enjeksiyonu önlemek için kullanisli gelebilir.

Bulmaca

Yazdiginiz kodun amacini gizlemek ve diger kullanicilarin elle çözmesine izin vermek için ciddi bir yaris vardir. Tabii ki program için herhangi bir degeri yok ama ilginç bir meslek yolu olabilir.

Nadir durumlarda sasirtmaca da optimizasyon anlamina gelebilir, ancak çogu programlama dilleri için tersi dogrudur. Hadi 10 adimda komutla kodlanmis tahrifati güvenli bir hat yaratalim. Bu gösteri içinde PHP kodu kullanacagim ama asil konsept çok iyi JavaScript, C ya da baska bir dil ile çalisiyor olabilir.

Adim 1 : Örnek Kod

Ilk olarak, ne kodlamak istiyorsunuz? Ben basit bir ekran üzerinde bazi karakterleri ekrana verip anlamaya yarayan PHP script yaratacagim, isleri zor olacak. Çogu insanin hiçbir yazili kod satirini anlamasi mümkün olmamalidir.

Bu sözdizimi gösteri hakkinda oldugu gibi kendisinin kodu hakkinda da çok degil. Bu nedenle istedigimiz kod oldugunu unutmayin.

Adim 2 : Kod Seridi

Simdiye kadarki her seyde gereksiz karakterler var ve yeniden yazacagiz. Bu bölü, hashtags, yeni satir, satirbasi, sekme ve çift bosluk içerir. Bu numarayi hatirlamamiz sayesinde çok sey yapacagiz. Her seyi bir satira attigimiz zaman, bizim örnegimiz gibi görünüyor:

Bu noktada kodunuz hala çalistirilabilir olmalidir.

Adim 3 : Sikistirmak ve Kodlamak

Deflating (düsürmek/azaltmak/sikistirmak) belirli bir bit biçime kod sikistirmaktan baska bir sey degildir. Bu kodlanmis karakter miktarini azaltmak için yaptigimiz ve GNU zip (gz) PHP ile yapilan en iyi seçimdir. Sorun gzdeflate() ikili karakterleri döndürecektir ve bazi ASCII kodlarini görüntülemek mümkün degildir. Fakat çözüm bulunur, ikili karakterleri gzdeflate() tarafindan tasti olarak kodlayacagiz. PHP etiketleri (<?php ve ?>) Hariç tüm kodu sikistirilmis ve kodlanmis olacaktir. PHP bunu yapmak için: 

PHP varsayilan olarak base64 kodlamayi destekler. Temelde düz metin her seyi ASCII koduna ikili aktardik. Verinin bozulmadan kalmasini saglamak için bu degisiklik yapilamaz ve yapilmadan oldugu gibi kalir. Bir sonraki birkaç adimda bu fonksiyonu çok göreceksiniz. Özünde base64 kodlamasi küçük ölçekte bizim sasirtmaca sürecini ifade eder. Eger bu ögretici kodu kullaniyorsaniz çikis ayni görünmelidir. Degilse muhtemelen bosluk karakteri ile biten bir sey kaçirdi.


S03OyFdQCi5JLCrR09NTsk7LL9JQybQ1tFbJtLE1NABS2tqa1akgVSqZ1rVghrprXoq6NQA

Evet, bu kodlanmis dize bizim tüm komut dosyasini tutar. Kodlanmis dizede PHP eval() islevini kullanarak hala çalistirilabilir olup olmadigini her zaman kontrol edebilirsiniz. PHP kodu (degerlendirmek) konusunda temelde eval() islevi her seyi çalistirir. Bu komut bir parçasiydi sanki bize bir dize çalistirmasina izin veriyor. Bu islevi içeren olasi güvenlik risklerini algilayip bazi web hosting müsterileri için devre disi birakmayi seçebilirsiniz. Bir saka olarak bazen bunu kullanarak tehlikeye atifta bulunup kötülük yerine eval denir. 

Orijinal çikisi ile karsilastirildiginda hiçbir fark olmadan kod çalistirilabilir olmalidir. 

Adim 4 : Hash Saglamasi

Kodun degismis olmasini engellemek amaciyla kodlanmis dize üzerinde bir saglama toplami hesaplar. Hesaplanan hash kodlanmis dize eslesmedigi zaman biz dogrudan dosyanin degistirilmis oldugunu varsayiyoruz. Bu oldukça basit bir testtir. Isterseniz MD5, SHA hatta CRC32 kullanabilirsiniz. Bu durumda karma gücü önemli degil. Biz bu derste SHA1 kullanacagiz. Girdi olarak kodlanmis dize (yukarida QA= için S03 ile baslayan) kullanin. Sonuç su olmalidir:

4ffcebc0edd1b21e57d2157e354397a4aea9b8b9

Bu ögretici kodunu yeniden kullanirken, SHA1 checksum yukaridaki ile %100 uyumlu olmalidir.

Adim 5: Dogrulama ve Fonksiyon Kodlama

Kodun modifiye olup olmadigini kontrol etmek için bir dogrulama islevi yazacagim. Bu islevle kodlanmis dize üzerinden hesaplanan hash’e karsi parametre olarak geçirilen hash karsilastirir. Ancak bir sorun vardir: fonksiyonda çok sey degismis olabilir, bu dogrulama ile kendisindeki bu degisikligi önleyecegiz? Peki bizim bunu yapmamiz (bu durumda) imkansiz olurdu, ama biz en azindan islevini kodladik. Asagidan kontrol edebilirsiniz: 

Ve yine, bu kod hala çalistirilabilir olmalidir. Bu kodlanmis fonksiyon GNU zip seçenegi olmadan (adim 3) ve kodlanmis bir fonksiyon olmalidir:

ZnVuY3Rpb24gSWl3a1p5azdKR1E5KCRhLCRiKXtpZigkYj09c2hhMSgkYSkpe3JldHVybihnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkYSkpKTt9ZWxzZXtlY2hvKCJUaGUgZmlsZSB3YXMgbW9kaWZpZWQiKTt9fQ


Sonraki birkaç adim için buna ihtiyacimiz var.

Adim 6 : Yapi

Bu noktadan suana kadar biz sadece gerçek is için hazirliklari gerçeklestirdik. Modifikasyon sansini en az indirmek için önce kaba hatlarin nasil olacagini açiklayacagiz. Bu herkesçe bilinen bir algoritma ama ben (ve önerilen) kendi yarattiklarinizi kullanmak için çekinmeyin. Sorun su: nasil oluyor da hala çözmesi mümkün ise içerigi degistirmek için bu yetenegi ortadan kaldirabilir miyiz? Kullanacaginiz algoritma dosyanin üzerine kodlanmis dize ayridir. Sonra bu parçalari almak ve onlari tekrar bir araya getirmek için bir fonksiyon kullaniyoruz. Bu islevle, üç görevi gerçeklestirmek mümkün olacak: bunlar verify_checksum() almak, hash almak ve son olarak kodlanmis veri alma islevleridir. Dogru yapildiginda, sadece bu fonksiyon kod çözdükten sonra dogrudan görülebilir. Herhangi bir degisiklik bile küçük bir bosluk dahi olsa tam olarak istedigimiz kodun yürütülmesini önlemek için yeterlidir. Diger bir deyisle, muazzam hatalar için hassasiyeti artti. (Evet, bu bir paradoks oldu)

Bu iki parçaya kodlanmis dize bölmek ve elde etmek için, bunu istediginiz herhangi bir sekilde yapabilirsiniz. Rastgele bir sürü veri olusturmak ve bu base64 ama en az 100 karakter ve en fazla 200 karakter kullanarak kodlamak. Bu egitimde kullanmak için rastgele veri:

1XDgSR0wrIrw5YkB+KApsO2w5I+S21/fn/FoMOEw6c2DQoIWsOg4oChxaBKGHXDmcK6LMOEMTTCj8Kpw5zDucOW4oCdViMhTB8sTMKxw6PigJoWFEMmIzPDvuKAncuG4oCwDsWSXmvC

Asagidaki sirayla kodlanmis içerigi koyacagiz:

Simdi bekleyin ve eger, çözmek isterseniz ancak bu ögretici sonuçlar için sadece açiklanmis bir örnek olarak:

1XDgSR0wrIrw5YkB+KApsO2w5I+S21/fn/FoMOEw6c2DQoIWsOg4oChxaBKGHXDmcK6LMOEMTTCj8Kpw5zDucOW4oCdViMhTB8sTMKxw6PigJoWFEMmIzPDvuKAncuG4oCwDsWSXmvCZnVuY3Rpb24gSWl3a1p5azdKR1E5KCRhLCRiKXtpZigkYj09c2hhMSgkYSkpe3JldHVybihnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkYSkpKTt9ZWxzZXtlY2hvKCJUaGUgZmlsZSB3YXMgbW9kaWZpZWQiKTt9fQ==4ffcebc0edd1b21e57d2157e354397a4aea9b8b9S03OyFdQCi5JLCrR09NTsk7LL9JQybQ1tFbJtLE1NABS2tqa1akgVSqZ1rVghrprXoq6NQA=

Bu dizede, simdiye kadar tüm örtülü kodlar var ve her parçayi içerir.

Adim 7 : Almak ve Insa Etmek

Son adim net olarak dogrulama islevidir, hash ve gerçek kaynak kodu almak için bir islevi hayata geçirecegiz. Bu fonksiyonlar parametre olarak geçirilen moda göre içerik döndürür. Eger, üç olasiliktan birisiyse ilk parametre mod baslangiç sayisi ve ofset dize olarak geçilir ve son verebiliriz. Her bir parçanin uzunluklarini görmek için yukaridaki tabloya bakin. Onlar veri uzakliklar formudur, bunlarin uzunluklari önemlidir. Içinde bu sekillendirme ile sona erecek fonksiyon:

Ve adim 5’te oldugu gibi tekrar fonksiyonu serit halinde ve sol tarafin üzerinde olmalidir: 

<?php function PXN1YnN0ci($a,$b){$c=array(139,164,40,72);if($b==62){$d=substr($a,$c[0]+$c[1],$c[2]);}elseif($b==12){$d=substr($a,$c[0],$c[1]);}elseif($b=92){$d=trim(substr($a,$c[0]+$c[1]+$c[2]));}return$d;} ?>

Simdi islevi kodlamak:

ZnVuY3Rpb24gUFhOMVluTjBjaSgkYSwkYil7JGM9YXJyYXkoMTM5LDE2NCw0MCw3Mik7aWYoJGI9PTYyKXskZD1zdWJzdHIoJGEsJGNbMF0rJGNbMV0sJGNbMl0pO31lbHNlaWYoJGI9PTEyKXskZD1zdWJzdHIoJGEsJGNbMF0sJGNbMV0pO31lbHNlaWYoJGI9OTIpeyRkPXRyaW0oc3Vic3RyKCRhLCRjWzBdKyRjWzFdKyRjWzJdKSk7fXJldHVybiRkO30=

Ilk ofset (bu örnekte 139) tabii ki rastgele veri parçasi dizedeki ilk karakter (dizin 0) sayim uzunlugudur. Bu kodlanmis biçimde alma islevini degistirmek gibi, bir sonraki adimda degisecektir.

Adim 8 : Dosya Sayaci

Son fonksiyonda olusturulan sayaç bir islev içinde mahsup dayanir (139 hatirliyorum) ama islevi artik dize baslangicini yerine dosyanin baslangicini saymak gibi yakinda degisecek. Sadece bir bosluk bir yere dosya eklendiginde ya da sola veya saga kayacaktir ofset ve islev dogru verileri artik almaz. Bu, dosyanin en sonunda kodlanmis yükü (adim 6 sonucunu) ekleyecektir nedeni budur. Ancak bu çalistirilabilir kod degildir ve the__halt_compiler() PHP kodu olarak yürütülmesini çözümleyici önlemek için makro olarak aramaliyiz. Sözde (sahte) Kod: 

PHP kapanis etiketinin olmadigina dikkat edin. Bu islev kodlanmis veri parçasi daha almak degil ve daha çok son karakter () almak için gerekli verileri saglar.

Adim 9 : Bosluklari Doldurma

Devam edelim ve bir seyler anlatsin bize ama bunlar bizde zaten var. Hemen hemen her seyi kapsar. Kod, eval() kullanmak ve çalistirmak için gerekli islevdir. Eger tüm ögretici ve bu talimatlari dinlerseniz asagidaki duruma gelmis olmaniz gerekir:


<?php
$x5rb7Bygi1=file(__FILE__);
eval(base64_decode("ZnVuY3Rpb24gUFhOMVluTjBjaSgkYSwkYil7JGM9YXJyYXkoMTM5LDE2NCw0MCw3Mik7aWYoJGI9PTYyKXskZD1zdWJzdHIoJGEsJGNbMF0rJGNbMV0sJGNbMl0pO31lbHNlaWYoJGI9PTEyKXskZD1zdWJzdHIoJGEsJGNbMF0sJGNbMV0pO31lbHNlaWYoJGI9OTIpeyRkPXRyaW0oc3Vic3RyKCRhLCRjWzBdKyRjWzFdKyRjWzJdKSk7fXJldHVybiRkO30="));
eval(base64_decode(PXN1YnN0ci($x5rb7Bygi1[0], 12)));
eval(IiwkZyk7JGQ9(PXN1YnN0ci($x5rb7Bygi1[0], 92), PXN1YnN0ci($x5rb7Bygi1[0], 62)));
__halt_compiler();
1XDgSR0wrIrw5YkB+KApsO2w5I+S21/fn/FoMOEw6c2DQoIWsOg4oChxaBKGHXDmcK6LMOEMTTCj8Kpw5zDucOW4oCdViMhTB8sTMKxw6PigJoWFEMmIzPDvuKAncuG4oCwDsWSXmvCZnVuY3Rpb24gSWl3a1p5azdKR1E5KCRhLCRiKXtpZigkYj09c2hhMSgkYSkpe3JldHVybihnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkYSkpKTt9ZWxzZXtlY2hvKCJUaGUgZmlsZSB3YXMgbW9kaWZpZWQiKTt9fQ==4ffcebc0edd1b21e57d2157e354397a4aea9b8b9S03OyFdQCi5JLCrR09NTsk7LL9JQybQ1tFbJtLE1NABS2tqa1akgVSqZ1rVghrprXoq6NQA=

%99 bitti ama ne yazik ki, bu çalistirilabilir kod degildir.

Adim 10 : Son Dokunus

Bizim asil istedigimiz dogrulama islevi için dosyanin basindan itibaren tüm yolda dengeleniyor olmasi. Su anda 139 karakter alma islevi ofset bizim tarafimizdan kodlanmis. Bizim kodlamamamiz kendiliginden degisecek bu yüzden, zaten kodlanmis çünkü bu ofseti kendiliginden degistiremezsiniz. Ancak bunu yapmadan önce her sey hazir olmali. Simdi tek bir satirda tüm kodlari atalim ve gereksiz karakterleri kaldiralim daha önce de yaptigimiz gibi. Bir seçenek olarak, sadece ilk PHP etiketinden sonra bir telif hakki ekleyebilirsiniz.

Buradaki püf nokta tüm isleri yapmak için geliyor: bizim ilk ofset bir yere aldigimiz islevi (139) base64 biçiminde kodlanir. Bu durumda MTM5 üç karakter 139 (Hayir bu bir dizi degil artik) base64 temsil eder. Bu dört karakter base64 komut is yapmak için degistirmek için ihtiyacimiz olan en son seydir. Simdi tüm yol rastgele veri parçasinin ilk karakteri (bizim durumumuzda 1) PHP açilis etiketinin de dahil olmak üzere her seyi saymalidir. Ilk ofset sayisini ekleyin ve yeni ofset bulunmus olacaktir. Benim kodu 510 + 139 = 649 böylece rastgele bir parçasi önce 514 karakter saydim. Simdi tek NjQ5 (büyük küçük harf duyarli) olan base64 bir biçime dönüstürmek 649 kalmadi. Eski base64’ü yeni bir ofset ile degistirmek ve tamamen karistirilmis kod yürütmek gerekir. Bu egitim için karistirilmis kod asagidaki gibi görünüyor:


<?php /* Do not modify (c) BlubGoo.com */ $x5rb7Bygi1=file(__FILE__);eval(base64_decode("ZnVuY3Rpb24gUFhOMVluTjBjaSgkYSwkYil7JGM9YXJyYXkoNjQ5LDE2NCw0MCw3Mik7aWYoJGI9PTYyKXskZD1zdWJzdHIoJGEsJGNbMF0rJGNbMV0sJGNbMl0pO31lbHNlaWYoJGI9PTEyKXskZD1zdWJzdHIoJGEsJGNbMF0sJGNbMV0pO31lbHNlaWYoJGI9OTIpeyRkPXRyaW0oc3Vic3RyKCRhLCRjWzBdKyRjWzFdKyRjWzJdKSk7fXJldHVybiRkO30="));eval(base64_decode(PXN1YnN0ci($x5rb7Bygi1[0],12)));eval(IiwkZyk7JGQ9(PXN1YnN0ci($x5rb7Bygi1[0],92),PXN1YnN0ci($x5rb7Bygi1[0],62)));__halt_compiler();1XDgSR0wrIrw5YkB+KApsO2w5I+S21/fn/FoMOEw6c2DQoIWsOg4oChxaBKGHXDmcK6LMOEMTTCj8Kpw5zDucOW4oCdViMhTB8sTMKxw6PigJoWFEMmIzPDvuKAncuG4oCwDsWSXmvCZnVuY3Rpb24gSWl3a1p5azdKR1E5KCRhLCRiKXtpZigkYj09c2hhMSgkYSkpe3JldHVybihnemluZmxhdGUoYmFzZTY0X2RlY29kZSgkYSkpKTt9ZWxzZXtlY2hvKCJUaGUgZmlsZSB3YXMgbW9kaWZpZWQiKTt9fQ==4ffcebc0edd1b21e57d2157e354397a4aea9b8b9S03OyFdQCi5JLCrR09NTsk7LL9JQybQ1tFbJtLE1NABS2tqa1akgVSqZ1rVghrprXoq6NQA=

Kodunda bir yerde degisiklik yapin ve sonucu görün. Unutmayin, gizlenmis, sifrelenmis kod her zaman orijinal durumuna geri dönüstürülebilir, sadece zaman alir.

   
   
Cyber-Warrior TIM All Legal and illegal Rights Reserved.\CWDoktoray 2001©