martes, 31 de agosto de 2010

PATH DEL JSP

Por ahí tenia el problema de crear un archivo javascript mediante una pagina jsp, el archivo lo creaba en una ruta inaccesible por el browser, y necesitaba que el js se creara exactamente en el mismo directorio donde se ejecuta el jsp.

los metodos para obtener estas rutas son:

request.getServletPath();
request.getServletContext().getRealPath();

si juntamos ambas:
String path1 = request.getServletPath();
String path2 = request.getServletContext().getRealPath(path1);

Obtendremos la ruta completa, incluido el nombre de nuestro jsp, ahora se requiere borrar esl nombre del jsp y quedar solo con la ruta...
una solución es haciendolo con el metodo replace, pero de antemano tenemos que conocer el nombre del jsp, cosa que no nos sirve de mucho si pretendemos usar la rutina en otras páginas...

Bueno aquí la clase para hacer esto independiente del nombre del jsp.


package Variables;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;

/**
*
* @author Nocturnus
*/
public class locales extends HttpServlet {
//private HttpServletResponse response;
public String path(HttpServletRequest request)
{
//-- OBTENER LA RUTA DE EJECUCION DEL JSP QUE ME LLAMA.
String path1 = request.getServletPath();
String path2 = request.getServletContext().getRealPath(path1);
int LONGPATH2 = path2.length()-1;
char charr[] = path2.toCharArray();
String jspruta="";
int g=0;
while(LONGPATH2 > 0)
{
if(String.valueOf(charr[LONGPATH2]).equals("/"))
{
g=LONGPATH2+1;
LONGPATH2 = 0;
}
LONGPATH2 = --LONGPATH2;
}
for (int i = 0; i < g; i++)
{
jspruta= jspruta.concat(String.valueOf(charr[i]));

}
//---------------------------------
return jspruta;
}

la llamamos desde la página jsp así:
Variables.locales local = new Variables.locales();
String la_ruta_es=local.path(request);
out.println(la_ruta_es);

Entonces, es necesario aclarar que estoy recien conociendo el mundillo java o el mundote java... por tanto, si usted conoce una forma mucho más rapida da saber este path, DIGAMELO jejeje.

viernes, 20 de agosto de 2010

Cracking del DeluxeMenu

// Deluxe Tabs (c) 2006 - 2009, by Deluxe-Tabs.com
// version 3.15
// http://deluxe-tabs.com

Bueno, este programa tambiene es muy bueno, genera menus JS + Ajax, Popups, Tabs, muy bien presentados, listos para usarse en la capa gràfica de cualquier desarrollo web. la cosa es que Mientras sea trial, el codigo que genera muestra una fea NagScreen que dice trial. Bien, luego de un rato de analizar estas cosillas, ahora esas nags desaparecen... jejeje. ya les muestro como, por ahora redacto los docs para estas 2 aventuras de cracking de protecciones de shareware.

bien aqui vamos.

Todo parte de la curiosidad, instalamos el programa, generamos un menu, lo guardamos en un directorio y vamos a ver que tal.
Vemos que aparece un mensaje de Trial, entonces vemos el codigo fuente HTML y vemos que el codigo html hace una llamada al script deluxe-menu.files/dmenu.js


entonces dmenu.js es el objetivo, esta claro.

vamos a leer ese archivo y vemos que esta algo ofuscado, da lo mismo.
la cosa es tener curiosidad , tranquilidad y un poco de olfato, revisamos el codigo y vemos por ahi que existen llamadas a funciones, en las cuales se pasan parametros strings encriptados, ahi esta el asunto, si esta encriptado, es porque no quieren que veamos algo.

localizamos esto:
la function _dmko()
tambien una declaracion a una variable s (var s ="algoencriptado") el cual contiene un string encriptado.

entonces CRACK:
localizar function _dmko(), limpiar var s, dejar en ""

y guardamos el script modificado.

ejecutamos la pagina html y vemos que el trial ya no va mas.

con los otros menus creados con el programita este, pasa lo mismo, hace una llamada a un script inicial, buscamos estos strings encriptados y los dejamos en blanco, o mejor aun, cambienos sus strings por letras sin sentido, veremos que el programa comienza a lanzar mensajes raros en la pagina, ahi comienza todo, viendo que sucede si modifico algo...

asi el programa tamien genera TABS , hacer cracking a esta js (dtabs.js) es similar, pero se diferencia en algo..

Para Crackear: buscar LKJU(){if(!TJ1||!b0J) y cambiar por LKJU(){if(!TJ1||b0J)
Para llegar a esta concluciòn, todo comienza en el link al que apunta Trial y como se comienza a manejar Var s.

jueves, 19 de agosto de 2010

Cracking de Software.

Proximamente, les mostrare lo facil que fue crackear el Navicat9 Premium pero para LINUX! eh... Para disfrutar de este excelente programa sin limite de tiempo, sin nagscreen y dejarlo con nuestro nombre ahahaha. bueno, si les gusta compren el programita si he! jajajaja.

lunes, 16 de agosto de 2010

Jtable + MySQL Query con NetBeans

Bien, luego de jugar un buen rato con NetBeans 6.9, me ha terminado por gustar. de hecho, baje Eclipse, lo instale lo vi y naaa, me quedo con NetBeans.
Además que su integracion con GlassFish y Tomcat es genial, sin contar el asunto de las integraciones de las framework y el desarrollo de GUI. Quizás Eclipse haga lo mismo, pero NetBeans me parecio más intuitivo. Bueno, aca dejo algo de código que he programado, el cual sirve para hacer una consulta a una tabla en nuestra base de datos MySQL y ed este modo desplegar sus datos en una Jtable.

No es mi deseo enseñar a usar NetBeans, asi que se da por hecho que sabe usarlo básicamente (crear una Frame, insertar una Table, editar su código.)

Entonces, agregamos una table a la Frame y editamos el codigo de esta Jtable, asegurandonos de que el Modelo cargará los datos desde unos arrays que nosotros llenaremos (marcado con rojo).

private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();
datos = new javax.swing.table.DefaultTableModel(
this.Datos,
this.Columnas
);
jTable1 = new javax.swing.JTable(datos);
....

} // fin del método initComponents


Ok, en la clase de esta Frame (la he llamado Form2) declaramos...

public class Form2 extends javax.swing.JFrame {
public String[][] Datos;
public String[] Columnas;
samba.usos smb = new samba.usos() ;
private DefaultTableModel datos;

el package samba la que contiene una classe llamada usos (hecha por mi), contiene lo siguiente (básicamente).

public String[][] ReturnQueryEnArray(String Query, String Srv, String BD, String usr, String pass) throws Exception
{
//************


BD.MySQL MySQLc = new BD.MySQL() ;
String ConsultaGetUSuarios = Query;
MySQLc.statement = MySQLc.ObtenerConexion(Srv,
BD,usr,pass) ;
MySQLc.resultset = MySQLc.Consultar(MySQLc.statement, ConsultaGetUSuarios);
MySQLc.RegistrosArray(MySQLc.Rcolumnas, MySQLc.Rfilas, MySQLc.resultset);
String ArrayDatos[][] = new String[MySQLc.Rfilas][MySQLc.Rcolumnas];
//**********
int k=0;
int j=0;
while (k <= MySQLc.Rfilas-1)
{

while(j<=MySQLc.Rcolumnas-1)
{
ArrayDatos[k][j] = MySQLc.ArrayDatos[k+1][j+1];
++j ;
}
j=0;
k++;

}
MySQLc.statement.close();
MySQLc.kon.close();
return ArrayDatos;
}//*****************

y el package que me hice, que se llama BD con su classe MySQL contiene:

package BD;

import java.sql.*;

/**
* @author iknos -
* @see lib 1 de un conjunto de librerias para conexión y manipulacion de datos desde MySQL
* eso.
* @version 0.1 LIBS
* WEB: linuxiandolaslackware.blogspot.com
* e-mail: linuxiandola@gmail.com
* Version 0.1.1A
*/
public class MySQL
{
/**
* @see String Retorna el error en String.
*/
public String ERROR ; // RETORNA ERROR STRING
/**
* @see Connection kon, para manipular la conexión con la BD.
*/
public Connection kon ;
public int Rfilas,Rcolumnas ;
public Statement statement ;
public ResultSet resultset ;
public String[] NmCols ;
public String[][] ArrayDatos ;


public MySQL()
{
}

public Statement ObtenerConexion(String Servidor, String BDatos,
String usuario, String passwd) throws Exception
{
/*
Funcion para obtener conexion a la base de datos, retorna "HANDLE" en statement

*/

String login = usuario ;
String password = passwd ;
String url = "jdbc:mysql://"+Servidor+"/"+BDatos ;
Connection conn = null ;
statement = null ; // quitado Statement
ResultSet rs = null ;
try
{
this.ERROR ="OK";
Class.forName("com.mysql.jdbc.Driver").newInstance();

conn = DriverManager.getConnection(url, login, password);

kon = conn ;
statement = conn.createStatement() ;
} catch(Exception err)
{

// si llegó aqui, tenemos error;
this.ERROR ="ERROR EN LA CONEXION ... CLASS MySQL.java "+
"public Statement ObtenerConexion(String Servidor, String BDatos, "+
"String usuario, String passwd) throws Exception - "+ err.toString();
System.err.print("ERROR EN LA CONEXION ... CLASS MySQL.java");
}

return statement ;

}
//*******
public ResultSet Consultar(Statement st ,String query) throws Exception
{
ResultSet rs = null ;
rs = st.executeQuery(query) ;
ResultSetMetaData rsmd = null;
rs.last();
this.Rfilas=rs.getRow();
rs.first();
rsmd = rs.getMetaData();
this.Rcolumnas = rsmd.getColumnCount();
this.NmCols = new String[this.Rcolumnas+1];


for (int i = 0; i <>
{
// la primera columna es la #1.
this.NmCols[i+1] = rsmd.getColumnLabel(i + 1);

}


rs.first();

return rs ;
}


/**

* @param cols Cantidad de columnas, se puede obtener desde MySQL.Rcolumnas
* @param filas Cantidad de filas, se puede obtener desde MySQL.Rfilas
* @param resultset
* @return siempre retorna 1 ( hasta nuevo aviso)
* @throws Exception
*
*
*/
public int RegistrosArray(int cols, int filas, ResultSet resultset ) throws Exception
{
/*
* @see asdsadsadsa
*/

this.ArrayDatos = new String[filas+1][cols+1];

int k = 1;
int j = 1;
while (k <= filas)
{

while(j<=cols)
{
this.ArrayDatos[k][j] = resultset.getString(j);
++j ;
}
j=1;
k++;
resultset.next() ; // pasar al sigueinte registro
}
return 1;

}

//Fin clase
}


Siguiento todo esto, en nuestra Main() tenemos que agregar new Form2().setVisible(true);

así.

public static void main(String[] args) throws Exception
{
new Form2().setVisible(true);

}

y ahora, modificamos el constructor por defecto de la Form2 y lo dejamos asi.
public Form2(
) throws Exception {

this.Datos = smb.ReturnQueryEnArray("Select ID_USUARIO,USUARIO,PASSWD From USUARIOS",
"localhost", "DomTurnus", "root", "");

String cColumnas[] = { "Title 1", "Title 2", "Title 3"};
this.Columnas = cColumnas;

initComponents(); // llamada a cargar los constructores de la Frame y sus componentes, entre ellos jTable.
}


Entonces, si en algún momento deseamos agregar datos a la jTable...

Object[] data = new Object[5];
data[0] = "uno";
data[1] = "dos";
data[2] = "tres";
datos.addRow(data);

o mejor aún, actualizar según datos obtenidos desde una Query...

datos.addRow(Datos[1]);

Lógicamente en este caso los datos siempre tienen que ir llegando al array Datos[][].

Bueno, espero se entienda. si no, me avisan, ;)