SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
Android 逆向⼯工程⼼心得
Hsieh, En-Ping
shieh.npin@gmail.com
Agenda
• 抓
• 拆
• 組
• 秀
抓
First move
The Easy way.
• ⽤用APP抓APK

https://play.google.com/store/apps/details?id=com.ext.ui&hl=zh_TW
• 貼網址

https://apps.evozi.com/apk-downloader/
⾝身為宅宅的浪漫!
The Classic way.
• #adb shell pm list package

顯⽰示所有安裝的應⽤用程式之packageName
• #adb shell pm path package.name.here

顯⽰示應⽤用程式之APK路路徑
• #adb pull /path/to/apk/location/base.apk

取出應⽤用程式之APK
拆
Making material
可以把JAR直接放到
Android上跑嗎?
Java Virtual
Machine(JVM)

⼀一種能夠執⾏行行Java bytecode的虛擬機器
Desktop
Java VM
Java
bytecode
Dalvik VM
可以執⾏行行已轉換為「Dalvik
Executable」格式的Java應⽤用程式
Desktop Android
Java VM Dalvik VM
Java
bytecode
Dex
bytecode
JVM ≠ Dalvik VM?
Stacked based Register based
Desktop Mobile
Java VM Dalvik VM
Java
bytecode
Dex code
變換
http://lim.univ-reunion.fr/staff/fred/Doc/Dalvik/Analysis-of-Dalvik-VM.pdf
每次變換都會損失部分資訊。
和最初的原始碼差異異越來來越⼤大
那APK⼜又是如何製作?
APK封裝流程
Source Code

(*.java)
Java
Bytecode

(*.class)
Java Compiler
Compile
APK封裝流程
Java
Bytecode

(*.class)
“dx” tool
Dalvik
Executable

(classes.dex)
Convert

&

Merge
APK封裝流程
Dalvik
Bytecode

(classes.dex)
APK Packager
w/ compiled
resourced
APK

(unsigned)
Assemble
APK封裝流程
APK

(unsigned)
APK

(signed)
APK Packager
w/ key store
Sign
https://developer.android.com/studio/build/index.html
So far…
• 要修改邏輯→Dex下⼿手。
• 要對Dex下⼿手→拆開APK。
• 要拆開APK→簽章失效。
• 也就是說,當修改完後必須重組APK並加簽章。
可以直接解開來來改嗎?
如果你天資過⼈人,是百年年難得⼀一⾒見見的武術奇才
Apktool
https://ibotpeaches.github.io/Apktool/
Apktool
• #java -jar apktool d target.apk -o target

反組譯APK並產⽣生smali與xml

*Smali是⼀一種很接近dex的組合語⾔言
• #java -jar apktool b target -o output.apk

將smali與xml重新組譯成APK



如果試著安裝就會...
[INSTALL_PARSE_FAILED_NO_CERTIFICATES]
Signed
• #jarsigner -verbose -keystore ~/.android/
debug.keystore -storepass android -keypass
android target.apk androiddebugkey



