1. So I think I'm going to restart this blog and revive it with a couple of more informal kind of posts. Since right now I'm taking around 2 years to focus only in a master degree, it seems obvious that I keep a historical blog of what I'm doing.

    A bit of background about how I ended up here, I was fortunate enough to get a Fulbright scholarship and come to study in the US, for those who do not know about the Fulbright program I highly encourage you to take sometime to read about if you are planning to come study in a US university. So to make the story a bit short I picked UB as much as UB picked me,  and so far it has been a roller coaster of emotions (I'm sure it will continue to be as the semester progress), I found the university incredible diverse and with lots of different programs and clubs for student that is hard to get bored.

    The semester basically started and I've picked Distributed System, Computer Vision, Algorithm for Modern computer System and Modern network concepts as my four main courses. I'll try to keep writing on a regular basis on how each course progress but so far so good, I've taken Computer Vision and even though I don't have a solid knowledge of Matlab I was able to pick it up. Distributed System is also a field that I have not been able to study enough even though I've done concurrency in Java I never quite program in a distributed system myself.

    Oh it's almost time for classes, I'll be back.



    0

    Añadir un comentario

  2. Por aca haciendo extendiendo el ImageView y haciendo una animación basica me encuentro con que setAlpha(int) esta despreciado, esta bien ¿cierto?, lo que no comprendo es que dentro del codigo el nuevo setImageAlpha utiliza internamente el metodo despreciado setAlpha sin absolutamente ningun cambio.

    Se ve algo así, pero puedes verlo por ti mismo en la clase ImageView.java


     /** * Sets the alpha value that should be applied to the image.
    
         * @param alpha the alpha value that should be applied to the image
    
         * @see #getImageAlpha()
    
         */
    
        @RemotableViewMethod
    
        public void setImageAlpha(int alpha) {
    
            setAlpha(alpha);
    
        }
    
    
    
        /**
    
         * Sets the alpha value that should be applied to the image.
    
         *
    
         * @param alpha the alpha value that should be applied to the image
    
         *
    
         * @deprecated use #setImageAlpha(int) instead
    
         */
    
        @Deprecated
    
        @RemotableViewMethod
    
        public void setAlpha(int alpha) {
    
            alpha &= 0xFF;          // keep it legal
    
            if (mAlpha != alpha) {
    
                mAlpha = alpha;
    
                mColorMod = true;
    
                applyColorMod();
    
                invalidate();
    
            }
    
        }

    0

    Añadir un comentario


  3. Durante los últimos meses he dedicado mi esfuerzo a la creación de una solución que facilite a Bares y restaurantes la administración de sus locales, particularmente aquellos que son parte de la pequeña y mediana industria.

    ¿Proposito de Pozool?

    Para los locales que inician o que tienen presupuestos limitados, resulta un reto la adquisición de tecnología, y optan por utilizar procesos manuales para facturación, y con buenas razones dado que los puntos de ventas rondan precios que no están al alcance de un negocio pequeño o  de mediano tamaño.

    Pozool soluciona este problema particular colocándose como una aplicación gratuita en el playstore y llegando a la mayor cantidad de dispositivo. En vista de la alta penetración de dispositivos y diversidad de dispositivos Android la plataforma es perfecta para adaptarse a diferentes presupuestos.

    Para mas detalles de Pozool visita el sitio oficial o Atech Mobile la empresa detrás de esta increíble aplicación.
    0

    Añadir un comentario

  4. Siempre he abogado por Java, es uno de los lenguajes mas robustos y faciles de entender si vienes de la lineas de C o C++. Muchas de sus caracteristicas han sido emuladas por la familia de lenguajes de .NET. Desde AWT y Swing hasta JSP, Servlet y JSF, pasando por Android java me ha seguido (ó yo a el) sin embargo hay un punto donde tengo que diferir de la forma en como el lenguaje no ha evolucionado y adaptado a las plataformas corrientes.

    Hoy me encuentro intentando crear un API REST para java, la convencion obviamente es inclinarse a JAX-RS y hay suficientes implementaciones para hacer un par de libros al respecto. Sin embargo aqui yace e problema tantos APIs y framework de Java con documentacion a media y poca atencion sin comunidad sin soporte son inservibles.

    No pierdas la fe

    Desarrollo y las ciencias de la computacion no es una cuestion de fe, sino de pragmatismo. Me resulta dificil que en pleno 2013 Java no haya introducido una forma de dinamismo sin tener que recurrir a Groovy o Scala. La simple funcion de serializar y deserializar en diferentes contenedores es bizarra. Y se ha fragmentado entre la nueva versiones y las vieja estable. Tal es el caso de Jersey el cual existen diferentes versiones y diferente articulos al respecto, que si bien resultan buenos no son completos. Falta, falta algo y lo que falta es integracion, una cierta integracion que he logrado ver en python o en perl. Son plataformas que prometen algo mas que especificaciones complejas y un gran numero de standard. Una burocratica forma de lanzar nuevas caracteristicas en los lenguajes; que nos han retrasado al menos unos 8 años con respecto a .NET el competidor mas cercano.  Aqui estan las 3 razones por las cuales java me ha decepcionado.


    Sin Delegaciones, Sin closures

    Esto esta en el wishlist para java 8, la habilidad de podeer delegar o pasar funciones como parametros para ser ejecutadas luego por la JVM en runtime. Lo mas cercano a esto es intentar enviar un objeto que implemente una interfaz pero no es eso lo que quiero. Quizas con refleccion podrias hacer algo similar pero se vuelve tan engorroso que ni siquiera vale la pena. Funciones dinamicas, on-fly olvidate de eso en Java, si no existe al momento de compilar no lo vas a poder usar.

    Que paso spring antes eras chevere! has cambiado

    La eterna batalla entre Java EE y spring dos enfoques que se ha vuelto una pesadilla para quien quiera estar en la Web con java. Que camino tomar, donde ir? y por que? Es cierto que python tiene muchas formas tambien de hacer las cosas pero no es necesaria tanta engorrosa configuracion ni tampoco saber si un contenedor acepta EE 6 o EE 5. Hoy Spring es un nido de proyectos que no tienen que ver con IoC tanto como antes, y con complejas caracteristica que ya no comprendo.

    Almacenamiento de datos, ORM, hibernate y mas.

    El resto lo puedo pasar pero la impractica medicina para almacenar datos, agreguemos el hecho que java no permite crear campos on-fly, y entre sessiones, transacciones, attach y detach; puede ser extremadamente confuso intentar hacer un simple join. El framework te permite hacer consultas a traves de HQL lo cual no tiene mucho sentido si queires alejarte de SQL, tambien puedes utilizar Criteria pero es mas dificil entender una engorrosa linea de criteria con clases limit y condiciones, que ejecutar una consulta SQL.


    No me mal interpreten aun creo que java es un excelente lenguaje que esta pasando por un mal momento, Android es hoy en dia uno de los pilares que mantiene a java en su gloria y ha hecho un buen trabajo con ello. Por mi parte buscare una solucion a mi problema en otra plataforma que resulte mas facil y conveniente.













    2

    Ver comentarios

  5. Long time withouth making a post here, well what can I say…… I've been  busy (that's code for lazy). So I will try to write some article probably regarding android in the next weeks before the end of the year.

    Other than that …… I wish you happy coding!!
    0

    Añadir un comentario

  6. Recientemente estuve trabajando en uno de mis nuevos sitios con Drupal 7. Es un sitio nuevo y el cambio consistio simplemente en remover el www del URL. Fui al .htaccess y simplemente descomente las lineas en cuestion.

    # To redirect all users to access the site WITHOUT the 'www.' prefix,
    # (http://www.example.com/... will be redirected to http://example.com/...)
    # uncomment the following:
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]

    Todo bien, el URL se carga sin el www, chequee mi sitio el cual tiene hablitado https. Todo excelente. Bueno, mas tarde tenia que hacer un cambio en mi carousel view. Nada importante y entonces aparece el siguiente mensaje

    an ajax http request terminated abnormally

    que raro..debe de ser el browser, mismo efecto en todos incluso safari. Que hice? el unico cambio relacionado fue remover el www del URL? haciendo una pequeña busqueda me encontre este articulo en ingles [1]

    Aplique los cambios sugeridos en el sitio y todo perfecto. Basicamente el problema consiste en que el core de drupal no puede determinar the base_url. Para arreglar esto debes de hacer los siguientes pasos:

    1. Abrir /sites/default/settings.php
    2. Ir a # $base_url = 'https://www.example.com';
    3. En mi caso estoy utilizando https y removi el www entonces cambie a lo siguiente:
    $base_url = 'https://example.com'; //NO trailing SLASH!
    4. Salvar el archivo, podria ser util limpiar la cache de drupal, en mi caso no fue necesario y resolvio mi problema

    Gracias a Shine Sudarsan por ese pequeño articulo que me ahorro tiempo con su solucion.



    Bibliografia

    [1] http://www.prasinotech.com/content/how-resolve-ajax-http-request-terminated-abnormally-error-drupal
    0

    Añadir un comentario

  7. En diciembre me tome un tiempo para reirme criticar el sitio de la facultad de ciencias y sistemas de la Universidad nacional de Ingenieria la cual es sin duda lider en ciencia y tecnologia. Pero bueno el caso es que desde el post se han hecho "muchos" cambios y esfuerzos para mejorar la apariencia y aqui lo demuestro:

    Antes se veia así:
    Y ahora taran:




    ¿No es genial?, es por eso que he decidido hacer una serie de articulos troleando apuntando lo que a mi parecer son errores del sitio.

    Facepalm para el sitio


    Dr House ¿que le parece si hacemos la pagina solo con HTML?


    ¿Homero que te parece la expectacular combinacion de colores?



    ¿Lord Zed que te parecio la navegacion del sitio?




    La mayoria de los enlaces redirigen a /# asi que solo sirven para refrescar... son enlaces muertos eso te da menos en busquedas organicas sin mencionar que no comprendo la navegacion.


    Sr Picollo, ¿que parece si ponemos infolinks para hacer algo de $?


    Si claro la pagina no tiene scripts por si mismo, nada de JS pero si tiene script de infolinks para ser plata extra. Bravo!






    Ademas vamos a publicitar la Maestria Informatica Empresarial!










    En lo personal yo he hecho muchas cosas erradas(demasiadas creo) y las sigo haciendo.… pero intento que no vean la luz del Dia, tampoco fui un alumno clase A pero tengo una obligación moral con la facultad para trolear exponer lo que creo que están haciendo mal.


    2

    Ver comentarios

  8. Ahora que finaliza el año, es el constante tiempo de reflexión de todo lo que ha sucedido durante este 2011, que para bien o para mal ya concluyo, lo recordare un año de idas y venidas, que me dejo nuevas y excelentes amistades; invaluable experiencia y conocimiento, pero sobre todo me regalo un año mas de vida.
    Hoy 31 de Diciembre de 2011, a pocas horas de concluir el año me siento a pensar lo que vivi, pero mas pienso en lo que me espera, en lo que nos espera. Sí en este funesto 2011 que se nos llevo a muchos faros, Columbo, Steve Jobs, Dennies Ritchie y Mcarthy.

    No olvides tampoco este 2011 que se acabo el mundo dos veces :D, y que tambien fue el año 11:11:11 11:11:11 que bien espero que hayas disfrutado ese segundo.

    Este 2011 cometimos errores, pero suelo pensar que cometemos los errores correctos, esos errores que te enseñan por que quien no comete errores no aprende y no vive, esos errores te permiten ser quien eres hoy, y de no cometerlos ¿quien serias? ¿quienes seriamos?.

    Por mi parte siempre publico la lista del año pasado con lo que quise lograr:
    • Terminar mi carrera y conseguir mi titulo (Abril o Mayo) Aunque termine como en septiembre.
    • Certificarme SCJP (Junio/Julio), Aun tengo pendiente mi certificación este es un fiel recuerdo que me sigue desde 2010.
    • Mejorar aun mas en C tuve uno que otro encuentro con C y C++ este año quisiera que fueran mas seguido en 2012 la idea es aventurarme en programación de sistemas operativos preferiblemente distribuidos o moviles.
    • Aprender Java 7 en cuanto salga(Julio).  Listo esto fue muy facil en cuanto salio hice mis primeras impresiones aunque espero que Java 8 ya se ponga a nivel de C#.
    • Ser mas activo con iniciativas Open Source, quizas participando en algun proyecto. Pude haber participado mas pero estuve colaborando en ciertas librerias de Android como AChartEngine pero no tan activa como me hubiera gustado, eso sí estuve muy bien en StackOverFlow.
    • Mejorar en gran medida mi Deutsch practicar practicar y practicar, un sitio recomendable  LiveMocha lamentablemente no mejore mucho mi aleman necesito practicar mas para no perder la habilidad que ya tengo

    Algunas cosas no esperadas de 2011 fueron:
    • Mayor participación en Android y tecnologias moviles, agradezco mucho al trabajo que he venido desempeñando en Auxilio mundial que me ha retado en plataformas smartphone.
    • Estuve explorando mas acerca de J2EE sin embargo pudo haber sido mejor lamentablemente no e encontrado la excusa perfecta para hacerlo.
    • Aprendi mas de seguridad fueron excelente curso impartido en Unan-Leon al respecto
    • Mas activo en stackoverflow 
    Aun no he pensado mucho en 2012, así que lo dejare así por el momento.

    Estoy agradecido de haber vivido un año mas, y esperamos tener mejores tiempos en 2012.

    Así que hasta 2012 muchas gracias por la lectura. Hasta Pronto

    Atte @necronet

    1

    Ver comentarios


  9. This is probably the last technical year post, consider it my Chrismast gift yo you. Happy holidays,

    A little bit of history you can Check  Reto 14: Android crackme #2, it is an intersting publication where they challenge you to bypass LVL security on a developed APK; that was the perfect excuse for me to get to learn about decompile code in Android with practice, I mean I knew "How" but i theory never done it for myself, so thanks again to Hackerplayers for the challenge.

    Clarifications

    This post is not intended to be a profound explanation about how Android compile clases and package into an APK. I'm not going to explain deeply about Smali/Backsmali (Decompile code), there are already excelent places that you can check them out like Dissasembling Dex File or Android Cracking, personally I liked the last better because it's a whole blog intended to cracking, tells you a lot about tips and tricks in this subject, totally worth it to check it out.

    This post is a pragmatic example on how you can bypass a security licencing solving ofcourse Reto 14: Android crackme #2. So lets start with the fun, here is the answer I gave and was approve by Hackerplayer author:

    Download the APKTool

     Apktool is a wonderful tool, when it comes to cracking more like when it comes to decompiling, it becomes your bestfriend allows you to do several stuff like:
    • Decoding resources to nearly original form (including resources.arsc, XMLs and 9.png files) and rebuilding them
    • Smali debugging: SmaliDebugging
    • Helping with some repetitive tasks
    After following the APKTool instalation you can proceed to execut the folowing command:

    $apktool d cracme2hpys.apk out


    *out  is the target folder where the apk it's decompressed.

    Checking the extracted folder out

    First I though I could bypass the application by changing the start up ACtivity on the Manifest, but that was unsucessful.

    So No way, I had to check out the decompile code. The AndroidManifest.xml it's always a good place to start, gives you many hint where to look like the Start up Activity, probably there is where the  ALVL process start.



    So you now we know we have to check LicenseCheck.smali. When you open this file, you'll se a lot of code similar to Assembly language if you are not confortable with this, get used to it's the only way.

    Search for the #onCreate method on LicenseCheck, this is where the licesence que check and invoke the method doCheck on the same class.

        invoke-direct {v1, p0, v2, v3}, Lcom/android/vending/licensing/LicenseChecker;->(Landroid/content/Context;Lcom/android/vending/licensing/Policy;Ljava/lang/String;)V
    
        .line 120
    
        iput-object v1, p0, Lcom/hpys/crackmes/LicenseCheck;->mChecker:Lcom/android/vending/licensing/LicenseChecker;
    
        .line 123
    
        invoke-direct {p0}, Lcom/hpys/crackmes/LicenseCheck;->doCheck()V
    
        .line 125
    
        return-void
    
    

    If you look at the line 123. you'll se there is a doCheck method invocation of the current class so lets dig out to see what does this method actually do:

    .method private doCheck()V
    
        .locals 2
    
        .prologue
    
        .line 106
    
        iget-object v0, p0, Lcom/hpys/crackmes/LicenseCheck;->mChecker:Lcom/android/vending/licensing/LicenseChecker;
    
        iget-object v1, p0, Lcom/hpys/crackmes/LicenseCheck;->mLicenseCheckerCallback:Lcom/android/vending/licensing/LicenseCheckerCallback;
    
        invoke-virtual {v0, v1}, Lcom/android/vending/licensing/LicenseChecker;->checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V
    
        .line 107
    
        return-void
    
    .end method
    
    
    
    Now is clear the method doCheck does the License check through a class named LicenseCecker aparently there is also a callback instance passed to this object probably to inform that the checking was successfuly, so now we have to into:

    com/android/vending/licensing/LicenseChecker


    Exploring LicenseChecker



    Before we start to read all the LicenseChecker and $ classes, we should go straight to the checkAccess method that was invoke previusly in LicenseCheck class remember? I'll help you out here:

        invoke-virtual {v0, v1}, Lcom/android/vending/licensing/LicenseChecker;->checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V

    Probably this method gives us better clues than any other, this method is quite extensive, so I'll narrow it do to the important stuff:

    # virtual methods
    
    .method public declared-synchronized checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V
    
        .locals 9
    
        .parameter "callback"
    
        .prologue
    
        .line 133
    
        monitor-enter p0
    
        :try_start_0
    
        iget-object v1, p0, Lcom/android/vending/licensing/LicenseChecker;->mPolicy:Lcom/android/vending/licensing/Policy;
    
        invoke-interface {v1}, Lcom/android/vending/licensing/Policy;->allowAccess()Z
    
        move-result v1
    
        if-eqz v1, :cond_0
    
        .line 134
    
        const-string v1, "LicenseChecker"
    

    Did you see if-eqz v1, :cond_0  operation? well this it's a very important one if this it's not true then It will send you lower to instantiate the License Validator, and we don;t want that do we?, so lets negate that condition with another operation if-nez vx,target  so now it should work right? welll


    Are you kidding It ain't working.... ¬¬

    Yes, yes I know we change the license execution and recompile and repacked (I'll explained the process later) but still does not work, well turns out the challenge gives you another problem. The MyAndroidAppActivity does not seem to be invoking the onCreate method and generate the following trace on logcat:



    So?, What's going on?, The answer is plain simple the MyAndroidActivity does not invoke onCreate, we need to add that into the backsmali. Look:

    .class public Lcom/hpys/crackmes/MyAndroidAppActivity;
    
    .super Lcom/hpys/crackmes/LicenseCheck;
    
    .source "MyAndroidAppActivity.java"
    
    # direct methods
    
    .method public constructor ()V
    
        .locals 0
    
        .prologue
    
        .line 6
    
        invoke-direct {p0}, Lcom/hpys/crackmes/LicenseCheck;->()V
    
        return-void
    
    .end method
    
    # virtual methods
    
    .method public onCreate(Landroid/os/Bundle;)V
    
        .locals 0
    
        .parameter "savedInstanceState"
    
        .prologue
    
        .line 11
    
        invoke-super {p0, p1}, Lcom/hpys/crackmes/LicenseCheck;->onCreate(Landroid/os/Bundle;)V
    
        .line 15
    
        return-void
    
    .end method
    

    The code above show a lots of lacks in the MyAndroidAppActivity, being a simple and small code we can aknowledge the following problems:


    • The onCreate method does not call the super.onCreate(savedInstanceState)
    • The onCreate method does not have any assign layout
    • The MyAndroidAppActivity inherit the LicenseCheck instead of the Activity, and also does not make the proper code on the init invocation.
    Here is the right code:


    .class public Lcom/hpys/crackmes/MyAndroidAppActivity;
    .super Landroid/app/Activity;
    .source "MyAndroidAppActivity.java"
    
    
    # direct methods
    .method public constructor ()V
        .locals 0
    
        .prologue
        .line 6
        invoke-direct {p0}, Landroid/app/Activity;->()V
    
        return-void
    .end method
    
    
    # virtual methods
    .method public onCreate(Landroid/os/Bundle;)V
        .locals 1
        .parameter "savedInstanceState"
    
        .prologue
        .line 15
        invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    
        .line 17
        const/high16 v0, 0x7f03
        invoke-virtual {p0, v0}, Lcom/hpys/crackmes/MyAndroidAppActivity;->setContentView(I)V
    
        .line 20
        return-void
    .end method


    We  can take the following notes like the onCreate and setContentView invocation, and the variable v0 was added, when adding variable you have to be careful to declare how many are you using in the block scope in this case we add locals 1 on the method declaration.

    Are we done? kind of, we now need to recompile and repackaged this into an APK, as I promised this is how you do it

    Back to an APK

    Rembember apktool? well the same tool that allows you to decompile, help you into recompile and recreate an APK, but you probably going to need a little bit more to get it back into the phone. "But you'll se I'll show you" (Joker quote)

    First build and create the apk with the following command

    $ apktool b out crackemecracked.apk
    
    
    You will also need to sign this out,  and you are going to need a keystore, you can easly created with keytool

    $ keytool -genkey -v -keystore keystore.keystore


    Now that you have a keystore, use it to signed your app

    jarsigner -verbose -keystore keystore.keystore crackemecracked.apk crackmecracked


    If you wish to learn more about how to sign Android application don't forget to pass by the  oficial documenation.

    Now that we have our nice apk signed, we can reinstall it into the phone with the adb:

    $ adb uninstall com.hpys.crackmes 
    $ adb install crackemecracked-za.apk
    
    

    If everything it's correct you should be seeing this:




    And READY!! 



    ¿Some aditional tips ?

    Particulary I've never done this before, the information on how to modify backsmali is not that wide, but it is not that hard (at least not the basic to do this)

    - I suggest you learn a bit about Assembler because it is really similar the operator and the register changes.

    - Whenever I get lost with a specific operation I went to Dalvik OpCode it was like the Larouse for me

    - I did some small and simple classes to check out what does the decompile code looks like.

    - No need to check everything like LicenseChecker$ResultListener$1 this classes are either anonymous or declare internal classes on the file so you can skip them.

    - For the recompilation and reepackaging procedure I did small shellscript feel free to use it.

    - I suggest you two excelent I/O presentations.

    Google I/O 2008 - Dalvik Virtual Machine Internals



     Google I/O 2010 - A JIT Compiler for Android's Dalvik VM


    0

    Añadir un comentario

  10. Este es probablemente el ultimo post del año que sea tecnico/tutorial, y es mi regalo de despedida hasta el 2012, espero que lo disfruten. 

    Para hacer un poco de prologo revisa el Reto 14: Android crackme #2, es una interesante publicación que  te retan a pasarte el licenciamiento de Android de un APK; así que es la excusa perfecta para aprender un poco de decompilado de Android, el cual hasta el momento sabia de manera teorica y nunca habia tenido una motivación mas alla de simplemente ser "el sabiondo teorico" para pasar a ser un curioso pragmatico, así que gracias a Hackerplayers por el reto.

    Aclaraciones

    Este post no es un explicativo profundo acerca de la forma que Android compila las clases y empaqueta el APK. Tampoco voy a explicar que es Smali/Backsmali (código decompilado) para ello ya hay buenos blogs , como Dissasembling Dex File  y claro Android Cracking el ultimo un cracker de Android te cuenta muchos secretos y trucos acerca de código decompilado.

    Este post es más acerca de como te pasas el licenciamiento de seguridad resolviendo el Reto 14: Android crackme #2. Asi que empezemos a divertirnos aqui esta mi respuesta (la cual fue aprobada por el autor del blog):

    Descarga el APKTool

    El apktool es una herramienta maravillosa, si te quieres hacer de esto de cracking aplicaciones android el apktool es un fiel compañero, permite realiza muchas cosas entre ellas:
    • Extraer y decompilar fuentes de empaquetados Android(apktool), esto incluye recursos(res), manifiesto(AndroidManifest), y fuentes decompiladas.
    • Recompilar dichas fuentes y volverlas a empaquetar.
    • Depurar codigo decompilado backsmali.
    Luego de seguir la instalacion del APKTool procede a ejecutar el comando para extraer el APK.

    $apktool d cracme2hpys.apk out


    *out es el directorio donde se descomprime el apk.

    Husmeando el directorio extraido

    Lo primero que pense es bypasear cambiando la clase en el AndroidManifest.xml que es la que comienza la aplicacion, pero no tuve exito.

    Asi que tuve que husmear el codigo decompilado. El AndroidManifest.xml siempre te da la pista de donde comenzar en general procuro que sea la Actividad inicial, por que es donde probablemente se de la invocación del ALVL.





    Asi que puedes revisar en la carpeta com/hpys/crackmes/LicenseCheck.smali. Veras mucho codigo, si tienes alguna experiencia con lenguaje ensamblador  no te parecera tan raro, sino estudia un poco y veras que sencillo que es. 

    Busca en el onCreate de LicenseCheck.smali el codigo donde revisa la licencia se realiza una invocacion a un metodo doCheck().

        invoke-direct {v1, p0, v2, v3}, Lcom/android/vending/licensing/LicenseChecker;->(Landroid/content/Context;Lcom/android/vending/licensing/Policy;Ljava/lang/String;)V
    
        .line 120
    
        iput-object v1, p0, Lcom/hpys/crackmes/LicenseCheck;->mChecker:Lcom/android/vending/licensing/LicenseChecker;
    
        .line 123
    
        invoke-direct {p0}, Lcom/hpys/crackmes/LicenseCheck;->doCheck()V
    
        .line 125
    
        return-void
    


    Si miras bien en la linea 123 hay hay un doCheck este llama a un metodo en la misma clase LicenseCheck pero que hace realmente este metodo veamos:

    .method private doCheck()V
    
        .locals 2
    
    
    
        .prologue
    
        .line 106
    
        iget-object v0, p0, Lcom/hpys/crackmes/LicenseCheck;->mChecker:Lcom/android/vending/licensing/LicenseChecker;
    
    
    
        iget-object v1, p0, Lcom/hpys/crackmes/LicenseCheck;->mLicenseCheckerCallback:Lcom/android/vending/licensing/LicenseCheckerCallback;
    
    
    
        invoke-virtual {v0, v1}, Lcom/android/vending/licensing/LicenseChecker;->checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V
    
    
    
        .line 107
    
        return-void
    
    .end method
    
    
    Ahora es claro que el metodo doCheck hace la revision, y llama a la clase LicenseChecker y aparentemente le pasa un callback LicenseCheckerCallback probablemente para informar que el licensamiento se realizo de forma correcta. Entonces el paso mas logico ahora sera ir a explorar la clase

    com/android/vending/licensing/LicenseChecker


    Explorando del LicenseChecker



    Antes de empezar a leer todo el LicenseChecker y sus derivados, mejor ve directamente a la invocacion del metodo checkAccess que es el que invoca la clase LicenseCheck recuerdas?.

        invoke-virtual {v0, v1}, Lcom/android/vending/licensing/LicenseChecker;->checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V

    Probablemente este metodo nos proporcione mejores pista que cualquier otro por que es donde se lleva acabo la revision de la licencia.

    El metodo checkAccess, es bastante grande así que procurare resumir las partes relevantes, por ejemplo:

    # virtual methods
    
    .method public declared-synchronized checkAccess(Lcom/android/vending/licensing/LicenseCheckerCallback;)V
    
        .locals 9
    
        .parameter "callback"
    
        .prologue
    
        .line 133
    
        monitor-enter p0
    
        :try_start_0
    
        iget-object v1, p0, Lcom/android/vending/licensing/LicenseChecker;->mPolicy:Lcom/android/vending/licensing/Policy;
    
        invoke-interface {v1}, Lcom/android/vending/licensing/Policy;->allowAccess()Z
    
        move-result v1
    
        if-eqz v1, :cond_0
    
        .line 134
    
        const-string v1, "LicenseChecker"

        if-eqz v1, :cond_0 esta condicion es muy importante por que en caso de cumplirse te envia a cond_0 y mas abajo indica que es la instanciacion del validador de licencias. Si nos saltamos esta parte tendremos el ejercicio terminado!!. Es bien facil de hacer esta condicion tiene una operacion antagonica la cual es: if-nez vx,target  asi que al cambiar las operaciones deberia funcionar.


    Pero no funciona.... ¬¬

    Si, si, cambiamos esta linea y ejecutamos el paso de recompilación de codigo y reempaquetamiento (lo explicare luego), el reto nos regala un obstaculo adicional,  al pasar la licencia el MyAndroidAppActivity no parece invocar al metodo onCreate, y te genera el siguiente error en logcat:



    ¿Así que pasa? ¿por que no funciona?, Bueno la respuesta del por que no funciona es clara la clase MyAndroidAppActivity no tiene la invocación al metodo onCreate hara falta agregarselo con backsmali.

    .class public Lcom/hpys/crackmes/MyAndroidAppActivity;
    
    .super Lcom/hpys/crackmes/LicenseCheck;
    
    .source "MyAndroidAppActivity.java"
    
    # direct methods
    
    .method public constructor ()V
    
        .locals 0
    
        .prologue
    
        .line 6
    
        invoke-direct {p0}, Lcom/hpys/crackmes/LicenseCheck;->()V
    
        return-void
    
    .end method
    
    # virtual methods
    
    .method public onCreate(Landroid/os/Bundle;)V
    
        .locals 0
    
        .parameter "savedInstanceState"
    
        .prologue
    
        .line 11
    
        invoke-super {p0, p1}, Lcom/hpys/crackmes/LicenseCheck;->onCreate(Landroid/os/Bundle;)V
    
        .line 15
    
        return-void
    
    .end method


    El codigo anterior demuestra muchas faltas en la clase MyAndroidAppActivity, siendo un codigo pequeño y sencillo es facil reconocerlas todas:
    • El metodo onCreate no llama al super.onCreate.
    • El metodo onCreate tampoco tiene layout asignado deberia tener main.xml con setContentView.
    • La clase MyAndroidAppActivity hereda de LicenseCheck en vez de Activity y tambien en el metodo init se hace la invocacion especial a este metodo.
    Aqui el codigo del MyAndroidAppActivity con las fallas anteriores resueltas:

    .class public Lcom/hpys/crackmes/MyAndroidAppActivity;
    .super Landroid/app/Activity;
    .source "MyAndroidAppActivity.java"
    
    
    # direct methods
    .method public constructor ()V
        .locals 0
    
        .prologue
        .line 6
        invoke-direct {p0}, Landroid/app/Activity;->()V
    
        return-void
    .end method
    
    
    # virtual methods
    .method public onCreate(Landroid/os/Bundle;)V
        .locals 1
        .parameter "savedInstanceState"
    
        .prologue
        .line 15
        invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    
        .line 17
        const/high16 v0, 0x7f03
        invoke-virtual {p0, v0}, Lcom/hpys/crackmes/MyAndroidAppActivity;->setContentView(I)V
    
        .line 20
        return-void
    .end method


    Podemos realizar los siguientes apuntes, como la invocacion del metodo onCreate() y de setContentView con la variable v0, en este tienes que tener sumo cuidado en declarar locals 1 que es el numero de variables que utilizaras.

    ¿Ya terminamos?, algo así lo unico que falta es recompilarlo y empaquetarlo para regresarlo a un APK.

    De regreso a un APK


    A como mencione inicialmente apktool tambien te permite recompilar la aplicación y regresarla a un APK, pero vas a necesitara un poco mas de eso para colocarla devuelta en el telefono. Para recompilar la aplicacion ejecuta el comando:

    $ apktool b out crackemecracked.apk
    
    
    Tambien necesitas firmarlo, para ello necesitas de un keystore, puedes crearlo facilmente con keytool

    $ keytool -genkey -v -keystore my-release-key.keystore


    Ahora ya tienes tu keystore para firmar tu aplicacion


    jarsigner -verbose -keystore keystore.keystore crackemecracked.apk crackmecracked


    Si deseas saber mas de como firmar aplicaciones android desde consola no te olvides pasar por la documentación oficial.


    Ahora si tenemos la aplicacion firmada, es muy sencillo desintalarla y volverla instalar con el adb.

    $ adb uninstall com.hpys.crackmes 
    $ adb install crackemecracked-za.apk
    
     

    Si todo esta bien, la imagen que deberia aparecer es la siguiente:




    Y LISTO!! 



    ¿Algunos Tips adicionales ?

    En lo particular nunca habia realizado esto, y la informacion de como modificar codigo backsmali no es muy amplia, pero es posible y no es tan dificil.

    - Te recomiendo que veas algo de codigo Assembler por que es similar al backsmali basicamente son operadores y cambios registros.

    - Cuando estaba perdido con alguna operación acudia a Dalvik OpCode el cual fue como un diccionario para mí.

    - Tambien cree clases sencillas, como el hola mundo o una imagen para ver como se decompilaba y como se veia.

    - No hay necesidad de revisar todas las clases como LicenseChecker$ResultListener$1 por que se refiere a clases internas (anonimas o declaradas) en el archivo, así que obviemos eso por un momento y dediquemonos al metodo doCheckAccess en la clase LinceseChecker.

    - Para la parte de la recompilación y empaquetamiento me hice un shellscript por si quieres utilizarlo.

    - Te recomiendo dos excelentes presentaciones de I/O.

    Google I/O 2008 - Dalvik Virtual Machine Internals



     Google I/O 2010 - A JIT Compiler for Android's Dalvik VM



    1

    Ver comentarios

Cargando