Reverse Engineering Academy

August 21st, 2008

Κάπως έτσι ξεκίνησε το οδοιπορικό μου στον κόσμο του reverse engineering. Φεβρουάριος 2003 και ένα απόγευμά σκάει ένας φίλος, που τον είχα χαμένο καμιά 5ετία, και πάνω στην κουβέντα τι κάνεις τώρα κτλ. μου αναφέρει μία ακαδημία REA (Reverse Engineering Academy) στο internet και συγκεκριμένα στην Γερμανία με το site www.reverser.de(τώρα δεν υπάρχει) , ότι έχει γίνει registered, σπάει προγράμματα, παίρνει βαθμούς και ανεβαίνει στον πίνακα σε σχέση με τους άλλους χρήστες.

Δεν ήθελα και εγώ πολύ για να γραφτώ, και να ξεκινήσω και τελικά να τερματίσω στην 3η θέση σε ένα χρόνο (πολύ ξενύχτι) . Το αποτέλεσμα ήταν να ανοίξει το μυαλό μου και να σκέφτομαι με τελείως διαφορετικό τρόπο πάνω στον προγραμματισμό. Με έχει βοηθήσει αρκετές φορές σε προβλήματα που παρουσιαστήκαν πάνω στην δουλειά μου και χρειάστηκαν γνώσεις reverse για να αντιμετωπιστούν. Τέλος άνοιξαν νέοι ορίζοντες για ιδέες και υλοποιήσεις σε διάφορα projects.

Αυτό που θέλω να πω, είναι ότι ένας προγραμματιστής καλό θα είναι να έχει και γνώσεις reverse, ώστε να μπορεί πάνω στην δουλεία του, ότι και να του τύχει, να βρίσκει πάντα την καλύτερη λύση. Σε κάποιο από τα επόμενα post, σκέπτομαι να βάλω ένα tutorial πως μπορείς να patchάρεις ένα πρόγραμμα.

Αν κάποιος ενδιαφέρετε η εξέλιξη της REA έχει πάρει άλλη διάσταση, με Bootcamps, Certifications , Consulting ρίξτε μία ματιά αξίζει. Στο community βρήκα ένα post για την REA 3, η REA 2 προς το παρόν δεν λειτουργεί. Αυτό που είναι στα σχέδια μου είναι να οργανώσω και εγώ μία REA σε κάποιο ελληνικό site.

Reverse Engineering

jQuery UI Tab conflict with xStandard

August 6th, 2008

Χρησιμοποίησα την jQuery με το plugin της UI για tabs, και ταυτόχρονα το ActiveX του XStandard για WYSIWYG XHTML editor, με αποτέλεσμα να χάνει το περιεχόμενο από τον editor στην αλλαγή των tabs. Το πρόβλημα το έλυσα με ένα patch του ui στη function tabify. Ποιο συγκεκριμένα, το plugin στο init των tabs, έκανε όλα τα panels hide και στην συνέχεια visible το selected. Αυτό που πείραξα εγώ, είναι να κάνει hide όλα εκτός από το selected.

// highlight selected tab
this.$panels.addClass(o.hideClass);

/* PATCHED BY THEK (not select tab invisible) */
var cc=0;
this.$panels.each(function() {
 var $this = $(this);
 if (cc++!=o.selected) $this.addClass(o.hideClass);
});
//this.$panels.addClass(o.hideClass);
//
/* PATCH BY THEK */

jQuery

String UTF-8

May 27th, 2008

Ένας γρήγορος τρόπος ελέγχου αν ένα string είναι utf-8. Πρώτα μετατρέπουμε το string σε utf-8 (utf encode). Στην συνέχεια το ξαναμετατρέπουμε στο αρχικό format (utf decode). Αν το crc του αρχικού είναι ίδιο με το crc του τελικού τότε είναι utf-8.

function is_utf8($str) {
	$str_u8=iconv('Windows-1253','UTF-8',$str);
	return (crc32($str)==crc32(iconv('UTF-8','Windows-1253',$str_u8))) ? true : false;
}

php

Php Acronym Replace

May 25th, 2008

Χρειαζόμουν ένα acronym replace utility για να το ενσωματώσω σε ένα site. Όπως κάθε έξυπνος προγραμματιστής, ψάχνει πρώτα στο google. Τι γίνεται όμως όταν αυτό που βρίσκει δεν τον ικανοποιεί. Προσπαθεί να το φτιάξει μόνος του.

