Archive

Archive for the ‘php’ Category

10 must εργαλεία για reverse engineering

December 17th, 2008

Παρακάτω είναι μια λίστα με διάφορα εργαλεία για reverse engineering που μπορείτε να χρησιμοποιήσετε αν ασχολείστε με το “σπόρ”.

Servant Salamander

Το Servant Salamander είναι ένα φανταστικό εργαλείο γενικά για development αλλα και για απλούς χρήστες. Το salamander είναι ένας file manager που θυμίζει λίγο το παλιό norton commander, ωστόσο παρέχει αρκετές ευκολίες για τους επαγγελματίες χρήστες του, όπως file compare, ενσωματομένο ftp και sftp client, κτλ. Αξιοσημείωτο οτι ακόμα και στην αντιγραφή αρχείων είναι πιό γρήγορος απο τα windows :)

EmEditor

O emEditor είναι ένας απλός text editor ο οποίος παρέχει ένα βασικό code highlighting και “παίζει” με οποιοδήποτε encoding(και UTF8). Δέν παρέχει τις ευκολίες ενός επαγγελματικού IDE ωστόσο είναι πολύ καλό για την περίπτωση που θέλουμε να επεξεργαστούμε ένα αρχείο γρήγορα.

Hex Editor

Ένας hex editor είναι τουλάχιστον απαραίτητος για όποιον ασχολείται με reverse engineering. Προσωπικά χρησιμοποιώ τον WinHex αλλά μπορείτε να δείτε και τον xvi32 που είναι freeware.

IDA Pro Dissasembler & Debugger

Ο  IDA Pro είναι ένας πολύ δυνατός dissasembler. Το εργαλείο παρέχει και debugger ωστόσο για αυτή την χρήση καλύτερα προτιμίστε τον…

OllyDbg Debugger

Ο OllyDbg είναι ο πιό εύχρηστος debugger που έχω βρεί μεχρι στιγμής.

RegMon

Το RegMon είναι ένα utility που αγοράστηκε απο την Microsoft. Η δουλειά του είναι να σας δείχνει ποιές εφαρμογές κάνουν αλλαγές στο registry.

FileMon

Το FileMon που επίσης έχει εξαγοραστεί απο την Microsoft είναι ένα εργαλείο που παρακολουθεί τις αλλαγές στο filesystem σε real time.

LordPE

To LordPE(screenshot) είναι ένα freeware εργαλειάκι που διαχειρίζεται πολλά κομμάτια αρχείων PE (Portable Executable)

Winspector

Ο Winspector είναι ίσως το καλύτερο alternative για τον Spy++ που έρχεται με το Visual Studio.

Resource Hacker

Το τελευταίο προγραμματάκι στην λίστα μας, ο Resource Hacker, βοηθάει στην διαχείριση resource files. Μπορείτε να το χρησιμοποιήσετε για να δείτε ή και να επεξεργαστείτε resource files και resources απο εκτελέσιμα αρχεία.

Bonus εργαλείο

Το 11ο εργαλείο που παρουσιάζουμε σήμερα, είναι μια δική μου, open source, προσθήκη για php developers. Ονομάζεται php hexed και χρησιμοποιείται σαν patch script engine και μπορεί να συνεργάζεται με τον Win32Dasm και με τον OllyDbg. Αργότερα θα κάνω post κάποιο παράδειγμα, οπότε αν σας ενδιαφέρει μείνετε συντονισμένοι :)

Reverse Engineering, php , ,

FirePHP για την έκδοση 4 του PHP

December 6th, 2008

Είμαι σίγουρος ότι δεν υπάρχει web developer που να μην γνωρίζει το Firebug. Για όποιον δεν το γνωρίζει είναι ένα firefox extension που βοηθάει τον developer στην κατασκευή ενός site. Μπορείτε να επεξεργαστείτε και να κάνετε debug javascript, css και html πάνω στα πραγματικά δεδομένα και σε πραγματικό χρόνο. Βεβαία οι δυνατότητες του δεν έχουν όρια…, εγώ πχ. σαν reverser τον χρησιμοποιώ και διαφορετικά. Δεν θέλω να επεκταθώ παραπάνω για τον firebug γιατί δεν είναι και το θέμα του άρθρου. Όποιος όμως θέλει να μάθει περισσότερα μια αναζήτηση στο google και θα βρει αξιόλογα πράγματα. Εγώ βρηκα σε ένα ελληνικό blog 11 tips.