使⽤用debug keystore 去簽重新包裝的apk
先來來試試看!
Smali
https://github.com/JesusFreke/smali
foo(I[[II[Ljava/lang/Object;)Z
boolean foo(int, int[][], int, Object[])
foo(I[[II[Ljava/lang/Object;)Z
boolean foo(int, int[][], int, Object[])
暫存器
.method public d(Ljava/lang/String;J)I


.locals 3
暫存器 v0 v1 v2
型態 ? ? ?
別名 p0 p1 p2 p3
v3
this
v4 v5 v6
String long
v0~v2是可以⾃自由使⽤用的區域暫存器
v3是物件本⾝身,但靜態⽅方法則無。
v4~v6是傳入參參數
參參數p0~p3不受到區域暫存器的影響。
Quick Demo
.method public static d(Ljava/lang/String;Ljava/lang/String;)V
.locals 3
.param p0, "username" # Ljava/lang/String;
.param p1, "password" # Ljava/lang/String;
.prologue
...
invoke-virtual {v1, v0}, Landroid/content/Context;->startService(Landroid/content/Intent;)Land
return-void
.end method
invoke-virtual {v0}, Landroid/content/Intent;->toString()Ljava/lang/String;
move-result-object v0
const-string v3, "LOG"
invoke-static {v3, v0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
調⽤用intent.toString()將輸出存到v0
增加區域暫存器
設定v3
調⽤用Log.d(String,String)
.locals 4
Smali經驗談
• 注意static⽤用invoke-static、public/protected⽤用invoke-
virtual、private⽤用invoke-direct、super⽤用invoke-super
• 確認該區域暫存器沒有被其他指令使⽤用
• 函數簽名要多檢查,例例如Log.d有回傳值
• ⾃自⼰己做APK轉smali學最快
Smali is good, but still
hard to analyze.
We need dex2jar and JDGui
Dex2Jar
https://sourceforge.net/projects/dex2jar/
#sh ./dex2jar/d2j-dex2jar.sh target.apk
JDGui
http://jd.benow.ca/
組
Develop
Analysis
APK
JAR
Dex2jar
Analyze
JDGui
Reversing
APK
Smali
Apktool
Modified
Editor(Sublime Text)
APK(unsign)
Apktool
APK(signed)
Jarsigner
秀
Show, Don’t tell!
分析經驗談
• AndroidManifest.xml is a good start point. Adding
android:debuggable=“true” helps you ALWAYS.
• 耐⼼心、運氣和經驗。
• Use UIAutomator to analyze UI and xml.
• Use shell to view persistence data, such as db.

#adb shell run-as package.name
分析經驗談
• Framework相關的class/method是不會被混淆的。
• Use Activity Manager to analyze Task Stack

#adb shell dumpsys activity activities 

| sed -En -e '/Running activities/,/Run #0/p'
• ⽤用上任何可⽤用的Sniffer Tool,像是Charles Web
Proxy, tcpdump。
分析經驗談
• 善⽤用全域搜尋關鍵詞(Unicode <-> Text/Hex <-> Int)
• 藉由逆向製造Exception來來追蹤執⾏行行路路徑。
• 多看多嘗試,不要太快就看得太深。
逆向經驗談
• Static is better. NO constructor required.
• 建立同樣PackageName的Utility Project,編譯成
APK後再轉Smali並放入要改寫的⽬目錄。
• 少寫少錯,多寫多錯。
• Don’t forget use git.
Anti-Reverse Engineering
• 逆向⼯工程是時間問題,但是可以努⼒力力讓逆向成本⼤大
於價值。
• Proguard 能提供基本的防護。
• 使⽤用JNI與C++處理理核⼼心與加密可提⾼高逆向的⾨門檻。
• 如果有後端,將核⼼心邏輯放在Server side。
• 使⽤用DexGuard、Arxan等商⽤用加密⼯工具。
Appendix
• Smali Syntax Highlight Plugin 

https://github.com/ShaneWilton/sublime-smali
• Jadx

https://github.com/skylot/jadx
• 如果有align問題請記得

#zipalign -f -v 4 unalign.apk align.apk
Reference
https://liuzhichao.com/p/919.html

http://blog.isming.me/2015/01/14/android-decompile-smali/

https://hitcon.org/2015/CMT/download/day2-g-r4.pdf

http://blog.csdn.net/wdaming1986/article/details/8299996

https://www.rsaconference.com/writable/presentations/file_upload/stu-w02b-
beginners-guide-to-reverse-engineering-android-apps.pdf
The End.
Q & A

Mais conteúdo relacionado

Mais procurados

Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜Jumpei Miyata
 
jq: JSON - Like a Boss
jq: JSON - Like a Bossjq: JSON - Like a Boss
jq: JSON - Like a BossBob Tiernay
 
Fluentd and Kafka
Fluentd and KafkaFluentd and Kafka
Fluentd and KafkaN Masahiro
 
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805shinyatsukasaki
 
Learn nginx in 90mins
Learn nginx in 90minsLearn nginx in 90mins
Learn nginx in 90minsLarry Cai
 
Docker Networking Overview
Docker Networking OverviewDocker Networking Overview
Docker Networking OverviewSreenivas Makam
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shelljaguardesignstudio
 
Docker Containers Deep Dive
Docker Containers Deep DiveDocker Containers Deep Dive
Docker Containers Deep DiveWill Kinard
 
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...Simplilearn
 
リアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについてリアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについてHidenori Takeshita
 
Introduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopIntroduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopAjeet Singh Raina
 

Mais procurados (20)

Ansible - Hands on Training
Ansible - Hands on TrainingAnsible - Hands on Training
Ansible - Hands on Training
 
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
Jenkins 2.0 最新事情 〜Make Jenkins Great Again〜
 
CloudInit Introduction
CloudInit IntroductionCloudInit Introduction
CloudInit Introduction
 
jq: JSON - Like a Boss
jq: JSON - Like a Bossjq: JSON - Like a Boss
jq: JSON - Like a Boss
 
Fluentd and Kafka
Fluentd and KafkaFluentd and Kafka
Fluentd and Kafka
 
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
いまさら聞けないNGINXコンフィグ_F5-NGINX-Community-20200805
 
Designing Ruby APIs
Designing Ruby APIsDesigning Ruby APIs
Designing Ruby APIs
 
Learn nginx in 90mins
Learn nginx in 90minsLearn nginx in 90mins
Learn nginx in 90mins
 
Docker Networking Overview
Docker Networking OverviewDocker Networking Overview
Docker Networking Overview
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shell
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
 
Docker Containers Deep Dive
Docker Containers Deep DiveDocker Containers Deep Dive
Docker Containers Deep Dive
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
 
Jenkins
JenkinsJenkins
Jenkins
 
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
 
リアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについてリアクティブプログラミングとMVVMパターンについて
リアクティブプログラミングとMVVMパターンについて
 
いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門 いまさら聞けないDockerコンテナ超入門
いまさら聞けないDockerコンテナ超入門
 
Introduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopIntroduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate Workshop
 

Semelhante a Android 逆向工程心得分享

第十一堂 學習編譯與上架
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架力中 柯
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
Phonagp 简介
Phonagp 简介Phonagp 简介
Phonagp 简介dong yuwei
 
Mobile Web Function Test
Mobile Web Function TestMobile Web Function Test
Mobile Web Function TestRyan Chung
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swttka
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027Wei Sun
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門Roy Chen
 
凌波微步:wagon + VS Code 的輕功哲學
凌波微步:wagon + VS Code 的輕功哲學凌波微步:wagon + VS Code 的輕功哲學
凌波微步:wagon + VS Code 的輕功哲學Shengyou Fan
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究Hsiao Tim
 
打造你專屬的Xcode plugin
打造你專屬的Xcode plugin打造你專屬的Xcode plugin
打造你專屬的Xcode pluginYuhua Chen
 
docker intro
docker introdocker intro
docker introkoji lin
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Li Yi
 
一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)Kejun Zhang
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述kevin_yanggl
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)Wei Sun
 
炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建Johnny Sung
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfDuran Hsieh
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]yiditushe
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用謝 宗穎
 

Semelhante a Android 逆向工程心得分享 (20)

第十一堂 學習編譯與上架
第十一堂 學習編譯與上架第十一堂 學習編譯與上架
第十一堂 學習編譯與上架
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
Phonagp 简介
Phonagp 简介Phonagp 简介
Phonagp 简介
 
Mobile Web Function Test
Mobile Web Function TestMobile Web Function Test
Mobile Web Function Test
 
2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt2012 java two-desktop-appliction-using-j-ruby-with-swt
2012 java two-desktop-appliction-using-j-ruby-with-swt
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門
 
凌波微步:wagon + VS Code 的輕功哲學
凌波微步:wagon + VS Code 的輕功哲學凌波微步:wagon + VS Code 的輕功哲學
凌波微步:wagon + VS Code 的輕功哲學
 
3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究3.android 应用程序通用自动脱壳方法研究
3.android 应用程序通用自动脱壳方法研究
 
打造你專屬的Xcode plugin
打造你專屬的Xcode plugin打造你專屬的Xcode plugin
打造你專屬的Xcode plugin
 
docker intro
docker introdocker intro
docker intro
 
Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践Gops2016 云端基于Docker的微服务与持续交付实践
Gops2016 云端基于Docker的微服务与持续交付实践
 
一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)一拍一产品背后的故事(React实战)
一拍一产品背后的故事(React实战)
 
Html5开发android应用程序概述
Html5开发android应用程序概述Html5开发android应用程序概述
Html5开发android应用程序概述
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)
 
炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建炎炎夏日學 Android 課程 - Part 0: 環境搭建
炎炎夏日學 Android 課程 - Part 0: 環境搭建
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdf
 
Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]Java Jdk6学习笔记[Ppt]
Java Jdk6学习笔记[Ppt]
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用從軟體開發角度
談 Docker 的應用
從軟體開發角度
談 Docker 的應用
 

Android 逆向工程心得分享