Έτσι λοιπόν ξεκίνησα να σκέφτομαι τι θα μπορούσα να χρησιμοποιήσω ώστε να πετύχω το καλύτερο δυνατό αποτέλεσμα. Στην αρχή σκέφτηκα να κάνω parse το html, να βρίσκω τα κείμενα ανάμεσα στα tags, και να κάνω replace τα acronyms. Άκυρη η προσπάθεια, πολλά προβλήματα, ήθελε πολλούς ελέγχους. Αποφάσισα ότι πρέπει να κινηθώ προς αυτήν την κατεύθυνση, άλλα με άλλο τρόπο parsing.

Έτσι μου ήρθε η ιδέα να χρησιμοποιήσω τον xml parser του php module expat. Το αποτέλεσμα καταπληκτικό, απλά έπαιρνε υπόψη του, μόνο το πρώτο block από tags. Έπρεπε να βρω γιατί σταματούσε, και δεν συνέχιζε και στα επόμενα. Μετά από ώρες ψαξίματος, κατάλαβα ότι του έλειπε ένα dtd, για να καταλάβει ο parser με τι τύπο xml (doctype) έχει να κάνει.

Έτσι του πρόσθεσα ότι είναι xhtml. Bingo επιτέλους πάρσαρε όλα τα blocks που είχε το content. Βέβαια τα προβλήματα δεν σταμάτησαν εδώ, ενώ έδειχναν ότι όλα είναι ok, ξαφνικά διαπίστωσα ότι χαρακτήρες όπως &,.! κτλ, εξαφανίστηκαν. Άντε πάλι googling… Η λύση ήρθε από το W3C, λείπανε τα entities, από το dtd. Πρόσθεσα και τα entities που με ενδιαφέρανε και το αποτέλεσμα, super! Τέλος για γίνει καλύτερο, πρόσθεσα στα replace όλες τις περιπτώσεις με τα σημεία στίξης. Με ένα σύστημα cache, για μεγαλύτερη ταχύτητα, το replace για τα acronyms έπαιξε καταπληκτικά, καλύπτοντας όλες τις περιπτώσεις που είχα στο site.

Με αυτό το utility κατάφερα εκτός των άλλων, να κατασκευάσω και ένα μικρό xhtml validator, γιατί αν υπάρχει έστω και ένα πρόβλημα στο html, βρίσκει το error ο parser, και σταματάει η εκτέλεση του. Αυτό το utility, το χρησιμοποιήσαμε στην Netwerk και προσθέσαμε στο cms μας την δυνατότητα για inner linking.

Καθώς έγγραφα το post σκεφτικά, δεν βάζω το utility στo phpclasses ? http://www.phpclasses.org/browse/package/4599.html

php

Site verification over mod_rewrite or error 404 redirect

May 6th, 2008

Ένας τρόπος για να ελέγχεις αν ανήκει ένα domain σε κάποιον, είναι να του ζητήσεις να βάλει ένα αρχείο (zero byte) στον docroot του site του, όπως γίνεται στο google html verification. Αυτό είναι εύκολο να το ελέγξεις με php χρησιμοποιώντας την fopen ή την fsockopen. Τι γίνεται όμως αν υπάρχει rewrite module για να έχει friendly urls (seo) ή error 404 με redirect σε κάποια άλλη σελίδα (παλιά τεχνική – σήμερα αποφεύγεται για διάφορους λόγους). Σε αυτές τις δύο περιπτώσεις, χωρίς να υπάρχει το αρχείο, ο έλεγχος θα βρίσκει ότι υπάρχει. Η λύση είναι πολύ απλή, ανοίγουμε το connection και διαβάζουμε τα raw data. Αν δεν υπάρχει η σελίδα το connection θα αποτύχει. Αν όμως πετύχει το connection τότε θα πρέπει να μην υπάρχουν καθόλου raw data.

function url_valid($url) {
	$found=true;
	$fp=@fopen($url,"r");
	if ($fp) {
		if (fgetc($fp)) $found=false;
		fclose($fp);
	} else
		$found=false;
	return $found;
}

mod_rewrite, php ,