SlideShare a Scribd company logo
How to reverse engineer
Android applications
Finding Vulnerabilities through Reverse Engineering
Hasso Plattner Institute, Potsdam
Hubert Hesse, Lukas Pirl,
Christoph Matthies, Conrad Calmez
using a popular word game
as an example
??
Images: “Freepik” on flaticon.com (CC BY 3.0), Google (CC BY 3.0)
1 Get the .apk
23 4
Extract the .apk
5
Decompilation
to Smali
Debugging
6Putting it
together
7 8Automation
Proxy
Decompilation
to Java
Our Example—a word game
● Top 10 word game in 145 countries (as of July 2014)
● More than 10.000.000 installs
● Over 50 million players
● Play online (with friends)
● 14 languages
● Free and premium version
1:58 0 points
S N B I
L U SF
E I T
T E RP
A
1:58 15 points
S N B I
L U SF
E I T
T E RP
A
FLUT +15
● APK (application package file),
archive file, based on JAR format
● Similar to Deb packages (in Ubuntu) or
MSI packages (in Windows)
● Contains program code, resources, assets, certificates, and
manifest file
● Can’t be directly downloaded from App Store
1
Get the .apk
Download using online “APK Downloader”
(http://apps.evozi.com/apk-downloader/)
- or -
Install on device and download using SDK tools
(adb pull <app_path> downloaded.apk)
2
Extract the .apk
● Normal decompression using unzip fails
● Special tool: APKTool
○ Standard is APKTool 1.5.2. (not able to recompress correctly) (https:
//code.google.com/p/android-apktool/downloads/list)
○ APKTool 2.0.0 Beta 9 works
(http://connortumbleson.com/2014/02/apktool-2-0-0-beta-9-released/)
Decrompressing:
apktool d -d game.apk -o outdir
2
Extract the .apk
2
Modifying resources
● Change arbitrary resources
● Repack into .apk file and install
Recrompressing:
apktool b -d outdir -o com.company.game.free_patch.apk
● Recompression works, Android fails with “can’t install”, wrong
certificate
○ APKTool tries to reuse as much as possible, doesn’t
recompute signature
2Manually sign repacked apk:
● Create custom CA
● Java JAR Signing and Verification Tool
(http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html)
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-
release-key.keystore com.company.game.free_patch.apk alias_name
Modifying resources
How to reverse engineer Android applications—using a popular word game as an example
.apk contains compiled code
● Dalvik bytecode interpreted by
the Dalvik Process virtual machine
● Stored in .dex (Dalvik EXecutable) files
APKTool translates this to “smali” (https://code.google.com/p/smali/)
● Abstraction of bytecode, closer to Java
● Dalvik opcodes (http://s.android.com/tech/dalvik/dalvik-bytecode.html)
● Can be edited directly
3Decompilation to Smali
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World!"
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method
3
Smali Hello World
Interactive debugging
● Set debuggable=”true” in AndroidManifest.xml
○ Repack using APKTool
● Need to connect smali sources to binary
● Workaround: pretend we have valid Java code
4
Debugging
<application android:allowBackup="true" android:hardwareAccelerated="true"
android:icon="@drawable/launcher_icon" android:label="@string/app_name"
android:name="com.company.game.core.GameApplication" android:theme="
@style/Theme.GameTheme" android:debuggable="true">
a=0;// .class public abstract La;
a=0;// .super Ljava/lang/Object;
a=0;//
a=0;//
a=0;// # instance fields
a=0;// .field protected final a:Ljava/lang/Object;
a=0;//
a=0;// .field private final b:Landroid/os/Handler;
a=0;//
4
Debugging
Smali code in comments
Placeholder
Java
Two ways to obtain java code
● Convert .dex files to .jar
○ Use standard java bytecode decompilers
● Disassemble .dex directly to .java
5
Decompilation to Java
Using dex files
● Androguard (https://code.google.com/p/androguard/)
○ Maps DEX format into full Python objects
○ Works in memory (My 4GB machine wasn’t enough)
○ Doesn’t immediately dump code into Java files
5
Decompilation to Java
Using jar files
● dex2jar (https://code.google.com/p/dex2jar/)
○ dex2jar, jar2dex, apk-sign
○ Supports recreating .dex from Java
● JD-GUI (http://jd.benow.ca/)
○ Popular jar-decompiler
○ Works 100% with “Hello World” app
5
Decompilation to Java
Combining Java decompilation and Smali
● Java more readable than Smali
● Unfortunately Java decompilation not
100% perfect
○ Invalid Java constructs or only
method signatures
○ Cannot recompile from Java sources
6
Putting it together
private void fixSpecialChars()
{
int i;
char ac[];
int j;
int k;
i = 0;
ac = tiles;
j = ac.length;
k = 0;
_L9:
if(k >= j)
break MISSING_BLOCK_LABEL_161;
ac[k];
JVM INSTR lookupswitch 6: default 80
// 40: 125
// 41: 137
// 47: 149
// 91: 89
// 92: 101
// 93: 113;
goto _L1 _L2 _L3 _L4 _L5 _L6 _L7
_L4:
break MISSING_BLOCK_LABEL_149;
_L1:
break; /* Loop/switch isn't completed */
_L5:
break; /* Loop/switch isn't completed */
_L10:
i++;
k++;
if(true) goto _L9; else goto _L8
_L8:
6When Decompilation fails
an example
Goto not supported in Java
Bare JVM instructions
Combining Java decompilation and Smali
● Approach: Use multiple Java decompilers
○ They tend to fail in different places
6
Putting it together
1. Find interesting parts in Java source
2. Check corresponding smali sources
3. Edit those
protected void roundEnd(boolean paramBoolean)
{
// …
this.resultData.setTotalScore(this.totalScore);
// …
startRoundSummary();
if (!this.isPractice)
{
this.currentRound.setWordsInRound(this.resultData.getMoves().size());
// …
this.currentRound.setPlayer1Moves(GameHelper.encodeMoves(this.resultData.
getMoves()));
this.currentRound.setPlayer1Score(this.totalScore);
// …
6
Manipulating the score
Opportunities for manipulation
● Server validation disallows this
a=0;// sget-boolean v0, Lcom/company/game/core/statics/Statics;->DEBUGGING:Z
a=0;//
a=0;// #v0=(Boolean);
-a=0;// if-eqz v0, :cond_0
+a=0;// #if-eqz v0, :cond_0
a=0;//
6
Enable Logging
public class Toolkit
{
// …
public static void Logw(String s, String s1)
{
if(Statics.DEBUGGING)
Log.w(s, s1);
}
// …
a=0;// # static fields
a=0;// .field public static ROUND_DURATION_IN_SECONDS_FOR_NORMAL_GAME:I
a=0;// .field public static ROUND_DURATION_IN_SECONDS_FOR_TUTORIAL:I
a=0;//
a=0;// .method static constructor <clinit>()V
a=0;// .locals 1
…
-a=0;// const/16 v0, 0x78
+a=0;// const/16 v0, 0x12c
a=0;//
a=0;// #v0=(PosByte);
a=0;// sput v0, Lcom/company/game/core/statics/GameStatics;->ROUND_DURATION_IN_SECONDS_FOR_NORMAL_GAME:I
6
More time per round
120s
300s
public static boolean allowPremiumContent(PremiumType premiumtype, Context context)
{
if(premiumIsPurchased(context))
return true;
synchronized(lock)
{
if(!isLicensed(context))
break MISSING_BLOCK_LABEL_31;
}
return true;
6
Getting Premium
a=0;// .line 129
-a=0;// invoke-static {p0}, Lcom/company/game/util/PremiumCampaignHelper;->premiumIsPurchased(…;)Z
+a=0;// # invoke-static {p0}, Lcom/company/game/util/PremiumCampaignHelper;->premiumIsPurchased(…;)Z
a=0;//
-a=0;// move-result v0
+a=0;// # move-result v0
a=0;//
-a=0;// #v0=(Boolean);
-a=0;// if-eqz v0, :cond_0
+a=0;// #v0=(One);
+a=0;// # if-eqz v0, :cond_0
6
Getting Premium
free version premium (stats unlocked, no ads)
7
Proxy
Route all app traffic through custom proxy
● Used MitMProxy (https://github.com/mitmproxy/mitmproxy)
● Retrieve real server URL via Wireshark
● Redirect app traffic via /etc/hosts on device
● Custom SSL certificate
○ Install own CA in device
○ No certificate pinning
● Avoid compressed responses via HTTP header
○ Accept-Encoding: gzip;q=0,deflate,sdch
7
Proxy
AES encryption
● Shared key in decompiled code
● No key derivation function
● AES initialization vector in HTTP header
○ Payload-session: 2e2f6a61642f7372…
○ Unencrypted
// file APIConnector.java
private static byte sharedKey[] = {
57, -116, 126, 39, 116, -25, -95, -106, -81, 48,
-33, -19, 120, 118, 35, 40, 66, 126, 31, 30,
-83, 76, 31, 93, 13, -122, -50, 68, -108, -114, 28, -80
};
SSL
MitM
Proxy SSLHTTP
Server by “aLf “, thenounproject.com (CC BY 3.0 US)
Spy by “Hopstarter ”, iconarchive.com (CC BY-NC-ND 4.0)
#! python
#decrypt AES
#using IV
7
ProxyHeader: AES IV
AES payload
HTTP
# /etc/hosts
# redirect
# to proxy
7
Proxy
{
"cacheTimestamp": "1405377910521",
"userId": "0",
"conversationId": "-1",
"player1MostWordsInRound": "32",
"id": "6602198229545556683",
"player1Score": "214",
"player1LongestWord": "HEAPS",
"player1User": {
"username": "username",
"ranking": "0",
"premium": "false",
"recruits": "0",
"deleted": "false",
"newUser": "false",
"bestScoreInMatch": "0",
"userId": "3005807464",
"bestScoreInRound": "0",
"online": "false",
"facebookConnected": "false",
"avatarId": "0",
"matchesPlayed": "0",
"useFacebookImage": "false",
"mostWordsInRound": "0"
},
{"rounds": [
{
"seed3": "14657688",
"player2MoveErrors": "0",
"gameId": "6602198229545556683",
"player2SwipeDistance": "681",
"player2Moves":
"1AB2BAE2EAB216227612AEF2DA73840127652567354013DAB723673
B7654EAB72",
"player1MoveErrors": "19",
"player2Done": "true",
"seed1": "2073207065",
"seed2": "680974433",
"player1SwipeDistance": "1608",
"board": {
"bonus": [" ", " ", " ", " ",
" ", " ", "D", " ",
" ", " ", " ", " ",
" ", " ", " ", "T"
],
"board": ["A", "T", "E", "H",
"E", "P", "O", "T",
"H", "S", "A", "S",
"T", "F", "T", "E"
],
"words": [
"TATE",
"SOTS",
"HOST",
"SAPS",
"FATSOS",
…
Server response
request size up to 100kB
8
Automation
Play the game automatically
● Generic external approach
○ No modification of binary necessary
○ Works for any app
Monkeyrunner (http://developer.android.com/tools/help/monkeyrunner_concepts.html)
● Test apps at the functional/framework level
● Able to simulate keystrokes, take screenshots
● Python bindings
8Obtain all possible words
to play correctly
● apk contains .jet “dictionary” for
each language
● Btw, also a wordlist (probably)
used to check for cheaters
Automation
8
Automation
Ruzzle .jet files
● Binary files
● Trie / Radix tree structure
● Optimal for the way the game
is played
● No duplicate encoding
of characters
● List of all excepted
words constructable
G
GA
GAM
GAME
GO
GOD GOT
G
O
D T
A
M
E
8
Automation
Achieving the highscore
● Get all 16 letters
○ Input by hand / screenshot + OCR
● Find all valid words using the extracted
dictionary
● Simulate keystrokes for found words
○ Actually not enough time to enter all
valid words
8
Automation
DEMO
Achievements
Found possibilities to:
✓ Enable logging
✓ Unlock premium features
✓ Achieve insanely high score through automation
✓ Extract protocol via man-in-the-middle attack
Backup slides
Pinned certificate
(installed at dev.
time)
App
Server
Get current
server
certificate
1
Compare
current and
pinned
certificates
2
if identical:
establish
connection
else: reject
3
Certificate Pinning

More Related Content

PPT
Reverse Engineering Android Application
PDF
Android reverse engineering - Analyzing skype
PPT
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
PPTX
Reverse engineering android apps
PDF
Android reverse engineering: understanding third-party applications. OWASP EU...
PDF
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
PDF
Practice of Android Reverse Engineering
PDF
Null Mumbai Meet_Android Reverse Engineering by Samrat Das
Reverse Engineering Android Application
Android reverse engineering - Analyzing skype
Steelcon 2015 Reverse-Engineering Obfuscated Android Applications
Reverse engineering android apps
Android reverse engineering: understanding third-party applications. OWASP EU...
Droidcon Greece '15 - Reverse Engineering in Android: Countermeasures and Tools
Practice of Android Reverse Engineering
Null Mumbai Meet_Android Reverse Engineering by Samrat Das

What's hot (20)

PPT
IEEE Day 2013 - Reverse Engineering an Android Application
PPTX
How to implement a simple dalvik virtual machine
PDF
Toward dynamic analysis of obfuscated android malware
PDF
Android Native Development Kit
PDF
Improving DroidBox
PDF
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
PDF
FRIDA 101 Android
PDF
Android ndk: Entering the native world
PDF
The Hookshot: Runtime Exploitation
PPTX
PDF
LinkedIn - Disassembling Dalvik Bytecode
PDF
Introduction to Frida
PDF
Introduction to the Android NDK
PDF
NDK Programming in Android
PDF
Breaking iOS Apps using Cycript
PPTX
Android ndk
PDF
Introduction to the Android NDK
PPTX
Native development kit (ndk) introduction
PPTX
Java Exploit Analysis .
PDF
Using the Android Native Development Kit (NDK)
IEEE Day 2013 - Reverse Engineering an Android Application
How to implement a simple dalvik virtual machine
Toward dynamic analysis of obfuscated android malware
Android Native Development Kit
Improving DroidBox
ProbeDroid - Crafting Your Own Dynamic Instrument Tool on Android for App Beh...
FRIDA 101 Android
Android ndk: Entering the native world
The Hookshot: Runtime Exploitation
LinkedIn - Disassembling Dalvik Bytecode
Introduction to Frida
Introduction to the Android NDK
NDK Programming in Android
Breaking iOS Apps using Cycript
Android ndk
Introduction to the Android NDK
Native development kit (ndk) introduction
Java Exploit Analysis .
Using the Android Native Development Kit (NDK)
Ad

Viewers also liked (20)

PDF
Learning by hacking - android application hacking tutorial
PDF
Attacking and Defending Mobile Applications
PDF
Android Forensics: Exploring Android Internals and Android Apps
PPTX
Hacking Mobile Apps
PDF
Mobile Hacking
PDF
Git Tricks — git utilities that make life git easier
PDF
FIDO, PKI & beyond: Where Authentication Meets Identification
PPTX
FIDO Webinar – A New Model for Online Authentication: Implications for Policy...
PDF
A deep dive into Android OpenSource Project(AOSP)
PDF
Hacking your Droid (Aditya Gupta)
DOCX
Smali语法
PPTX
Toward Reverse Engineering of VBA Based Excel Spreadsheets Applications
PPTX
Let's talk about jni
PPTX
Reverse Engineering .NET and Java
PDF
Android internals 05 - Dalvik VM (rev_1.1)
PDF
Understanding the Dalvik bytecode with the Dedexer tool
PDF
Introduction to Homomorphic Encryption
PPT
Play With Android
PDF
Android Architecture
PDF
Reverse engineering and instrumentation of android apps
Learning by hacking - android application hacking tutorial
Attacking and Defending Mobile Applications
Android Forensics: Exploring Android Internals and Android Apps
Hacking Mobile Apps
Mobile Hacking
Git Tricks — git utilities that make life git easier
FIDO, PKI & beyond: Where Authentication Meets Identification
FIDO Webinar – A New Model for Online Authentication: Implications for Policy...
A deep dive into Android OpenSource Project(AOSP)
Hacking your Droid (Aditya Gupta)
Smali语法
Toward Reverse Engineering of VBA Based Excel Spreadsheets Applications
Let's talk about jni
Reverse Engineering .NET and Java
Android internals 05 - Dalvik VM (rev_1.1)
Understanding the Dalvik bytecode with the Dedexer tool
Introduction to Homomorphic Encryption
Play With Android
Android Architecture
Reverse engineering and instrumentation of android apps
Ad

Similar to How to reverse engineer Android applications—using a popular word game as an example (20)

PPTX
Decompiling Android
PPTX
Basic reverse engineering steps about .apk file
PDF
hashdays 2011: Tobias Ospelt - Reversing Android Apps - Hacking and cracking ...
PPTX
Fabrizio Cornelli - Securing Android Apps by Reversing - Codemotion Milan 2018
PDF
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
PDF
Android talks #08 decompiling android applications
PDF
Pwning mobile apps without root or jailbreak
PPTX
OWASP Nagpur Meet #3 Android RE
PDF
Your money, your media a DRMtastic (reverse|re) eng. tutorial
PDF
2013 Toorcon San Diego Building Custom Android Malware for Penetration Testing
PDF
BSidesLondon | Your Money, Your Media - A DRMtastic Android (reverse|re
PDF
MobSecCon 2015 - Dynamic Analysis of Android Apps
PDF
Mobile malware analysis with the a.r.e. vm
PPTX
Hacking for Fun and Profit (Mostly for Fun). AnDevCon Boston
PDF
Reversing Android Applications For Fun and Profit
PDF
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
PPTX
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
PDF
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l...
PDF
AnDevCon: Android Reverse Engineering
PDF
Reverse engineering Java et contournement du mécanisme de paiement inapp Android
Decompiling Android
Basic reverse engineering steps about .apk file
hashdays 2011: Tobias Ospelt - Reversing Android Apps - Hacking and cracking ...
Fabrizio Cornelli - Securing Android Apps by Reversing - Codemotion Milan 2018
Who Needs Thumbs? Reverse Engineering Scramble with Friends v1.1
Android talks #08 decompiling android applications
Pwning mobile apps without root or jailbreak
OWASP Nagpur Meet #3 Android RE
Your money, your media a DRMtastic (reverse|re) eng. tutorial
2013 Toorcon San Diego Building Custom Android Malware for Penetration Testing
BSidesLondon | Your Money, Your Media - A DRMtastic Android (reverse|re
MobSecCon 2015 - Dynamic Analysis of Android Apps
Mobile malware analysis with the a.r.e. vm
Hacking for Fun and Profit (Mostly for Fun). AnDevCon Boston
Reversing Android Applications For Fun and Profit
Beginners guide-to-reverse-engineering-android-apps-pau-oliva-fora-viaforensi...
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
OWF12/PAUG Conf Days Pro guard optimizer and obfuscator for android, eric l...
AnDevCon: Android Reverse Engineering
Reverse engineering Java et contournement du mécanisme de paiement inapp Android

More from Christoph Matthies (19)

PDF
Investigating Software Engineering Artifacts in DevOps Through the Lens of Bo...
PDF
Automated Exercises & Software Development Data
PDF
Challenges (and Opportunities!) of a Remote Agile Software Engineering Projec...
PDF
Experience vs Data: A Case for More Data-informed Retrospective Activities
PDF
More than Code: Contributions in Scrum Software Engineering Teams
PDF
Agile Software Development Practices: Perceptions & Project Data
PDF
The Road to Data-Informed Agile Development Processes
PDF
Counteracting Agile Retrospective Problems with Retrospective Activities
PDF
Using Data to Inform Decisions in Agile Software Development
PDF
An Additional Set of (Automated) Eyes: Chatbots for Agile Retrospectives
PDF
Feedback in Scrum: Data-Informed Retrospectives
PDF
Beyond Surveys: Analyzing Software Development Artifacts to Assess Teaching E...
PDF
Scrum2Kanban: Integrating Kanban and Scrum in a University Software Engineeri...
PDF
Should I Bug You? Identifying Domain Experts in Software Projects Using Code...
PDF
Introduction to Lean Software & Kanban
PDF
Lightweight Collection and Storage of Software Repository Data with DataRover
PDF
Pybelsberg — Constraint-based Programming in Python
PDF
Beat Your Mom At Solitaire—Reverse Engineering of Computer Games
PDF
Hacker News vs. Slashdot—Reputation Systems in Crowdsourced Technology News
Investigating Software Engineering Artifacts in DevOps Through the Lens of Bo...
Automated Exercises & Software Development Data
Challenges (and Opportunities!) of a Remote Agile Software Engineering Projec...
Experience vs Data: A Case for More Data-informed Retrospective Activities
More than Code: Contributions in Scrum Software Engineering Teams
Agile Software Development Practices: Perceptions & Project Data
The Road to Data-Informed Agile Development Processes
Counteracting Agile Retrospective Problems with Retrospective Activities
Using Data to Inform Decisions in Agile Software Development
An Additional Set of (Automated) Eyes: Chatbots for Agile Retrospectives
Feedback in Scrum: Data-Informed Retrospectives
Beyond Surveys: Analyzing Software Development Artifacts to Assess Teaching E...
Scrum2Kanban: Integrating Kanban and Scrum in a University Software Engineeri...
Should I Bug You? Identifying Domain Experts in Software Projects Using Code...
Introduction to Lean Software & Kanban
Lightweight Collection and Storage of Software Repository Data with DataRover
Pybelsberg — Constraint-based Programming in Python
Beat Your Mom At Solitaire—Reverse Engineering of Computer Games
Hacker News vs. Slashdot—Reputation Systems in Crowdsourced Technology News

Recently uploaded (20)

PDF
System and Network Administration Chapter 2
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
L1 - Introduction to python Backend.pptx
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
System and Network Administraation Chapter 3
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PPTX
Odoo POS Development Services by CandidRoot Solutions
PPTX
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
PPTX
Transform Your Business with a Software ERP System
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
ai tools demonstartion for schools and inter college
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Understanding Forklifts - TECH EHS Solution
PDF
top salesforce developer skills in 2025.pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
Introduction to Artificial Intelligence
PDF
Softaken Excel to vCard Converter Software.pdf
System and Network Administration Chapter 2
Operating system designcfffgfgggggggvggggggggg
L1 - Introduction to python Backend.pptx
Upgrade and Innovation Strategies for SAP ERP Customers
System and Network Administraation Chapter 3
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
How Creative Agencies Leverage Project Management Software.pdf
Wondershare Filmora 15 Crack With Activation Key [2025
Odoo POS Development Services by CandidRoot Solutions
CHAPTER 12 - CYBER SECURITY AND FUTURE SKILLS (1) (1).pptx
Transform Your Business with a Software ERP System
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
ai tools demonstartion for schools and inter college
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Odoo Companies in India – Driving Business Transformation.pdf
Understanding Forklifts - TECH EHS Solution
top salesforce developer skills in 2025.pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Introduction to Artificial Intelligence
Softaken Excel to vCard Converter Software.pdf

How to reverse engineer Android applications—using a popular word game as an example

  • 1. How to reverse engineer Android applications Finding Vulnerabilities through Reverse Engineering Hasso Plattner Institute, Potsdam Hubert Hesse, Lukas Pirl, Christoph Matthies, Conrad Calmez using a popular word game as an example ?? Images: “Freepik” on flaticon.com (CC BY 3.0), Google (CC BY 3.0)
  • 2. 1 Get the .apk 23 4 Extract the .apk 5 Decompilation to Smali Debugging 6Putting it together 7 8Automation Proxy Decompilation to Java
  • 3. Our Example—a word game ● Top 10 word game in 145 countries (as of July 2014) ● More than 10.000.000 installs ● Over 50 million players ● Play online (with friends) ● 14 languages ● Free and premium version
  • 4. 1:58 0 points S N B I L U SF E I T T E RP A
  • 5. 1:58 15 points S N B I L U SF E I T T E RP A FLUT +15
  • 6. ● APK (application package file), archive file, based on JAR format ● Similar to Deb packages (in Ubuntu) or MSI packages (in Windows) ● Contains program code, resources, assets, certificates, and manifest file ● Can’t be directly downloaded from App Store 1 Get the .apk Download using online “APK Downloader” (http://apps.evozi.com/apk-downloader/) - or - Install on device and download using SDK tools (adb pull <app_path> downloaded.apk)
  • 7. 2 Extract the .apk ● Normal decompression using unzip fails ● Special tool: APKTool ○ Standard is APKTool 1.5.2. (not able to recompress correctly) (https: //code.google.com/p/android-apktool/downloads/list) ○ APKTool 2.0.0 Beta 9 works (http://connortumbleson.com/2014/02/apktool-2-0-0-beta-9-released/) Decrompressing: apktool d -d game.apk -o outdir
  • 9. 2 Modifying resources ● Change arbitrary resources ● Repack into .apk file and install Recrompressing: apktool b -d outdir -o com.company.game.free_patch.apk ● Recompression works, Android fails with “can’t install”, wrong certificate ○ APKTool tries to reuse as much as possible, doesn’t recompute signature
  • 10. 2Manually sign repacked apk: ● Create custom CA ● Java JAR Signing and Verification Tool (http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html) jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my- release-key.keystore com.company.game.free_patch.apk alias_name Modifying resources
  • 12. .apk contains compiled code ● Dalvik bytecode interpreted by the Dalvik Process virtual machine ● Stored in .dex (Dalvik EXecutable) files APKTool translates this to “smali” (https://code.google.com/p/smali/) ● Abstraction of bytecode, closer to Java ● Dalvik opcodes (http://s.android.com/tech/dalvik/dalvik-bytecode.html) ● Can be edited directly 3Decompilation to Smali
  • 13. .class public LHelloWorld; .super Ljava/lang/Object; .method public static main([Ljava/lang/String;)V .registers 2 sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream; const-string v1, "Hello World!" invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V return-void .end method 3 Smali Hello World
  • 14. Interactive debugging ● Set debuggable=”true” in AndroidManifest.xml ○ Repack using APKTool ● Need to connect smali sources to binary ● Workaround: pretend we have valid Java code 4 Debugging <application android:allowBackup="true" android:hardwareAccelerated="true" android:icon="@drawable/launcher_icon" android:label="@string/app_name" android:name="com.company.game.core.GameApplication" android:theme=" @style/Theme.GameTheme" android:debuggable="true">
  • 15. a=0;// .class public abstract La; a=0;// .super Ljava/lang/Object; a=0;// a=0;// a=0;// # instance fields a=0;// .field protected final a:Ljava/lang/Object; a=0;// a=0;// .field private final b:Landroid/os/Handler; a=0;// 4 Debugging Smali code in comments Placeholder Java
  • 16. Two ways to obtain java code ● Convert .dex files to .jar ○ Use standard java bytecode decompilers ● Disassemble .dex directly to .java 5 Decompilation to Java
  • 17. Using dex files ● Androguard (https://code.google.com/p/androguard/) ○ Maps DEX format into full Python objects ○ Works in memory (My 4GB machine wasn’t enough) ○ Doesn’t immediately dump code into Java files 5 Decompilation to Java
  • 18. Using jar files ● dex2jar (https://code.google.com/p/dex2jar/) ○ dex2jar, jar2dex, apk-sign ○ Supports recreating .dex from Java ● JD-GUI (http://jd.benow.ca/) ○ Popular jar-decompiler ○ Works 100% with “Hello World” app 5 Decompilation to Java
  • 19. Combining Java decompilation and Smali ● Java more readable than Smali ● Unfortunately Java decompilation not 100% perfect ○ Invalid Java constructs or only method signatures ○ Cannot recompile from Java sources 6 Putting it together
  • 20. private void fixSpecialChars() { int i; char ac[]; int j; int k; i = 0; ac = tiles; j = ac.length; k = 0; _L9: if(k >= j) break MISSING_BLOCK_LABEL_161; ac[k]; JVM INSTR lookupswitch 6: default 80 // 40: 125 // 41: 137 // 47: 149 // 91: 89 // 92: 101 // 93: 113; goto _L1 _L2 _L3 _L4 _L5 _L6 _L7 _L4: break MISSING_BLOCK_LABEL_149; _L1: break; /* Loop/switch isn't completed */ _L5: break; /* Loop/switch isn't completed */ _L10: i++; k++; if(true) goto _L9; else goto _L8 _L8: 6When Decompilation fails an example Goto not supported in Java Bare JVM instructions
  • 21. Combining Java decompilation and Smali ● Approach: Use multiple Java decompilers ○ They tend to fail in different places 6 Putting it together 1. Find interesting parts in Java source 2. Check corresponding smali sources 3. Edit those
  • 22. protected void roundEnd(boolean paramBoolean) { // … this.resultData.setTotalScore(this.totalScore); // … startRoundSummary(); if (!this.isPractice) { this.currentRound.setWordsInRound(this.resultData.getMoves().size()); // … this.currentRound.setPlayer1Moves(GameHelper.encodeMoves(this.resultData. getMoves())); this.currentRound.setPlayer1Score(this.totalScore); // … 6 Manipulating the score Opportunities for manipulation ● Server validation disallows this
  • 23. a=0;// sget-boolean v0, Lcom/company/game/core/statics/Statics;->DEBUGGING:Z a=0;// a=0;// #v0=(Boolean); -a=0;// if-eqz v0, :cond_0 +a=0;// #if-eqz v0, :cond_0 a=0;// 6 Enable Logging public class Toolkit { // … public static void Logw(String s, String s1) { if(Statics.DEBUGGING) Log.w(s, s1); } // …
  • 24. a=0;// # static fields a=0;// .field public static ROUND_DURATION_IN_SECONDS_FOR_NORMAL_GAME:I a=0;// .field public static ROUND_DURATION_IN_SECONDS_FOR_TUTORIAL:I a=0;// a=0;// .method static constructor <clinit>()V a=0;// .locals 1 … -a=0;// const/16 v0, 0x78 +a=0;// const/16 v0, 0x12c a=0;// a=0;// #v0=(PosByte); a=0;// sput v0, Lcom/company/game/core/statics/GameStatics;->ROUND_DURATION_IN_SECONDS_FOR_NORMAL_GAME:I 6 More time per round 120s 300s
  • 25. public static boolean allowPremiumContent(PremiumType premiumtype, Context context) { if(premiumIsPurchased(context)) return true; synchronized(lock) { if(!isLicensed(context)) break MISSING_BLOCK_LABEL_31; } return true; 6 Getting Premium a=0;// .line 129 -a=0;// invoke-static {p0}, Lcom/company/game/util/PremiumCampaignHelper;->premiumIsPurchased(…;)Z +a=0;// # invoke-static {p0}, Lcom/company/game/util/PremiumCampaignHelper;->premiumIsPurchased(…;)Z a=0;// -a=0;// move-result v0 +a=0;// # move-result v0 a=0;// -a=0;// #v0=(Boolean); -a=0;// if-eqz v0, :cond_0 +a=0;// #v0=(One); +a=0;// # if-eqz v0, :cond_0
  • 26. 6 Getting Premium free version premium (stats unlocked, no ads)
  • 27. 7 Proxy Route all app traffic through custom proxy ● Used MitMProxy (https://github.com/mitmproxy/mitmproxy) ● Retrieve real server URL via Wireshark ● Redirect app traffic via /etc/hosts on device ● Custom SSL certificate ○ Install own CA in device ○ No certificate pinning ● Avoid compressed responses via HTTP header ○ Accept-Encoding: gzip;q=0,deflate,sdch
  • 28. 7 Proxy AES encryption ● Shared key in decompiled code ● No key derivation function ● AES initialization vector in HTTP header ○ Payload-session: 2e2f6a61642f7372… ○ Unencrypted // file APIConnector.java private static byte sharedKey[] = { 57, -116, 126, 39, 116, -25, -95, -106, -81, 48, -33, -19, 120, 118, 35, 40, 66, 126, 31, 30, -83, 76, 31, 93, 13, -122, -50, 68, -108, -114, 28, -80 };
  • 29. SSL MitM Proxy SSLHTTP Server by “aLf “, thenounproject.com (CC BY 3.0 US) Spy by “Hopstarter ”, iconarchive.com (CC BY-NC-ND 4.0) #! python #decrypt AES #using IV 7 ProxyHeader: AES IV AES payload HTTP # /etc/hosts # redirect # to proxy
  • 30. 7 Proxy { "cacheTimestamp": "1405377910521", "userId": "0", "conversationId": "-1", "player1MostWordsInRound": "32", "id": "6602198229545556683", "player1Score": "214", "player1LongestWord": "HEAPS", "player1User": { "username": "username", "ranking": "0", "premium": "false", "recruits": "0", "deleted": "false", "newUser": "false", "bestScoreInMatch": "0", "userId": "3005807464", "bestScoreInRound": "0", "online": "false", "facebookConnected": "false", "avatarId": "0", "matchesPlayed": "0", "useFacebookImage": "false", "mostWordsInRound": "0" }, {"rounds": [ { "seed3": "14657688", "player2MoveErrors": "0", "gameId": "6602198229545556683", "player2SwipeDistance": "681", "player2Moves": "1AB2BAE2EAB216227612AEF2DA73840127652567354013DAB723673 B7654EAB72", "player1MoveErrors": "19", "player2Done": "true", "seed1": "2073207065", "seed2": "680974433", "player1SwipeDistance": "1608", "board": { "bonus": [" ", " ", " ", " ", " ", " ", "D", " ", " ", " ", " ", " ", " ", " ", " ", "T" ], "board": ["A", "T", "E", "H", "E", "P", "O", "T", "H", "S", "A", "S", "T", "F", "T", "E" ], "words": [ "TATE", "SOTS", "HOST", "SAPS", "FATSOS", … Server response request size up to 100kB
  • 31. 8 Automation Play the game automatically ● Generic external approach ○ No modification of binary necessary ○ Works for any app Monkeyrunner (http://developer.android.com/tools/help/monkeyrunner_concepts.html) ● Test apps at the functional/framework level ● Able to simulate keystrokes, take screenshots ● Python bindings
  • 32. 8Obtain all possible words to play correctly ● apk contains .jet “dictionary” for each language ● Btw, also a wordlist (probably) used to check for cheaters Automation
  • 33. 8 Automation Ruzzle .jet files ● Binary files ● Trie / Radix tree structure ● Optimal for the way the game is played ● No duplicate encoding of characters ● List of all excepted words constructable G GA GAM GAME GO GOD GOT G O D T A M E
  • 34. 8 Automation Achieving the highscore ● Get all 16 letters ○ Input by hand / screenshot + OCR ● Find all valid words using the extracted dictionary ● Simulate keystrokes for found words ○ Actually not enough time to enter all valid words
  • 36. Achievements Found possibilities to: ✓ Enable logging ✓ Unlock premium features ✓ Achieve insanely high score through automation ✓ Extract protocol via man-in-the-middle attack
  • 38. Pinned certificate (installed at dev. time) App Server Get current server certificate 1 Compare current and pinned certificates 2 if identical: establish connection else: reject 3 Certificate Pinning