Post by Guest on Jan 14, 2018 16:24:46 GMT
Merhabalar,
Dilersen her şeyden evvel web aplikasyonunun arka planında neler olup bittiğine küçük bir göz gezdirelim. Aslında şu noktada bu tarz bir önlemdeki amaç, tamamen dolaşan robot uygulamaların veriyi işlemesini zorlaştırmaktır. Her ne ise.
~email-decode.min.js kaynak kodu
Kodda dikkat etmemiz gereken noktalara geçmeden, görebileceğimiz üzere parçacık içeri aktarıldığı an işleme sokulmakta. Bu da demek oluyor ki, direkt olarak sayfada yer alan kaynak kodundan yola çıkarak - veri paslama olmaksızın işleme alınacak (!function () { [..] }()). Ana fonksiyon harici, çağrılan fonksiyon ifadelerine göz atalım.
~ oh, god
Dilersen her şeyden evvel web aplikasyonunun arka planında neler olup bittiğine küçük bir göz gezdirelim. Aslında şu noktada bu tarz bir önlemdeki amaç, tamamen dolaşan robot uygulamaların veriyi işlemesini zorlaştırmaktır. Her ne ise.
<html lang="en">
[..]
<body>
<div id="main"> [..]
<div id="wrapper_main" class="wrapper_bg">
<div id="wrapper">
[..] <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6e030d5a2e030d431e1c0b03071b03400b1b">[email protected]</a>[..]
<div>
</div>
<script data-cfasync="false" src="/cdn-cgi/scripts/ddc5a536/cloudflare-static/email-decode.min.js"></script>
[..] </div>
[..]
</body>
</html>
Dikkatimi, tam olarak alıntıladığım şu iki kod blogu çeker. Birisinde, "data-cfemail" parametresinde belirtilmiş bir değer; diğerinde ise yüksek ihtimalle bu şifrelenmiş veriyi çözen JS fonksiyonu barınmakta. Vakit kaybetmeden, içe aktarılan "email-decode.min.js" adlı JavaScript dosyasını inceleyelim.~email-decode.min.js kaynak kodu
Kodda dikkat etmemiz gereken noktalara geçmeden, görebileceğimiz üzere parçacık içeri aktarıldığı an işleme sokulmakta. Bu da demek oluyor ki, direkt olarak sayfada yer alan kaynak kodundan yola çıkarak - veri paslama olmaksızın işleme alınacak (!function () { [..] }()). Ana fonksiyon harici, çağrılan fonksiyon ifadelerine göz atalım.
! function() {
[...]
}(),
function() {
for (var r = do cument.querySelectorAll(c), t = 0; t < r.length; t++) try {
var o = r[t],
l = o.parentNode,
i = o.getAttribute(a);
if (i) {
var f = n(i, 0),
u = do cument.createTextNode(f);
l.replaceChild(u, o)
}
} catch (r) {
e(r)
}
}()
Kodu okuyabilmemiz için, yer alan değişkenlere de göz atmamız şart tabii..var o = "/cdn-cgi/l/email-protection#",
c = ".__cf_email__",
a = "data-cfemail",
l = do cument.createElement("div");
Anlayabileceğimiz üzere, dosyada barınan ".__cf_email__" ile eşleşen CSS unsurlarının her birinde "data-cfemail" parametresinin varlığı kontrol edilmekte, eşleşme olması durumunda ise parametrede barınan veri "n(i, 0)" satırında işleme sokulmakta, ve son olarak deşifre edilmiş metin dosyaya eklenmekte. İşte olay tam olarak da bu "n (*args)" fonksiyonunda bitiyor.function n(e, n) {
for (var o = "", c = t(e, n), a = n + 2; a < e.length; a += 2) {
var l = t(e, a) ^ c;
o += String.fromCharCode(l)
}
return r(o)
}
Fonksiyonda "e" ve "n" değişkenleri (şu durumda n=0, e=encoded str..) bir döngüye aktarılıyor, döngüde bir (o)utput değişkeni belirleniyor ve çözümlenen karakterler teker teker bu değişkene ekleniyor. Eh, bu çıktı bizim çözümlenmiş e-mail adresimiz olacaktır. Diğer kısımlara geçmeden, gözümüze "t([..])" fonksiyonu çarpıyor. Nedir bu peki? Eh, bize verilen encoded-string ifadeyi 2'li 2'li parçalara bölen ve bu parçaları ihtiyaç oldukça döndüren, basit bir str2int fonksiyonu olarak nitelendirebiliriz. Döngüdeki "a", 2 değeri ile başlatılıp 2'şer 2'şer artırılarak bunu sağlıyor doğal olarak.
function t(e, r) {
var t = e.substr(r, 2);
return parseInt(t, 16)
}
Ve son olarak, t(e, a) XOR t(e, n) = a. sırada bulunan karakter çiftlisinin çözümlenmiş hali. XOR anahtarlarımızdan birisi, görebileceğiniz üzere her zaman için ilk 2 karakter olarak belirlenmiş. ASCII tablosundan char-code'a çevrilerek karakter karşılığı bulunabilir. Sonuç olarak, dilerseniz işin mantığını gün yüzüne çıkarttığımıza göre bir decoder fonksiyonu yazalım; madem ki siz PHP kullanmaktasınız, PHP karşılığını yazalım o halde.function dec_cf_mail ( $damn ){
$key = hexdec (substr ($damn, 0, 2));
for ($o='', $seq=2; $seq<=strlen ($damn); $seq+=2){
$o .= chr (hexdec (substr ($damn, $seq, 2)) ^ $key);
}
return ($o);
}
Şu noktada yapman gereken tek şey, o veriyi çekerekten (gayet basit, sadece 2-3 tık bir şeyler araştırmanı istiyorum.) bu fonksiyona sokmaktan ibaret. Yeterince yardımcı olduğumu düşünüyorum, en azından durum bu ise ne mutlu bana. İyi günler diliyorum.~ oh, god