Ξεφύγαμε στο θέμα μας. FirePHP ένα πολύ δυνατό firefox extension που παράλληλα με το firebug μπορούμε να κατευθύνουμε τα php (error και debug) μηνύματα μας στην κονσόλα του firebug. Στο site του firephp μπορείτε να βρείτε μία php class που μπορείτε να την ενσωματώσετε στο project σας και να χρησιμοποιείτε την firebug console.

Τι γίνεται όμως αν χρησιμοποιείτε την έκδοση 4 του php ακόμα ? Δεν υπάρχει τίποτα και δεν πρόκειται να βγάλουν, διότι όσο έψαξα, όλοι λένε “php4 is dead”. Προσωπικά δεν νομίζω να ισχύει αυτό διότι υπάρχουν πολλά projects που τρέχουν σε php4 και δεν έχουν περάσει σε php5. Εμείς π.χ. στην Netwerk δεν έχουμε γυρίσει 100% σε php5 σε όλα μας τα project.

Έτσι σκέφτηκα να δημιουργήσω from scratch (πολύ το γουστάρω αυτό) μία function που να εμφανίζει της μεταβλητές που θέλω, σε πρώτη φάση, και στην συνέχεια να την ενσωματώσω στον error handler του php και στον mysql error handler ώστε να μου εμφανίζει τα php και mysql errors. Το ποιο ωραίο είναι ότι μπορείς να δεις και ένα dump από ένα mysql query με μορφή table καθώς και ένα πολύπλοκο array ή object, γιατί ανοίγει ένα παραθυράκι στη μέση της οθόνης με scroll.

Το καλό με τον firephp είναι ότι δεν σου χαλάει το site ένα error που θα εμφανιστεί ή ένα dump που θέλεις να κάνεις. Άντε πολύ ασχοληθήκαμε με την θεωρεία, πάμε σε λίγο ανάλυση και κώδικα.

Πως δουλεύει ο firephp; Πολύ έξυπνο χρησιμοποιεί δικούς του headers με μία πολύ έξυπνη δομή. Υπάρχει η προηγούμενη έκδοση X-FirePHP (ασχολήθηκα λίγο και την παράτησα) και η τωρινή X-Wf που είναι πολύ ποιο βελτιωμένη.

Έφτιαξα λοιπόν μια function την dev (την ονόμασα έτσι γιατί την είχα και παλιά, απλά τα τύπωνε στον browser), η οποία στην ουσία στέλνει τα κατάλληλα headers. Για json χρησιμοποείσα την php class Services_JSON.

