Android反编译实践

1分钟速览,使用apktool反编译涉及的命令如下:

# 查看原APK签名信息
keytool -printcert -file STARTCOR.RSA 
# 反编译
./apktool d fileName.apk
# 重打包
./apktool b filePath
# 生成keystore签名文件
keytool -genkey -alias ziv.keystore -keyalg RSA -validity 20000 -keystore ziv.keystore
# 签名重打包后的apk
jarsigner -verbose -keystore ziv.keystore -signedjar fileName_signed.apk fileName.apk ziv.keystore

需要注意的是,生成keystore文件时输入的密码一定要牢记,在后续签名apk的时候需要使用

--------------------------------------------------速览结束--------------------------------------------------

前期准备

工具下载

apltool https://ibotpeaches.github.io/Apktool/install/
dex2jar https://sourceforge.net/projects/dex2jar/
jd-gui http://jd.benow.ca/

Smali基础

简单快速入门

  1. 数据类型
Java Smali
void V
boolean Z
byte B
short S
char C
int I
long J
float F
double D
对象 L
数组 [
  1. 语法
语法 含义
.field 定义变量
.method 方法
.parameter 方法参数
.prologue 方法开始
.line 12 此方法位于第12行
invoke-super 调用父函数
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
  1. 跳转语句
跳转语句 含义
if-eq vA, vB, :cond_n 如果vA等于vB则跳转到:cond_n
if-ne vA, vB, :cond_n 如果vA不等于vB则跳转到:cond_n
if-lt vA, vB, :cond_n 如果vA小于vB则跳转到:cond_n
if-ge vA, vB, :cond_n 如果vA大于等于vB则跳转到:cond_n
if-gt vA, vB, :cond_n 如果vA大于vB则跳转到:cond_n
if-le vA, vB, :cond_n 如果vA小于等于vB则跳转到:cond_n
if-eqz vA, :cond_n 如果vA等于0则跳转到:cond_n
if-nez vA, :cond_n 如果vA不等于0则跳转到:cond_n
if-ltz vA, :cond_n 如果vA小于0则跳转到:cond_n
if-gez vA, :cond_n 如果vA大于等于0则跳转到:cond_n
if-gtz vA, :cond_n 如果vA大于0则跳转到:cond_n
if-lez vA, :cond_n 如果vA小于等于0则跳转到:cond_n

详细Smali相关在单独章节介绍

Apk文件初体验

简单的以压缩文件的形式解压得到如下文件信息:

  1. AndroidManifest.xml:应用的全局配置文件
  2. assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等。
  3. classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。
  4. lib文件夹:引用的第三方sdk的so文件。
  5. META-INF文件夹:Apk签名文件。
  6. res文件夹:资源文件,包括了布局、图片等等。
  7. resources.arsc:记录资源文件和资源id的映射关系。

实现步骤

反编译apk

使用java -jar ../../apltool/apktool.jar d Demo.apk得到反编译后的smali文件
其他参数信息

-f 如果目标文件夹已存在,强制删除现有文件夹
-o 指定反编译的目标文件夹的名称(默认会将文件输出到以Apk文件名命名的文件夹中)
-s 保留classes.dex文件(默认会将dex文件解码成smali文件)
-r 保留resources.arsc文件(默认会将resources.arsc解码成具体的资源文件)

如:java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s
错误信息brut.android.UndefinedResObject表示当前apktool.jar版本太低

将dex文件转为jar文件

使用dex2jar工具
d2j-dex2jar classes.dex

使用enjarify工具
https://github.com/Storyyeller/enjarify

查看jar文件

下载好对应平台的jd-gui运行,File->Open或直接拖动相应的jar文件在窗口内即可查看

定位关键信息修改Smali文件

奇技淫巧

  1. 根据string信息
  2. 根据反编译后的jar文件确定想要找的信息
  3. 根据AndroidManifest.xml和res信息

重编译apk

java -jar ../../apltool/apktool.jar b -f Demo/

重编译后的Apk是没有签名信息的,安装时会提示失败,错误信息Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

签名安装

生成签名文件

keytool -genkey -alias demo.keystore -keyalg RSA -validity 20000 -keystore demo.keystore

签名Apk

jarsigner -verbose -keystore ziv.keystore -signedjar Demo_resign.apk -digestalg SHA1 -sigalg MD5withRSA Demo.apk ziv.keystore
adb install -r Demo_resign.apk

jarsigner参数解释

$jarsigner -h
用法:jarsigner [选项] jar 文件别名(key的别名)
       jarsigner -verify [选项] jar 文件
[-keystore <url>]           密钥库位置
[-storepass <口令>]         用于密钥库完整性的口令
[-storetype <类型>]         密钥库类型
[-keypass <口令>]           专用密钥的口令(如果不同)
[-sigfile <文件>]           .SF/.DSA 文件的名称
[-signedjar <文件>]         已签名的 JAR 文件的名称
[-digestalg <算法>]         摘要算法的名称
[-sigalg <算法>]            签名算法的名称
[-verify]                   验证已签名的 JAR 文件
[-verbose]                  签名/验证时输出详细信息
[-certs]                    输出详细信息和验证时显示证书
[-tsa <url>]                时间戳机构的位置
[-tsacert <别名>]           时间戳机构的公共密钥证书
[-altsigner <类>]           替代的签名机制的类名
[-altsignerpath <路径列表>] 替代的签名机制的位置
[-internalsf]               在签名块内包含 .SF 文件
[-sectionsonly]             不计算整个清单的散列
[-protected]                密钥库已保护验证路径
[-providerName <名称>]      提供者名称
[-providerClass <类>        加密服务提供者的名称
[-providerArg <参数>]] ...  主类文件和构造函数参数

应用实例

  1. 学习
    检查自己的代码漏洞,应用安全方向的使用

  2. 个性化
    比如修改应用显示的名字,图标等信息。
    文字信息修改文件\res\values\string.xml
    图片资源在\res\bitmap\res\mipmap目录下

  3. 汉化
    -->简单汉化:在res目录下创建values-zh-rCN文件夹新建string.xml文件,对应翻译所有原本res\values\string.xml文件中的内容即可
    -->高级汉化:当字符内容在代码中的时需要修改定位到的.smali文件。
    如:const-string v5, "ServiceMode"不能直接替换ServiceMode为服务模式,需要替换为对应中文的16进制unicode表示,即const-string v5, "\u670d\u52a1\u6a21\u5f0f"
    在线转换工具

  4. 去广告
    为什么有广告…这个原因太多,也不好说广告到底是好是坏…在此仅为技术分享,不涉及利益。
    一般广告的控件com.xxx.AdView是以该标识表示,关键信息的定位在这里就显得尤为重要,将这部分信息修改设置为

android:layout_width="0.0dip"
android:layout_height="0.0dip"
android:background="#ff000000"

代表含义是,设置空间大小为0*0,背景透明

拓展

他山之石,可以攻玉

ClassyShark

Google出品ClassyShark
GitHub:https://github.com/google/android-classyshark
使用java -jar ClassyShark.jar运行后直接打开你想查看的apk文件即可

APKParser

运行在Android移动端的分析工具APKParser
GitHub:https://github.com/jaredrummler/APKParser

ApkParser
ApkParser

other

更多工具及使用可以参考http://www.androiddevtools.cn/

error

安装出错INSTALL_FAILED_UPDATE_INCOMPATIBLE,安装包签名不一致导致

  1. adb uninstall 包名
  2. 删掉data/data/包名
  3. /data/system/packages.xml文件中删除该应用包含的包名信息
  4. 重新挂载mount -o remount,rw /system
  5. 添加权限chmod 777 /system

参考文件
https://ibotpeaches.github.io/Apktool/documentation/
https://www.cnblogs.com/cuiyubo/p/6721397.html
https://blog.csdn.net/wh_19910525/article/details/7915738/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容