SlideShare une entreprise Scribd logo
1  sur  40
HACKING APKS FOR FUN
AND FOR PROFIT
(MOSTLY FOR FUN)


    DAVID TEITELBAUM

    @davtbaum
    DECEMBER 2012
OBJECTIVES
Expect to learn:
 Android app disassembly
 Fundamentals of code injection
 Smali/Baksmali and reading Dalvik byte code
 Best practices in hardening your apps
2   © 2012 Apkudo Inc. Confidential www.apkudo.com
ROADMAP
 PART I - CLASS                                       PART II – DEMO/HACK
Approach to hacking                                   Scramble With Friends deep dive
Tools – apktool, baksmali, smali                      App disassembly and analysis
The APK                                               Code injection with ViewServer
All things byte code                                  Resource transmission
                                                      Recap
 3   © 2012 Apkudo Inc. Confidential www.apkudo.com
PART I - CLASS




4   © 2012 Apkudo Inc. Confidential www.apkudo.com
APK HACKING
         Approach
1.       Unzip APK and disassemble classes.dex (baksmali)
2.       Static analysis – what is the application doing?
3.       Inject byte code into the application to modify execution
4.       Reassemble classes.dex (smali) and rezip APK

                                                     Static analysis

                                  Disassemble                          Reassemble
                                  (baksmali)                           (smali)
                                                      .smali
                                                     Code injection
     5   © 2012 Apkudo Inc. Confidential www.apkudo.com
CODE INJECTION
    Best Practices:
   You don’t need to be a Dalvik byte code pro!

   Write patches in Java, compile, then use the
    Smali/Baksmali tools to disassemble into Dalvik byte code

   Stick to public static methods in Dalvik byte code which
    have no register dependencies.

   Let the compiler do the work – the demo hack is achieved
    by inserting only two lines of manual Dalvik byte code!



    6   © 2012 Apkudo Inc. Confidential www.apkudo.com
TOOLS
You’ll need…
   Access to a terminal environment (preferably Linux or Mac
    osx)

   Android SDK

   keytool and jarsigner

   Smali/Baksmali - http://code.google.com/p/smali/

   Apktool - http://code.google.com/p/android-apktool/

   Editor of choice (emacs!)

7   © 2012 Apkudo Inc. Confidential www.apkudo.com
SMALI/BAKSMALI
Dalvik Assembler/
Disassembler
   Baksmali disassembles Dalvik executable (.dex) into
    readable Dalvik byte code (.smali)

   Smali re-assembles .smali files back into .dex Dalvik
    executable

   Gives developers the ability to modify execution of an APK
    without having access to source code




8   © 2012 Apkudo Inc. Confidential www.apkudo.com
APKTOOL
All in one reverser
   Wraps smali/baksmali and Android asset packaging tool
    (aapt)

   Decodes resources and decompresses xml

   Great for manifest introspection

   Buggy :/




9   © 2012 Apkudo Inc. Confidential www.apkudo.com
THE APK
A container for your app
    Zipped file formatted based on JAR
                                                      META-INF/
                                                      AndroidManifest.xml
                                                      classes.dex
                                                      lib/
                                                      res/
                                                      resources.arsc




10   © 2012 Apkudo Inc. Confidential www.apkudo.com
EXAMPLES
baksmali
$ unzip foobar.apk –d foobar

$ cd ./foobar

$ ls
AndroidManifest.xml META-INF                          classes.dex   res
resources.arsc lib

$ baksmali –a 10 –d ~/boot_class_path classes.dex

                      API level               boot class path        dex file




11   © 2012 Apkudo Inc. Confidential www.apkudo.com
EXAMPLES
smali
$ ls
AndroidManifest.xml META-INF                           classes.dex   res
resources.arsc lib
out

$ smali –a 10 ./out –o classes.dex

               API level                          output dex file