function dev($a0) {
static $messageIndex=1;
if ($messageIndex==1) {
header('X-Wf-Protocol-1:http://meta.wildfirehq.org/'.'Protocol/JsonStream/0.2');
header('X-Wf-1-Plugin-1:http://meta.firephp.org/'.'Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.2.0');
header('X-Wf-1-Structure-1:http://meta.firephp.org/'.'Wildfire/Structure/FirePHP/FirebugConsole/0.1');
}
$type='INFO';
$args=func_get_args();
if (is_string($type)) {
$a0=strtoupper($a0);
if ($a0=='LOG' || $a0=='INFO' || $a0=='WARN' || $a0=='ERROR' || $a0=='TABLE') {
array_shift($args);
$type=$a0;
}
}

include_once('json.php');
$json = new Services_JSON();
$_ar=debug_backtrace();
if (strstr($_ar[0]['file'],'cmysql')) {
array_shift($_ar);
}
elseif (is_array($args[0]) && $args[0][msg]) {
$_ar[0]=$args[0];
$args[0]=$args[0][msg];
}
foreach($args as $arg) {
if (is_resource($arg)) $arg=get_resource_type($arg);
$meta=array('Type'=>$type,'File'=>$_ar[0]['file'],
'Line'=>$_ar[0]['line']);
$msg='['.$json->encode($meta).','.$json->encode($arg).']';
$parts=explode("\n",chunk_split($msg,5000,"\n"));
for($i=0; $i
$part = $parts[$i];
if ($part) {
if(count($parts)>2) {
header('X-Wf-1-1-1-'.$messageIndex.':'.
(($i==0)?strlen($msg):'').'|'.
$part.'|'.(($i
}
else {
header('X-Wf-1-1-1-'.$messageIndex.':'.
strlen($part).'|'.$part.'|');
}
$messageIndex++;
}
}
}
}

Έπειτα χρησιμοποίησα την set_error_handler και την σύνδεσα με την dev για να έχω και τα php error.

function errorHandler($errno, $errmsg, $filename, $linenum, $vars) {
if(error_reporting()!=0) {
$errortype = array(
E_ERROR           => "ERROR",
E_WARNING         => "WARN",
E_PARSE           => "ERROR",
E_USER_ERROR      => "ERROR",
E_USER_WARNING    => "WARN",
);
if ($errortype[$errno]) {
dev($errortype[$errno],array("msg"=>$errno.': '.
$errmsg,"file"=>$filename,"line"=>$linenum));
}
}
}
set_error_handler("errorHandler");

Σύνδεσα την κλάση που έχω για mysql query ώστε τα error να τα στέλνω στην dev. Τέλος μέσω της dev με τύπο table έδωσα τα αποτελέσματα των queries.

function dump() {
$dbDump = new CMySql();
$dbDump->query($this->Query,-1);
$body=array();
$title = $this->Query." (rows: ".$dbDump->num_rows().", fields: ".($dbDump->num_fields()-1).")";
if ($dbDump->next()) {
$header = array();
foreach($dbDump->record() as $i=>$v) $header[]=$i;
$body[] = $header;
do {
$row = array();
foreach($dbDump->record() as $v) $row[]=$v;
$body[] = $row;
}
while ($dbDump->next());
}
dev('table',array($title, $body));
}

Υπάρχουν και άλλοι τύποι στα headers που δεν ασχολήθηκα ακόμα. Trace, Dump και Groups, αλλά αυτά ας τα αφήσουμε στην php5, για να μην μας πουν ότι κάνουμε και προπαγάνδα κατά της ή ότι στηρίζουμε μόνο την php4. Απλά είναι κρίμα το firephp να είναι προνόμιο της php5, μόνο και μόνο επειδή το αποφάσισαν κάποιοι. Το μόνο configuration που χρειάζεται για να λειτουργήσουν τα παραπάνω, είναι να είναι ανοιχτό το output buffering ή να χρησιμοποιήσετε την ob_start()

php ,

Php mp3 id3 tag supports UTF-16

November 5th, 2008

Βρήκα ένα php script για mp3 id3 tag, για να το χρησιμοποιήσω με μία ajax form, ώστε όταν επιλέγεις ένα αρχείο mp3 να σου εμφανίζει αυτόματα τα στοιχεία του τραγουδιού (όνομα, συγκρότημα κτλ). Όλα καλά ώσπου ανακάλυψα ότι μπορεί ένα αρχείο να έχει τα στοιχεία στο v2 του id3 σαν UTF-16. Αυτό το κατάλαβα όταν στην φόρμα αντί να εμφανιστούν χαρακτήρες εμφάνιζε κουτάκια, ενώ με ένα mp3 player εμφανιζόταν κανονικά. Τότε με ένα hex editor και συγκεκριμένα τον αγαπημένο μου WinHex ανακάλυψα ότι τα στοιχεία ήταν σε UTF-16. Έτσι πείραξα λίγο το script, και τώρα υποστηρίζει και UTF-16.

Στην γραμμή 244 αντί για:
$this->v2[$name] = substr($frame, 1);
έβαλα αυτό:
$this->v2[$name] = $encoding=="\01" ? iconv("UTF-16","UTF-8",substr($frame, 1)) : substr($frame, 1);

php , ,

JSON++ compiled with VS 6.0

September 17th, 2008

Χρειαζόμουν έναν τρόπο να συνδέσω ένα c++ script με ένα php script, ώστε να ανταλλάσουνε δεδομένα. Στην αρχή σκέφτηκα με xml από το stdin/stdout, άλλα δεν ήθελα και τόσο δομημένη πληροφορία, όποτε αποφάσισα να χρησιμοποιήσω json.

Για php δεν υπήρχε συζήτηση ότι θα χρησιμοποιούσα μία κλάση που έχω βρει, και την έχω δουλέψει αρκετά σε πολλά projects, την Services_JSON. Για C++ όμως δεν είχα χρησιμοποιήσει ποτέ, όποτε έπρεπε να ψάξω και να βρω κάτι που να με βολεύει.
Googlesearch, json.org, πολλά project, στα πρώτα αποτελέσματα, άλλα όχι κάτι απλό έτσι που το ήθελα εγώ. Κάπου στη 3η σελίδα βρήκα ένα ενδιαφέρον project το JSON++. Αμέσως το κατέβασα, και έφτιαξα ένα test project στο Visual Studio 6.0 να το δοκιμάσω. Το JSON++ όμως ήταν για Visual Studio .NET. Δεν πτοήθηκα, διότι στο παρελθών έχω κάνει και compile το php5 με VC++ 6.0, οπότε ξεκίνησα τις αλλαγές ώστε να γίνει το compile.
Στο αρχείο value.cpp στην γραμμή 428 και 432, διόρθωσα την εντολή swprintf από
swprintf(strnum,31,L”%.1lld”,(*(__int64 *)val));
σε
swprintf(strnum,L”%.1lld”,(*(__int64 *)val));

και
swprintf(strnum,31,L”%lG”,(*(double *)val));

σε
swprintf(strnum,L”%lG”,(*(double *)val));

Στο αρχείο parser.h έβγαλα την μεταβλητή errstrings, από την γραμμή 28 extern const wchar_t *errstrings[8];
Στο αρχείο parser.cpp πρόσθεσα τα παρακάτω includes στην αρχή

#include <stdio.h>

#include <stdlib.h>

Μετέφερα την μεταβλητή errstrings από το αρχείο errstrings.cpp εδώ μέσα namespace json {const wchar_t *errstrings[9]={
/*0*/ L”Invalid Unicode escape sequence”,
L”Tried to read past End of File”,
L”Error reading Array, ] expected”,
L”Unquoted object names not allowed”,
L”Error reading Object, : expected after name”,
/*5*/ L”Error reading Object, } expected”,
L”Could not find a valid Object value”,
L”Invalid unquoted string, or misspelled literal”,
L”Duplicate value name in Object”
};

και στην γραμμή 253 του παλιού αρχείο άλλαξα την συνάρτηση _wtof σε _wtol.Από
val->setnumber(_wtof(number.c_str()));
σε
val->setnumber(_wtol(number.c_str()));

Αυτό βέβαια δεν είναι σωστό, γιατί μία μεταβλητή float θα χαλάει, το σωστό θα ήταν να ασχολούμουν λίγο παραπάνω και να έβρισκα το σωστό συνδυασμό από functions προκείμενο να μετατραπεί σωστά το string σε float. Στην προκειμένη περίπτωση δεν θα είχα float όποτε και δεν ασχολήθηκα παραπάνω. Αν κάποιος το βρει θα ήθελα να το γράψει στα σχόλια για είναι ποιο ολοκληρωμένη η μετατροπή του project από .net σε 6.0.Τέλος έβγαλα το αρχείο errstrings.cpp από το compile γιατί ήταν άχρηστο πλέων, και το compile έγινε κανονικά.

Το JSON++ ήταν ακριβώς αυτό που χρειαζόμουν, διότι είναι πού εύκολο στην χρήση του σε αντίθεση με τα υπόλοιπα open source projects.

JSON, c++, php , ,

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