Android APK程序的smali动态调试
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71250622
一、Apktool的下载和安装
Apktool是Android逆向分析的基础工具,在进行Android APK的smali动态调试的时候会使用到它。有关Apktool工具的下载、安装、使用以及源码的编译可以参考Apktool工具的官网:https://ibotpeaches.github.io/Apktool/,Apktool工具的官网将Apktool工具的使用和版本更新的说明都讲的很清楚了,后面很多的操作都根据Apktool工具官网的帮助说明来进行实践。
Apktool工具源码下载地址:https://github.com/iBotPeaches/Apktool。
Apktool工具的下载和安装,可以参考Apktool工具官网的安装说明,具体的网址为:https://ibotpeaches.github.io/Apktool/install/,Apktool工具在 Windows、Linux、MAC
OS X平台的安装步骤如下:
Install Instructions
Quick Check
- Is at least Java 1.7 installed?
- Does executing java -version on command line / command prompt return
1.7 or greater? - If not, please install Java 7+ and make it the default.
Installation for Apktool
- Windows:
- Download Windows wrapper
script (Right click, Save Link Asapktool.bat
) - Download apktool-2 (find newest here)
- Rename downloaded jar to
apktool.jar
- Move both files (
apktool.jar
&apktool.bat
)
to your Windows directory (UsuallyC://Windows
) - If you do not have access to
C://Windows
,
you may place the two files anywhere then add that directory to your Environment Variables System PATH variable. - Try running apktool via command prompt
- Download Windows wrapper
- Linux:
- Download Linux wrapper script (Right
click, Save Link Asapktool
) - Download apktool-2 (find newest here)
- Make sure you have the 32bit libraries (
ia32-libs
)
downloaded and installed by your linux package manager, if you are on a 64bit unix system. - (This helps provide support for the 32bit native binary aapt, which is required by apktool)
- Rename downloaded jar to
apktool.jar
- Move both files (
apktool.jar
&apktool
)
to/usr/local/bin
(root needed) - Make sure both files are executable (
chmod
)
+x - Try running apktool via cli
- Download Linux wrapper script (Right
- Mac OS X:
- Download Mac wrapper script (Right
click, Save Link Asapktool
) - Download apktool-2 (find newest here)
- Rename downloaded jar to
apktool.jar
- Move both files (
apktool.jar
&apktool
)
to/usr/local/bin
(root needed) - Make sure both files are executable (
chmod
)
+x - Try running apktool via cli
- Download Mac wrapper script (Right
Note - Wrapper
scripts are not needed, but helpful so you don’t have to type java -jar apktool.jar over
and over.
Windows平台下Apktool工具安装步骤的整理:
1.从网址:https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/windows/apktool.bat 获取文件内容创建脚本文件 apktool.bat
,脚本文件apktool.bat 的内容如下:
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\apktool.jar" %*
2.从网址:https://bitbucket.org/iBotPeaches/apktool/downloads/ 下载最新版的Apktool工具并将下载后的 Apktool工具 重命名为 apktool.jar 。
3.将 apktool.jar 和
apktool.bat 文件拷贝到windows系统的 C://Windows 目录下,这样就可以在windows系统的cmd命令行终端上直接使用
apktool 命令进行工作了。如果不喜欢这样做,也可以将 apktool.jar 和 apktool.bat
文件的文件路径添加到windows系统的环境变量path中,效果一样。如果觉得这些操作比较繁琐,也可以直接在 apktool.jar 文件下进行Android APK的解包反编译和打包工作,具体的使用命令如下:
$ java -jar apktool.jar
Apktool工具安装成功后,配置好的效果图如下:
4.Apktool工具的命令行帮助如下:
Apktool v2.2.2 - a tool for reengineering Android apk files
with smali v2.1.3 and baksmali v2.1.3
Copyright 2014 Ryszard Wi?niewski <brut.alll@gmail.com>
Updated by Connor Tumbleson <connor.tumbleson@gmail.com>
usage: apktool
-advance,--advanced prints advance information.
-version,--version prints the version then exits
usage: apktool if|install-framework [options] <framework.apk>
-p,--frame-path <dir> Stores framework files into <dir>.
-t,--tag <tag> Tag frameworks using <tag>.
usage: apktool d[ecode] [options] <file_apk>
-f,--force Force delete destination directory.
-o,--output <dir> The name of folder that gets written. Default is apk.out
-p,--frame-path <dir> Uses framework files located in <dir>.
-r,--no-res Do not decode resources.
-s,--no-src Do not decode sources.
-t,--frame-tag <tag> Uses framework files tagged by <tag>.
usage: apktool b[uild] [options] <app_path>
-f,--force-all Skip changes detection and build all files.
-o,--output <dir> The name of apk that gets written. Default is dist/name.apk
-p,--frame-path <dir> Uses framework files located in <dir>.
For additional info, see: http://ibotpeaches.github.io/Apktool/
For smali/baksmali info, see: https://github.com/JesusFreke/smali
提示:
Apktool工具运行正常的前提条件是 主机系统上安装了 Oracle JDK 1.7 或者 更高版本的 Oracle JDK,不能使用 OpenJDK。
二、Android APK 程序动态调试插件smalidea的下载
在这之前smali 动态调试Android APK程序需要apktool命令的
-d 参数选项 的支持,但是 apktool 2.1.0以后 ,不再提供 apktool d -d 功能生成 .java 的 smali 文件,Android APK程序的动态调试需要借助调试插件 smalidea
具体可以参考官方文档:https://ibotpeaches.github.io/Apktool/documentation/。
smalidea插件的官方参考文档地址为:https://github.com/JesusFreke/smali/wiki/smalidea。
smalidea插件、smali工具、baksmali工具的下载地址为:https://bitbucket.org/JesusFreke/smali/downloads/。
smalidea插件的官方安装说明,如下图所示:
在Android Studio中,选择 "File —>
Settings" (旧版的是 "Perference" ) —> "Plugins" —> "Install plugin from disk..." 选项,在打开的窗口中选择已经下载的 smalidea-0.03.zip
,确认后可直接安装,如下图所示。smalidea插件安装成功以后,Android Studio会提示重启,单击 "Restart" 按钮重启即可。
提示:
Android Studio和smalidea插件可能会存在兼容性的问题,在进行smalidea插件安装的时候,需要根据自己安装的Android
Studio版本选择合适版本的smalidea插件进行安装。
三、反编译需要调试的APK包
使用
baksmali 或者 Apktool工具 反编译需要调试的APK程序包,这里以 RouterCheck-0.9.9-83.apk 为例。为反编译APK程序包和重建APK程序包方便起见,使用前面同样的方式,创建 baksmali.bat脚本文件 和 smali.bat脚本文件,然后拷贝 baksmali.bat
脚本文件 和 smali.bat 脚本文件以及 baksmali-2.2.0.jar 和 smali-2.2.0.jar 到windows系统的 C://Windows 目录下。baksmali.bat脚本文件
和 smali.bat脚本文件的文件内容分别如下:
baksmali.bat
脚本文件
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\smali-2.2.0.jar" %*
smali.bat
脚本文件
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
java -jar -Duser.language=en "%~dp0\baksmali-2.2.0.jar" %*
baksmali使用的帮助命令如下:
$ baksmali
usage: baksmali [--version] [--help] [<command [<args>]]
Options:
--help,-h,-? - Show usage information
--version,-v - Print the version of baksmali and then exit
Commands:
deodex(de,x) - Deodexes an odex/oat file
disassemble(dis,d) - Disassembles a dex file.
dump(du) - Prints an annotated hex dump for the given dex file
help(h) - Shows usage information
list(l) - Lists various objects in a dex file.
See baksmali help <command> for more information about a specific command
smali使用的帮助命令如下:
$ smali
usage: smali [-v] [-h] [<command [<args>]]
Options:
-h,-?,--help - Show usage information
-v,--version - Print the version of baksmali and then exit
Commands:
assemble(ass,as,a) - Assembles smali files into a dex file.
help(h) - Shows usage information
See smali help <command> for more information about a specific command
使用smalidea插件对Android
APK程序进行smali动态调试的步骤,可以参考smalidea插件的官方文档,具体的步骤如下:
1.使用 baksmali 或者 Apktool工具 对 RouterCheck-0.9.9-83.apk
程序包进行反编译的命令:
@echo off
: 使用baksmali解包apk反编译dex文件
if exist debugbaksmali\src @DEL /S /Q debugbaksmali\src\*
baksmali d RouterCheck-0.9.9-83.apk -o ./debugbaksmali/src
pause
: ##########################################################
: 使用smali打包生成dex文件
smali a ./debugbaksmali/src -o debugbaksmali.dex
pause
: ###################### 或者 ##############################
@echo off
: apktool解包apk
if exist debugapktoolsmali\src @DEL /S /Q debugapktoolsmali\src\*
apktool d RouterCheck-0.9.9-83.apk -o ./debugapktoolsmali/src
pause
: ##########################################################
: apktool打包apk
apktool b ./debugapktoolsmali/src -o debugapktool.apk
pause
使用 baksmali 对需要调试的 RouterCheck-0.9.9-83.apk 程序包进行反编译处理的结果截图如下:
2.将 RouterCheck-0.9.9-83.apk 解包反编译后的smali目录 /debugbaksmali/src
导入到Android Studio中,如下图所示:
选择需要动态调试的目标工程目录 /debugbaksmali :
导入时选择
Create project from existing sources 如下图所示,接着一路 Next 即可导入成功:
3.导入工程成功后,右键点击 src 目录,设定
Mark Directory As->Sources Root 如下图所示:
4.打开 "File"—>"Project Structure"为导入成功需要动态的目标工程设置对应的
JDK 和
Android SDK 版本,如下图所示:
四、开启Android Apk应用的调试选项
根据Android的官方文档,如果要调试一个Apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.Apk的 AndroidManifest.xm 中 Application标签 必选包含属性 android:debuggable="true";
2./default.prop 中 ro.debuggable 的值为1;
但是很多发布版的Android apk中没有开启调试选项,设置 android:debuggable="false"。因此,需要使用Apktool工具解包需要动态调试的目标Apk程序包,在目标Apk程序包的 AndroidManifest.xml 中 Application标签
里添加 调试选项 android:debuggable="true",然后使用Apktool工具重新打包、签名生成能够被调试的目标Apk程序包;如果觉得这样操作比较繁琐,也可以通过直接修改Android设备的 boot.img镜像文件设置 /default.prop 中
ro.debuggable 的值为 1,不需要每次修改需要调试的目标Apk的配置和重新打包,一劳永逸。这里使用添加 android:debuggable="true" 的方法,使目标Apk程序能够被调试。
1.使用Apktool工具解包 RouterCheck-0.9.9-83.apk 程序,添加 android:debuggable="true" 属性。
: 使用Apktool工具解包Apk程序
$ apktool d RouterCheck-0.9.9-83.apk -o ./debugapktoolsmali/src
为解包的 RouterCheck-0.9.9-83.apk 程序添加 android:debuggable="true" 属性,如下图所示:
2.使用Apktool对解包的 RouterCheck-0.9.9-83.apk
程序进行打包处理,执行下面的命令:
: 使用Apktool工具打包Apk程序
$ apktool b ./debugapktoolsmali/src -o debugapktool.apk
3.使用AndroidKiller工具对重新打包生成的 debugapktool.apk 进行签名处理。
4.将重新打包、重新签名后的 debugapktool_sign.apk 程序安装到Android手机设备(Nexus 5)上,执行下面的命令:
: 手机设备USB连接电脑正常
$ adb install -r debugapktool_sign.apk
五、动态调试目标Apk程序
1.查看目标Apk程序 RouterCheck-0.9.9-83.apk 的AndroidManifest.xml 获取到
包名 为 com.Sericon.RouterCheck.client.android ,主Activity类名为
com.Sericon.RouterCheck.client.android.MainActivity ,截图如下所示:
2.以调试等待模式启动目标Apk程序
RouterCheck-0.9.9-83.apk(即重新打包、签名生成的 debugapktool_sign.apk),执行下面的命令:
: 以调试等待模式启动需要调试的Apk程序
: 格式 adb shell am start -D -W -n 包名/主类名
$ adb shell am start -D -W -n com.Sericon.RouterCheck.client.android/.MainActivity
debugapktool_sign.apk程序 以调试等待模式启动成功后的结果截图如下所示:
3.目标工程导入到Android Studio中成功后,发现Android Studio工具的 Android Android Device Monitor 按钮 不能点击使用,DDMS工具不能通过这种方式进行启动;需要运行 \Android\sdk\tools\ddms.bat 才能实现DDMS工具的启动。DDMS工具的启动成功以后,选择需要动态调试的目标Apk程序
RouterCheck-0.9.9-83.apk 的进程 com.Sericon.RouterCheck.client.android ,如下图所示:
4.在 Android Studio 中配置远程调试 (Run —> Edit Configurations...),单击 "+" 按钮,选中 "Remote" 添加远程调试的配置,如下图所示,根据上面
步骤3 中的信息更改Debug端口为 8700 ,并指定源文件的目录为 需要调试的目标Apk解包后的 smali文件路径 (如果有必要)。
5.在需要动态调试的目标Apk程序的smali源码上下有效的断点,然后单击 "Run"——> "Debug 'debug_apk'" 即可开始远程调试了,需要动态调试的目标Apk程序的调试等待界面结束,启动Apk应用,直到运行到有效断点被触发的地方。执行结果,如下图所示,可以看到此时的栈回溯、变量值等信息。
6.OK,目标Apk程序被动态调试起来了,后面我们就可以进行 F7、F8 愉快的单步调试Apk程序了。
参考文档:
《漏洞战争-软件漏洞分析精要》
https://ibotpeaches.github.io/Apktool/
https://ibotpeaches.github.io/Apktool/documentation/
https://github.com/JesusFreke/smali/wiki/smalidea
http://blog.csdn.net/linchaolong/article/details/51146492
http://blog.csdn.net/justfwd/article/details/52461188
Android APK程序的smali动态调试的更多相关文章
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
- apk逆向 - smali动态调试
author: Dlive date: 2016/10/6 0x00 前言 之前有人问过smali的动态调试方法,其实网上已经有很多文章讲这些内容,但是为了方便大家学习,我还是写一下让大家少走点坑 ...
- Android应用程序用真机调试步骤
仅供参考: 1.开启调试模式 2.安装 Adb.exe 将platform-tools文件夹里面adb.exe AdbWinApi.dll AdbWinUsbApi.dll拷贝到tools ...
- Android apk程序调用其它的APK程序
Intent mIntent = new Intent(); ComponentName comp = new ComponentName("启动的APK包名","启动的 ...
- [Android]APK程序卸载二次确认的实现
严正声明 本人本着技术开放,思想分享的目的,撰写本文.文章仅供参考之用,请勿使之于非法或有害于社会和谐之用. Sodino 2011-01-24 Android上能不能实现卸载时提示呢, ...
- android apk程序升级
1 .设置apk版本号 Androidmanifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/ ...
- Android Studio 动态调试 apk 反编译出的 smali 代码
在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...
- Android动态调试so库JNI_Onload函数-----基于IDA实现
之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...
- 开启Android Apk调试与备份选项的Xposed模块的编写
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80963610 在进行Android应用程序逆向分析的时候,经常需要进行Andro ...
随机推荐
- pytorch(14)权值初始化
权值的方差过大导致梯度爆炸的原因 方差一致性原则分析Xavier方法与Kaiming初始化方法 饱和激活函数tanh,非饱和激活函数relu pytorch提供的十种初始化方法 梯度消失与爆炸 \[H ...
- Linux:使用systemd管理进程
Blog:博客园 个人 概述 systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能 ...
- 2020年12月-第01阶段-前端基础-HTML常用标签
1. HTML常用标签 首先 HTML和CSS是两种完全不同的语言,我们学的是结构,就只写HTML标签,认识标签就可以了. 不会再给结构标签指定样式了. HTML标签有很多,这里我们学习最为常用的,后 ...
- 漏洞复现-CVE-2018-15473-ssh用户枚举漏洞
0x00 实验环境 攻击机:Win 10 0x01 影响版本 OpenSSH 7.7前存在一个用户名枚举漏洞,通过该漏洞,攻击者可以判断某个用户名是否存在于目标主机 0x02 漏洞复现 针 ...
- C# 基础 - Enum 的一些操作
1. int 转换成 enum public enum Suit { Spades, Hearts, Clubs, Diamonds } Suit spades = (Suit)0; Suit hea ...
- 用水浒传来学习OKR
用水浒传来学习OKR 目录 用水浒传来学习OKR 0x00 摘要 0x01 OKR 1.1 基本概念 1.2 OKR管理的意义 1.3 Objective 1.3.1 什么是好的O 1.3.2 上下级 ...
- AmazonS3 使用AWS SDK for Java实现跨源资源共享 (CORS)
CORS 配置 创建 CORS 配置并对存储桶设置该配置 通过添加规则来检索并修改配置 向存储桶添加修改过的配置 删除配置 import com.amazonaws.AmazonServiceExce ...
- P1055_ISBN号码(JAVA语言)
题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符, 其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号), 最后一位是 ...
- 攻防世界 reverse Mysterious
Mysterious BUUCTF-2019 int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4) { char v5; // [e ...
- 当红开发语言Go,真的是未来的技术主流吗?
摘要:文将详细介绍 Golang 的语言特点以及它的优缺点和适用场景,带着上述几个疑问,为读者分析 Go 语言的各个方面,以帮助初入 IT 行业的程序员以及对 Go 感兴趣的开发者进一步了解这个热门语 ...