Webfeedback
(Java? Si grazie!)

Data

by "syscalo"

 

18/01/2002

UIC's Home Page

Published by Quequero


Perchè se la mucca fa mu il merlo non fa me?

Beh ahia..Tostissimo, come hai fatto??? Beato te che sei capace di queste prodezze..Grazie sys mi hai aperto un mondo davanti :PPPPPP

In fin dei conti anche gli alberi hanno diritto di volare!

....

 

....

Difficoltà

( )NewBies ( )Intermedio ( )Avanzato (*)Master

 

Volete sapere cosa è, o meglio cosa fa webfeedback? Ok, dalla schermata iniziale:

"webfeedback is an easy-to use, intuitive website analysing tool."

forse è la definizione che non è molto intuitiva =).


Webfeedback
(Java? Si grazie!)
Written by syscalo

Introduzione

Questo programma, come mooolti altri, soffre di un grave problema nel meccanismo di protezione: fa affidamento sul codice Java.
Come sapete Java viene compilato in bytecode e questo facilita molto le cose, soprattutto avendo a disposizione tool come jad.
Quello che andrò a fare in questo tutorial è semplicemente far capire a webfeedback che io sono un utente registrato, che gli piaccia o no!

Tools usati

jad (ricostruisce il sorgente Java dal bytecode)
javac (dovete avere installato il jdk per ricompilare il file che modifichiamo)
winrar (per estrarre i file dall'archivio jar)

URL o FTP del programma

www.cyberware-neotek.com

Essay

Il tutorial è breve, ma vediamo comunque di schematizzare i passi che ci porteranno ad essere utenti registrati:

  1. capire dove il programma potrebbe effettuare il controllo della registrazione (tool usato: intuito)
  2. decomprimere il file (che abbiamo beccato al punto 1) jar in una directory temporanea (tool usato: rar)
  3. girovagare tra le directory e individuare il file che ci interessa (tool usato: ve lo devo dire? windows commander)
  4. disassemblare i file .class per ottenere il sorgente Java (tool usato: jad)
  5. editare il file Java in modo che il programma si convinca che io sono un utente registrato (tool usato: notepad)
  6. compilare il file Java da noi modificato (tool usato: javac)
  7. inserire il file .class ottenuto dalla compilazione nell'archivio jar (tool usato: rar)
  8. avviare webfeedback e felicitarsi del lavoro ben riuscito

Passiamo all'azione:

punto 1)
Portiamoci nella dir principale del programma e vi troviamo un po' di file: il file webfeedback.exe potrebbe essere il nostro obiettivo ma la nostra esperienza (l'avete anche voi vero?!) ci porta a dare un'occhiata alle proprietà del file, e si scopre che come descrizione c'è:

"LaunchAnywhere: the Java application launcher"

e come nome del file originale:

"laxw.exe"

è chiaro che i programmatori hanno semplicemente rinominato il launcher per applicazioni Java.

Ormai ci siamo, dobbiamo cercare un file jar che costituisce la vera applicazione. Tra le varie dir c'è lib che tra tutte quelle presenti mi sembra la più indicata. Ed infatti all'interno della dir lib c'è il file webfeedback.jar, cosa vogliamo di più?-)

punto 2)
spero non ci sia nulla da spiegare.

punto 3)
girovagando tra le directory si trova una dir interessante, register, che contiene un file ancora più interessante RegistrationKeyData.class che come il nome lascia intuire dovrebbe fare al caso nostro!

punto 4)
arriva la parte in cui sfruttare le potenzialità di jad usandolo per decompilare il file RegistrationKeyData.class:

jad -sjava RegistrationKeyData.class

e "magicamente" ci ritroviamo con un file RegistrationKeyData.java con il seguente contenuto:

// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/kpdus/jad.html
// Decompiler options: packimports(3)
// Source File Name: RegistrationKeyData.java

package WebFeedback.register;
import java.io.Serializable;
import java.util.Date;

// Referenced classes of package WebFeedback.register:
// ValidationInformation