$ zip –r ~/hacked.apk ./*
        recursive




12   © 2012 Apkudo Inc. Confidential www.apkudo.com
EXAMPLES
 apktool
$ apktool d foobar.apk foobar
                 decode                       out directory
$ cd ./foobar

$ ls
AndroidManifest.xml apktool.yml                       assets   res   smali

$ cd ../

$ apktool b ./foobar

                   build

13   © 2012 Apkudo Inc. Confidential www.apkudo.com
EXAMPLES
 keytool and jarsigner
$ keytool -genkeypair -v -alias default –keystore
~/.keystore –storepass password


$ jarsigner –keystore ~/.keystore ./foobar.apk
default
     alias




14   © 2012 Apkudo Inc. Confidential www.apkudo.com
SMALI FILES
  class representation in byte code
.class public Lcom/apkudo/util/Serializer;
.super Ljava/lang/Object;                                           Class information
.source "Serializer.java”

# static fields
.field public static final TAG:Ljava/lang/String; = "ApkudoUtils”   Static fields
# direct methods
.method public constructor <init>()V
   .registers 1

  .prologue
  .line 5                                                           Methods
  invoke-direct {p0}, Ljava/lang/Object;-><init>()V                 Direct
                                                                    Virtual
   return-void
.end method




 15   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
 types                                                .method private doSomething()V

V void
Z boolean
B byte
S short
C char
F float
I int
J long
                                   64 bit – special instructions
D double
[ array

16   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
      classes                                    Lcom/apkudo/util/Serializer;
 •        full name space slash separated
 •        prefixed with L
 •        suffixed with ;
const-string v0, "ApkudoUtils"

new-instance v1, Ljava/lang/StringBuilder;

invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V

const-string v2, "docId: ["

invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;-
>append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v1



     17   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    methods                                .method private doSomething()V

   Method definitions
      .method <keyword> <name>(<param>)<return type>

   Method invocations
      invoke-static – any method that is static
      invoke-virtual – any method that isn’t private, static, or
       final
      invoke-direct – any non-static direct method
      invoke-super – any superclass's virtual method
      Invoke-interface – invoke an interface method



18   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    methods                                   .method private doSomething()V


               keyword                       method name   parameters/return

.method private delayedAnimationFrame(J)Z
  .registers 8
  .parameter "currentTime”

# Static invocation
invoke-static {p2}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z

# Virtual invocation
invoke-virtual {v0, v1}, Lcom/google/android/finsky/FinskyApp;-
>drainAllRequests(I)V




   19   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    Registers                                         .locals 16
                                                      .registers 18
 All registers are 32 bits
 Declaration
     .registers – total number of registers
     .locals – total minus method parameter registers
 Naming scheme
     P registers – parameter registers
          implicit p0 = ‘this’ instance
     V registers – local registers
 P registers are always at the end of the register list




20   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    Register Example
.method public onCreate()V
  .registers 7                                           v0         First local register
                                                         v1         Second local register
    ...
                                                         v2         …
                                                         v3         …
                                                         v4         …
                                                         v5         …
                                                         v6 p0 First param – ‘this’

                                                         p0 == v6



   21   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
      Register Example 2
.method public doIt(Ljava/lang/String;II)V
  .registers 7
                                                           v0         First local register
                                                           v1         Second local register
                                                           v2         …
                                                           v3 p0 ‘this’
                                                           v4 p1 String
                                                           v5 p2 int
                                                           v6 p3 int

                                                           p3 == v6
                                                           p2 == v5
                                                           p1 == v4
                                                           p0 == v3

     22   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
      Register Example 3
.method public doIt(JI)V
  .registers 7

     # hint, j == long
                                                                    v0      First local register
                                                                    v1    Second local register
                                                                    v2     Third local register
 v3 - is it…                            v4 - is it…
 A) Fourth local register?              A) Fourth local register?   v3 p0 ‘this’ instance
 B) This instance?                      B) This instance?           v4 p1 long
 C) Long?                               C) Long?
                                                                    v5 p2 long
 D) Int?                                D) Int?
                                                                    v6 p3 int
 v5 - is it…                            v6 - is it…
 A) Fourth local register?              A) Fourth local register?
 B) This instance?                      B) This instance?
 C) Long?                               C) Long?
 D) Int?                                D) Int?

     23   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    jumping
                                                      .method public doIt(JI)V
   jumps                                               .registers 7

       goto <offset>                                      ...

                                                           goto :goto_31

                                                           ...

                                                           :goto_31
                                                           return-void




24   © 2012 Apkudo Inc. Confidential www.apkudo.com
SYNTAX
    conditionals
                                                      method public foobar()V
 Conditionals                                         .registers 2

    If-eq                                              const/4 v0, 0x0
    If-ne
                                                        if-eqz v0, :cond_6
    If-le
    If-lt                                              return-void
    If-ge
                                                        :cond_6
    If-gt
 Add z for zero                                          # Do something

                                                      .end method




25   © 2012 Apkudo Inc. Confidential www.apkudo.com
PUTTING IT ALL
TOGETHER
 Example - Java
package com.google.android.finsky;

import android.app.Application;
import android.accounts.Account;

public class FinskyApp() extends Application {

     Account mCurrentAccount;

     ...

     public String getCurrentAccountName() {
       if (mCurrentAccount != null) {
             return mCurrentAccount.name;
       } else {
             return null;
       }
     }
}


26   © 2012 Apkudo Inc. Confidential www.apkudo.com
PUTTING IT ALL
           TOGETHER
             Same example - smali
.method public getCurrentAccountName()Ljava/lang/String;
  .registers 2
                                                                                v0            First local register
  .prologue
                                                                                v1      p0 ‘this’ instance
  .line 617
  iget-object v0, p0, Lcom/google/android/finsky/FinskyApp;->mCurrentAccount:Landroid/accounts/Account;

  if-nez v0, :cond_6
                                                                                Getting this field!            of type …
  const/4 v0, 0x0
                                                 into this reg
  :goto_5
  return-object v0

  :cond_6
  iget-object v0, v0, Landroid/accounts/Account;->name:Ljava/lang/String;

   goto :goto_5
.end method




           27     © 2012 Apkudo Inc. Confidential www.apkudo.com
ONE FINAL
    STEP
     Obfuscation!
•    Renames classes, class members and and method

•    Preserves OS entry points and java namespace classes

•    Slows down the static analysis process

•    Not a silver bullet, but an easy first line of defense

iget-object v0, p0, Lcom/a/a/g;->a:Lcom/a/a/f;

invoke-static {v0}, Lcom/a/a/f;->a(Lcom/a/a/f;)Landroid/webkit/WebView;




    28   © 2012 Apkudo Inc. Confidential www.apkudo.com
PART II - DEMO




29   © 2012 Apkudo Inc. Confidential www.apkudo.com
30   © 2012 Apkudo Inc. Confidential www.apkudo.com
HACKING
      SCRAMBLE
      Approach
1.    Unzip APK and disassemble classes.dex (baksmali)
2.    Isolate target resources (e.g., Scramble With Friends words list)
3.    Patch APK to receive resource, serialize, and transmit to host
4.    Reassemble classes.dex (smali) and rezip APK
                                                  Static analysis/
                                                  Code Injection

                                 Disassemble                         Reassemble
                                 (baksmali)                          (smali)
                                                    .smali


     31   © 2012 Apkudo Inc. Confidential www.apkudo.com
RESOURCE SERIALIZATION
AND TRANSMISSION
     ROMAIN GUY’S VIEWSERVER
          onCreate()…
          addWindow()                                 localhost:4939
                                ViewServer




                                  Android
                                    OS


32   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 1
    DECOMPRESS AND
    DISASSEMBLE
   Extract classes.dex and remove keys
       unzip scramble.apk
       rm –r ./META-INF


   Disassemble:
       baksmali -a 10 –d <framework_path> ./classes.dex
       -a = api-level
       -d = bootclasspath dir
            out/target/product/generic/system/framework




33   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 2
    ANDROID FORENSICS
   apktool dump and inspect AndroidManifest.xml
    for activities

   Find the words list…how?
       Beat obfuscation!
           Search for class types and log messages
           Find the intersection of the two!
       Insert your own log statements

invoke-virtual {v2}, Ljava/util/List;->toString()Ljava/lang/String;
move-result-object v2
invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I




34   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 3
    INJECT VIEWSERVER INTO APP
    Resource located! Now we need to send it…

    Apply patch to ViewServer that stores list
           public static void setScrambleWordList(List list);

    Build patched ViewServer, extract .smali files

    Copy smali files into our application
      Easy enough, right?




35   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 4
    PATCH APP TO USE VIEWSERVER
    API
    Start the ViewServer in the onCreate() method of
     MainActivity.smali
      ViewServer.get()
            invoke-static {}, Lcom/android/debug/hv/ViewServer;-
             >get()Lcom/android/debug/hv/ViewServer;


    Pass the list to ViewServer in fu.smali
      ViewServer.setScrambleWordList(list)
             invoke-static {v2}, Lcom/android/debug/hv/ViewServer;->setScrambleWordList(Ljava/util/List;)V
      




36   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 5
    REBUILD APK
   Re-assemble
       smali –a 10 ./out –o classes.dex
   Re-compress
       zip –z0 –r ../scramble.apk ./*
   Sign APK
       jarsigner -verbose -keystore my-release-
        key.keystore ./scramble.apk alias_name




37   © 2012 Apkudo Inc. Confidential www.apkudo.com
STEP 6
INSTALL AND COMMUNICATE
WITH APP
 Install
     adb install –r ../scramble.apk
 Forward port
     adb forward tcp:4939 tcp:4939
 Communicate
     nc –l 127.0.0.1 (listen)




38   © 2012 Apkudo Inc. Confidential www.apkudo.com
APE
    INTELLIGENT ANDROID
    INSTRUMENTATION
 Fully aware of applications content
 Invokes actions and makes decisions based off
  of what it sees
 Optimized and extended Romain’s ViewServer
     Transmit view data after each invoked action
     Introspect on OpenGL
 Uses word list to obtain matrix positions and
  OpenGL introspection to find buttons on screen




39   © 2012 Apkudo Inc. Confidential www.apkudo.com
Thank you.
@davtbaum DAVID@   .COM

Contenu connexe

Tendances

Functional Reactive Programming in the Netflix API
Functional Reactive Programming in the Netflix APIFunctional Reactive Programming in the Netflix API
Functional Reactive Programming in the Netflix APIC4Media
 
Mobile development in 2020
Mobile development in 2020 Mobile development in 2020
Mobile development in 2020 Bogusz Jelinski
 
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...viaForensics
 
How to reverse engineer Android applications
How to reverse engineer Android applicationsHow to reverse engineer Android applications
How to reverse engineer Android applicationshubx
 
CORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialCORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialRemedy IT
 
Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Remedy IT
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014biicode
 
Reverse engineering android apps
Reverse engineering android appsReverse engineering android apps
Reverse engineering android appsPranay Airan
 
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan Herrmann
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan HerrmannSupporting Java™ 9 in Eclipse - A critical perspective - Stephan Herrmann
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan HerrmannEclipse Day India
 
ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?Tetsuyuki Kobayashi
 
Understanding and extending p2 for fun and profit
Understanding and extending p2 for fun and profitUnderstanding and extending p2 for fun and profit
Understanding and extending p2 for fun and profitPascal Rapicault
 
Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]David Buck
 

Tendances (17)

Functional Reactive Programming in the Netflix API
Functional Reactive Programming in the Netflix APIFunctional Reactive Programming in the Netflix API
Functional Reactive Programming in the Netflix API
 
Mobile development in 2020
Mobile development in 2020 Mobile development in 2020
Mobile development in 2020
 
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
 
How to reverse engineer Android applications
How to reverse engineer Android applicationsHow to reverse engineer Android applications
How to reverse engineer Android applications
 
How to Customize Android Framework&System
How to Customize Android Framework&SystemHow to Customize Android Framework&System
How to Customize Android Framework&System
 
CORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialCORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorial
 
Practice of Android Reverse Engineering
Practice of Android Reverse EngineeringPractice of Android Reverse Engineering
Practice of Android Reverse Engineering
 
Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11
 
LabDocumentation
LabDocumentationLabDocumentation
LabDocumentation
 
Discovering the p2 API
Discovering the p2 APIDiscovering the p2 API
Discovering the p2 API
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Reverse engineering android apps
Reverse engineering android appsReverse engineering android apps
Reverse engineering android apps
 
How to Use OpenGL/ES on Native Activity
How to Use OpenGL/ES on Native ActivityHow to Use OpenGL/ES on Native Activity
How to Use OpenGL/ES on Native Activity
 
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan Herrmann
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan HerrmannSupporting Java™ 9 in Eclipse - A critical perspective - Stephan Herrmann
Supporting Java™ 9 in Eclipse - A critical perspective - Stephan Herrmann
 
ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?ADB(Android Debug Bridge): How it works?
ADB(Android Debug Bridge): How it works?
 
Understanding and extending p2 for fun and profit
Understanding and extending p2 for fun and profitUnderstanding and extending p2 for fun and profit
Understanding and extending p2 for fun and profit
 
Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]Java Bytecode Crash Course [Code One 2019]
Java Bytecode Crash Course [Code One 2019]
 

En vedette

Hacking for fun and for profit
Hacking for fun and for profitHacking for fun and for profit
Hacking for fun and for profitdavtbaum
 
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...ZongXian Shen
 
Top 10 mobile security risks - Khổng Văn Cường
Top 10 mobile security risks - Khổng Văn CườngTop 10 mobile security risks - Khổng Văn Cường
Top 10 mobile security risks - Khổng Văn CườngVõ Thái Lâm
 
Reverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android appsReverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android appsGaurav Lochan
 

En vedette (6)

Hacking for fun and for profit
Hacking for fun and for profitHacking for fun and for profit
Hacking for fun and for profit
 
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
 
Top 10 mobile security risks - Khổng Văn Cường
Top 10 mobile security risks - Khổng Văn CườngTop 10 mobile security risks - Khổng Văn Cường
Top 10 mobile security risks - Khổng Văn Cường
 
Reverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android appsReverse engineering and instrumentation of android apps
Reverse engineering and instrumentation of android apps
 
Understanding the Dalvik Virtual Machine
Understanding the Dalvik Virtual MachineUnderstanding the Dalvik Virtual Machine
Understanding the Dalvik Virtual Machine
 
Ajax Security
Ajax SecurityAjax Security
Ajax Security
 

Similaire à Hacking for Fun and Profit

Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1Apkudo
 
Android Auto instrumentation
Android Auto instrumentationAndroid Auto instrumentation
Android Auto instrumentationPrzemek Jakubczyk
 
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidReverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidJUG Lausanne
 
LinkedIn - Disassembling Dalvik Bytecode
LinkedIn - Disassembling Dalvik BytecodeLinkedIn - Disassembling Dalvik Bytecode
LinkedIn - Disassembling Dalvik BytecodeAlain Leon
 
2020 03-26 - meet up - zparkio
2020 03-26 - meet up - zparkio2020 03-26 - meet up - zparkio
2020 03-26 - meet up - zparkioLeo Benkel
 
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)Eric D. Schabell
 
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensLiferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensDenis Signoretto
 
Serverless in Swift like a Breeze
Serverless in Swift like a BreezeServerless in Swift like a Breeze
Serverless in Swift like a BreezeAndrea Scuderi
 
Optimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for DockerOptimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for DockerGraham Charters
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusEmily Jiang
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with PythonAndrii Soldatenko
 
Serverless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMServerless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMBoaz Ziniman
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Hacking the Codename One Source Code - Part IV - Transcript.pdf
Hacking the Codename One Source Code - Part IV - Transcript.pdfHacking the Codename One Source Code - Part IV - Transcript.pdf
Hacking the Codename One Source Code - Part IV - Transcript.pdfShaiAlmog1
 
Getting started with the NDK
Getting started with the NDKGetting started with the NDK
Getting started with the NDKKirill Kounik
 

Similaire à Hacking for Fun and Profit (20)

Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
 
Android Auto instrumentation
Android Auto instrumentationAndroid Auto instrumentation
Android Auto instrumentation
 
How to Build & Use OpenCL on OpenCV & Android NDK
How to Build & Use OpenCL on OpenCV & Android NDKHow to Build & Use OpenCL on OpenCV & Android NDK
How to Build & Use OpenCL on OpenCV & Android NDK
 
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp AndroidReverse engineering Java et contournement du mécanisme de paiement inapp Android
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
 
LinkedIn - Disassembling Dalvik Bytecode
LinkedIn - Disassembling Dalvik BytecodeLinkedIn - Disassembling Dalvik Bytecode
LinkedIn - Disassembling Dalvik Bytecode
 
2020 03-26 - meet up - zparkio
2020 03-26 - meet up - zparkio2020 03-26 - meet up - zparkio
2020 03-26 - meet up - zparkio
 
Serverless and React
Serverless and ReactServerless and React
Serverless and React
 
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
An OpenShift Primer for Developers to get your Code into the Cloud (PTJUG)
 
Ruby conf2012
Ruby conf2012Ruby conf2012
Ruby conf2012
 
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay ScreensLiferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
Liferay Italy Symposium 2015 Liferay Mobile SDK and Liferay Screens
 
Serverless in Swift like a Breeze
Serverless in Swift like a BreezeServerless in Swift like a Breeze
Serverless in Swift like a Breeze
 
Optimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for DockerOptimizing Spring Boot apps for Docker
Optimizing Spring Boot apps for Docker
 
Apk explorer2
Apk explorer2Apk explorer2
Apk explorer2
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
 
Building Serverless applications with Python
Building Serverless applications with PythonBuilding Serverless applications with Python
Building Serverless applications with Python
 
Serverless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLMServerless Beyond Functions - CTO Club Made in JLM
Serverless Beyond Functions - CTO Club Made in JLM
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Sst hackathon express
Sst hackathon expressSst hackathon express
Sst hackathon express
 
Hacking the Codename One Source Code - Part IV - Transcript.pdf
Hacking the Codename One Source Code - Part IV - Transcript.pdfHacking the Codename One Source Code - Part IV - Transcript.pdf
Hacking the Codename One Source Code - Part IV - Transcript.pdf
 
Getting started with the NDK
Getting started with the NDKGetting started with the NDK
Getting started with the NDK
 

Hacking for Fun and Profit

  • 1. HACKING APKS FOR FUN AND FOR PROFIT (MOSTLY FOR FUN) DAVID TEITELBAUM @davtbaum DECEMBER 2012
  • 2. OBJECTIVES Expect to learn: Android app disassembly Fundamentals of code injection Smali/Baksmali and reading Dalvik byte code Best practices in hardening your apps 2 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 3. ROADMAP PART I - CLASS PART II – DEMO/HACK Approach to hacking Scramble With Friends deep dive Tools – apktool, baksmali, smali App disassembly and analysis The APK Code injection with ViewServer All things byte code Resource transmission Recap 3 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 4. PART I - CLASS 4 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 5. APK HACKING Approach 1. Unzip APK and disassemble classes.dex (baksmali) 2. Static analysis – what is the application doing? 3. Inject byte code into the application to modify execution 4. Reassemble classes.dex (smali) and rezip APK Static analysis Disassemble Reassemble (baksmali) (smali) .smali Code injection 5 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 6. CODE INJECTION Best Practices:  You don’t need to be a Dalvik byte code pro!  Write patches in Java, compile, then use the Smali/Baksmali tools to disassemble into Dalvik byte code  Stick to public static methods in Dalvik byte code which have no register dependencies.  Let the compiler do the work – the demo hack is achieved by inserting only two lines of manual Dalvik byte code! 6 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 7. TOOLS You’ll need…  Access to a terminal environment (preferably Linux or Mac osx)  Android SDK  keytool and jarsigner  Smali/Baksmali - http://code.google.com/p/smali/  Apktool - http://code.google.com/p/android-apktool/  Editor of choice (emacs!) 7 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 8. SMALI/BAKSMALI Dalvik Assembler/ Disassembler  Baksmali disassembles Dalvik executable (.dex) into readable Dalvik byte code (.smali)  Smali re-assembles .smali files back into .dex Dalvik executable  Gives developers the ability to modify execution of an APK without having access to source code 8 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 9. APKTOOL All in one reverser  Wraps smali/baksmali and Android asset packaging tool (aapt)  Decodes resources and decompresses xml  Great for manifest introspection  Buggy :/ 9 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 10. THE APK A container for your app  Zipped file formatted based on JAR META-INF/ AndroidManifest.xml classes.dex lib/ res/ resources.arsc 10 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 11. EXAMPLES baksmali $ unzip foobar.apk –d foobar $ cd ./foobar $ ls AndroidManifest.xml META-INF classes.dex res resources.arsc lib $ baksmali –a 10 –d ~/boot_class_path classes.dex API level boot class path dex file 11 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 12. EXAMPLES smali $ ls AndroidManifest.xml META-INF classes.dex res resources.arsc lib out $ smali –a 10 ./out –o classes.dex API level output dex file $ zip –r ~/hacked.apk ./* recursive 12 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 13. EXAMPLES apktool $ apktool d foobar.apk foobar decode out directory $ cd ./foobar $ ls AndroidManifest.xml apktool.yml assets res smali $ cd ../ $ apktool b ./foobar build 13 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 14. EXAMPLES keytool and jarsigner $ keytool -genkeypair -v -alias default –keystore ~/.keystore –storepass password $ jarsigner –keystore ~/.keystore ./foobar.apk default alias 14 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 15. SMALI FILES class representation in byte code .class public Lcom/apkudo/util/Serializer; .super Ljava/lang/Object; Class information .source "Serializer.java” # static fields .field public static final TAG:Ljava/lang/String; = "ApkudoUtils” Static fields # direct methods .method public constructor <init>()V .registers 1 .prologue .line 5 Methods invoke-direct {p0}, Ljava/lang/Object;-><init>()V Direct Virtual return-void .end method 15 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 16. SYNTAX types .method private doSomething()V V void Z boolean B byte S short C char F float I int J long 64 bit – special instructions D double [ array 16 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 17. SYNTAX classes Lcom/apkudo/util/Serializer; • full name space slash separated • prefixed with L • suffixed with ; const-string v0, "ApkudoUtils" new-instance v1, Ljava/lang/StringBuilder; invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V const-string v2, "docId: [" invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;- >append(Ljava/lang/String;)Ljava/lang/StringBuilder; move-result-object v1 17 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 18. SYNTAX methods .method private doSomething()V  Method definitions  .method <keyword> <name>(<param>)<return type>  Method invocations  invoke-static – any method that is static  invoke-virtual – any method that isn’t private, static, or final  invoke-direct – any non-static direct method  invoke-super – any superclass's virtual method  Invoke-interface – invoke an interface method 18 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 19. SYNTAX methods .method private doSomething()V keyword method name parameters/return .method private delayedAnimationFrame(J)Z .registers 8 .parameter "currentTime” # Static invocation invoke-static {p2}, Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z # Virtual invocation invoke-virtual {v0, v1}, Lcom/google/android/finsky/FinskyApp;- >drainAllRequests(I)V 19 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 20. SYNTAX Registers .locals 16 .registers 18  All registers are 32 bits  Declaration  .registers – total number of registers  .locals – total minus method parameter registers  Naming scheme  P registers – parameter registers  implicit p0 = ‘this’ instance  V registers – local registers  P registers are always at the end of the register list 20 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 21. SYNTAX Register Example .method public onCreate()V .registers 7 v0 First local register v1 Second local register ... v2 … v3 … v4 … v5 … v6 p0 First param – ‘this’ p0 == v6 21 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 22. SYNTAX Register Example 2 .method public doIt(Ljava/lang/String;II)V .registers 7 v0 First local register v1 Second local register v2 … v3 p0 ‘this’ v4 p1 String v5 p2 int v6 p3 int p3 == v6 p2 == v5 p1 == v4 p0 == v3 22 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 23. SYNTAX Register Example 3 .method public doIt(JI)V .registers 7 # hint, j == long v0 First local register v1 Second local register v2 Third local register v3 - is it… v4 - is it… A) Fourth local register? A) Fourth local register? v3 p0 ‘this’ instance B) This instance? B) This instance? v4 p1 long C) Long? C) Long? v5 p2 long D) Int? D) Int? v6 p3 int v5 - is it… v6 - is it… A) Fourth local register? A) Fourth local register? B) This instance? B) This instance? C) Long? C) Long? D) Int? D) Int? 23 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 24. SYNTAX jumping .method public doIt(JI)V  jumps .registers 7  goto <offset> ... goto :goto_31 ... :goto_31 return-void 24 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 25. SYNTAX conditionals method public foobar()V  Conditionals .registers 2  If-eq const/4 v0, 0x0  If-ne if-eqz v0, :cond_6  If-le  If-lt return-void  If-ge :cond_6  If-gt  Add z for zero # Do something .end method 25 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 26. PUTTING IT ALL TOGETHER Example - Java package com.google.android.finsky; import android.app.Application; import android.accounts.Account; public class FinskyApp() extends Application { Account mCurrentAccount; ... public String getCurrentAccountName() { if (mCurrentAccount != null) { return mCurrentAccount.name; } else { return null; } } } 26 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 27. PUTTING IT ALL TOGETHER Same example - smali .method public getCurrentAccountName()Ljava/lang/String; .registers 2 v0 First local register .prologue v1 p0 ‘this’ instance .line 617 iget-object v0, p0, Lcom/google/android/finsky/FinskyApp;->mCurrentAccount:Landroid/accounts/Account; if-nez v0, :cond_6 Getting this field! of type … const/4 v0, 0x0 into this reg :goto_5 return-object v0 :cond_6 iget-object v0, v0, Landroid/accounts/Account;->name:Ljava/lang/String; goto :goto_5 .end method 27 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 28. ONE FINAL STEP Obfuscation! • Renames classes, class members and and method • Preserves OS entry points and java namespace classes • Slows down the static analysis process • Not a silver bullet, but an easy first line of defense iget-object v0, p0, Lcom/a/a/g;->a:Lcom/a/a/f; invoke-static {v0}, Lcom/a/a/f;->a(Lcom/a/a/f;)Landroid/webkit/WebView; 28 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 29. PART II - DEMO 29 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 30. 30 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 31. HACKING SCRAMBLE Approach 1. Unzip APK and disassemble classes.dex (baksmali) 2. Isolate target resources (e.g., Scramble With Friends words list) 3. Patch APK to receive resource, serialize, and transmit to host 4. Reassemble classes.dex (smali) and rezip APK Static analysis/ Code Injection Disassemble Reassemble (baksmali) (smali) .smali 31 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 32. RESOURCE SERIALIZATION AND TRANSMISSION ROMAIN GUY’S VIEWSERVER onCreate()… addWindow() localhost:4939 ViewServer Android OS 32 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 33. STEP 1 DECOMPRESS AND DISASSEMBLE  Extract classes.dex and remove keys  unzip scramble.apk  rm –r ./META-INF  Disassemble:  baksmali -a 10 –d <framework_path> ./classes.dex  -a = api-level  -d = bootclasspath dir  out/target/product/generic/system/framework 33 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 34. STEP 2 ANDROID FORENSICS  apktool dump and inspect AndroidManifest.xml for activities  Find the words list…how?  Beat obfuscation!  Search for class types and log messages  Find the intersection of the two!  Insert your own log statements invoke-virtual {v2}, Ljava/util/List;->toString()Ljava/lang/String; move-result-object v2 invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I 34 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 35. STEP 3 INJECT VIEWSERVER INTO APP  Resource located! Now we need to send it…  Apply patch to ViewServer that stores list  public static void setScrambleWordList(List list);  Build patched ViewServer, extract .smali files  Copy smali files into our application  Easy enough, right? 35 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 36. STEP 4 PATCH APP TO USE VIEWSERVER API  Start the ViewServer in the onCreate() method of MainActivity.smali  ViewServer.get()  invoke-static {}, Lcom/android/debug/hv/ViewServer;- >get()Lcom/android/debug/hv/ViewServer;  Pass the list to ViewServer in fu.smali  ViewServer.setScrambleWordList(list) invoke-static {v2}, Lcom/android/debug/hv/ViewServer;->setScrambleWordList(Ljava/util/List;)V  36 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 37. STEP 5 REBUILD APK  Re-assemble  smali –a 10 ./out –o classes.dex  Re-compress  zip –z0 –r ../scramble.apk ./*  Sign APK  jarsigner -verbose -keystore my-release- key.keystore ./scramble.apk alias_name 37 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 38. STEP 6 INSTALL AND COMMUNICATE WITH APP  Install  adb install –r ../scramble.apk  Forward port  adb forward tcp:4939 tcp:4939  Communicate  nc –l 127.0.0.1 (listen) 38 © 2012 Apkudo Inc. Confidential www.apkudo.com
  • 39. APE INTELLIGENT ANDROID INSTRUMENTATION  Fully aware of applications content  Invokes actions and makes decisions based off of what it sees  Optimized and extended Romain’s ViewServer  Transmit view data after each invoked action  Introspect on OpenGL  Uses word list to obtain matrix positions and OpenGL introspection to find buttons on screen 39 © 2012 Apkudo Inc. Confidential www.apkudo.com

Notes de l'éditeur

  1. META-INF contains keys
  2. META-INF contains keys
  3. META-INF contains keys
  4. META-INF contains keys
  5. META-INF contains keys
  6. META-INF contains keys