public class RegistrationKeyData implements Serializable
{

public RegistrationKeyData()
{

userName = "Unregistered Version";
registrationOk = false;

}

public void setFirstUsedTimeSec(long l)
{

firstUsedTimeSec = l;

}

public boolean isFirstTimeUsed()
{

return firstUsedTimeSec == 0L;

}

public void setUserName(String s)
{

userName = new String(s);

}

public long getFirstUsedTimeSec()
{

return firstUsedTimeSec;

}

public ValidationInformation isExpired(long l)
{

Date date = new Date();
long l1 = date.getTime();
long l2 = getFirstUsedTimeSec() + l * 24L * 3600L * 1000L;
long l3 = (l2 - l1) / 0x5265c00L + 1L;
ValidationInformation validationinformation = new ValidationInformation(l3);
validationinformation.setExpired(l1 > l2);
return validationinformation;

}

public boolean isRegistered() <-- questa è la funzione che più vi deve attirare
{

return registrationOk; <-- e questo è il punto dove interveniamo

}

public String getUserName()
{

return userName;

}

public void unlockRegistration()
{

registrationOk = true;

}

private long firstUsedTimeSec;
private String userName;
private boolean registrationOk;

}

come ho commentato nel codice, la funzione che a noi interessa è isRegistered che come si può intuire ritorna lo stato di registrazione dell'utente.
Per fare questo il programma ritorna il contenuto della variabile registrationOk che come si vede dal valore di ritorno della funzione e dalla dichiarazione della variabile, è di tipo boolean.

Ora potreste pensare di andare a cercare nel codice dove viene settato il valore di registratioOk e agire di conseguenza, ma tutto questo non ci serve!

In questo momento noi siamo la classe RegistrationKeyData, e dobbiamo rispondere al programma che ci chiede se l'utente isRegistered e noi possiamo solo rispondergli true (equivalente a "certamente signor programma").

siamo così giunti al punto 5)
editiamo il file RegistrationKeyData.java modificando la funzione isRegistered in:

public boolean isRegistered()
{

return true; <-- questo è il "certamente signor programma"

}

passiamo alla compilazione, punto 6)
compilate il file RegistrationKeyData.java che avete appena modificato:

javac RegistrationKeyData.java

ed ottenete il nuovo RegistrationKeyData.class.

punto 7)
trascinate il file RegistrationKeyData.class all'interno del file webfeedback.jar (dopo averlo aperto con il rar) ovviamente nella dir WebFeedBack\register
.

punto 8)
avviate il programma e scoprirete (dopo avere passato la prima schermata di presentazione) che non c'è più la finestra di registrazione e che sulla barra in basso dell'applicazione compare la scritta:

"Your installation of weebfedback is already registered!"

che come avete già notato contiene pure un errore di battitura (probabilmente i programmatori non hanno ben chiaro come si chiama il loro programma).

at the next time, syscalo

Note finali

Una sola, ma mooolto interessante:
come avrete capito il vero problema di Java è che si può facilmente passare dal bytecode al sorgente Java.

Bene, tutto ciò che avete letto oggi sarà possibile anche per i futuri (ormai già presente) moduli "assembly" di .net, l'ambiente di lavoro con cui Microsoft vuole rivoluzionare il mondo del software.
Come sapete Miscrosoft è molto attenta ;^) ai problemi di sicurezza e per non permettervi di decompilare il codice "assembly" (il bytecode di .net) metterà a disposizione dei programmatori un tool che attualmente è in fase di preparazione, dal nome inconfondibile: "obfuscator".
Come farà ad impedirvelo? Rinominerà funzioni e variabili con nomi generati in modo random!

Con questa brillante idea la piattaforma .net è salva... o forse lo è solo secondo Microsoft! Il mio consiglio è:

state pronti, perchè se ne vedranno delle belle!

Disclaimer

Il seguente tutorial è divulgato a solo scopo informativo, nella speranza che i programmatori possano impare a proteggere il loro software (se proprio decidono che è necessario).
Non usate questa tecnica per utilizzare il programma senza registrarlo, i programmatori hanno lavorato e se voi ritenete che il loro programma vi sia utile è giusto che lo paghiate.