吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16920|回复: 65
上一主题 下一主题
收起左侧

[Android 原创] 蓝猫tv----初识android应用反编

  [复制链接]
跳转到指定楼层
楼主
tp_soon 发表于 2017-3-18 13:05 回帖奖励
本帖最后由 tp_soon 于 2017-3-18 14:36 编辑

Apk的反编译仅作学习借鉴,提升自身能力,不为任何不法企图之用!

工欲善其事,必先利其器
apk反编 一般需要用到3个工具
1,apktool
2,dex2jar
3,jd-gui

以下一一做介绍。  


  • apktool
反编命令 apktool d xxx.apk

反编成功会生成对应的xxx文件夹,文件夹包含包含整个apk的目录结构如图,

反编后可以得到此apk的配置文件AndroidManifest.xml 其中可以查看对应包名activity名字,注册的service receiver 开启的权限。此apk的各个入口一览无余。还可以得到对应的图片资源,音视频资源,和编译好的代码格式为smali。可以直接文本编辑器查看,如果你看得懂的话。 打包命令 apktool b xxxxxx为反编后对应的文件夹名字.若打包成功,会在对应的xxx/dist 目录下生成对应的apk。此apk没有签名。需要签名下。关于签名的内容,后续再单独总结。 以上步骤已可以简单的对apk进行一定的修改了。比如替换对应的图片资源,更改入口,去掉更改launcher图标,修改apk名字,替换音视频文件。甚至能简单的修改smali 改变apk运行逻辑。例:AndroidManifest.xml中去掉源apk的<categoryandroid:name="android.intent.category.LAUNCHER"/> 可隐藏launcher中的icon 在apktool文件夹中,有一apktool.jar 这个是有对应版本的。目前最新的为apktool_2.1.1.jar。使用此jar基本可以应付绝大多数apk。若存在个别apk无法使用apktool_2.1.1.jar进行反编,可以考虑尝试使用其他版本。切换不同apktool.jar版本,需要清空 C:\Documents and Settings\Administrator\apktool\framework 目录。此目录为执行apktool后,把对应的framework写到此目录。有特殊定制过的framework的apk,如华为,小米,或者其他手机中的apk,需要对应的framework.apk。

2,dex2jar此工具是将apk中的dex 转成jar。右击解压
xxx.apk 导出其中的 classes.dex 文件

执行命令d2j-dex2jar.bat classes.dex 将会生成classes-dex2jar.jar

生成了classes-dex2jar.jar我们可以直接用解压工具打开查看下生成的jar文件。

Smali代码已经变成了java文件编译后的class了。对于混淆过的java文件,文件夹,变量,方法都会变成 a b c d 增加了阅读的复杂度。  

3,jd-gui打开jd-gui.exe  选取第二步中刚生成的classes-dex2jar.jar即可以java文件的方式查看全部源代码。

选择file-save all sources即可保存为全部java文件。 对于混淆过的java文件,文件夹,变量,方法都会变成 a b c d 增加了阅读的复杂度。



  纸上得来终觉浅,绝知此事要躬行

最近迷上了国民老公的直播平台,就拿熊猫tv来练手了。二话不说直接反编了。apktool d pandatv.apk。

先看下反编之后我们得到了什么



  • assets 各种资源文件视频,音频,字体,动画

  • lib 库文件 .so .a等

  • original 签名文件

  • res资源,图片,布局,字串等具有id值资源

  • smali java代码在Android 的 Dalvik 虚拟机所使用的一种 dex 格式的中间语言。

  • unknown 其他的一些资源

  • AndroidManifest.xml android的配置文件
我们先尝试修改下logo和点击进入的第一张加载页,在目录pandatv\res\drawable-xhdpi-v4找到了对应的资源文件。
换成
打开pandatv\res\values\strings.xml把"熊猫直播"改成<string name="app_name">蓝猫直播</string>修改资源的同时我们发现了熊猫tv的默认语言就是中文,并没有做完整的翻译。看来对国外用户并不特别友好 改好之后执行apktool b pandatv

打包成功,会在pandatv目录下生成dist/pandatv.apk。直接安装到手机 adb install pandatv.apk

提示未签名的apk。这时我们就要先去生成我们需要的签名文件。在android编译环境的alps目录下执行development/tools/make_key testkey '/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'上述是android的原始签名。这里我只想标注国家,名字和邮件,并且签名文件叫做bluepandakey所以执行development/tools/make_key bluepandakey '/C=CN/CN=bluepanda/emailAddress=bluepanda@bluepanda.com'

提示输入密码执行回车,表示密码为空。成功执行会在alps目录下生成 bluepandakey.pk8 bluepandakey.x509.pem这2个文件就是我们要的签名文件.再从编译好的目录下获取signapk.jar。alps\out\host\linux-x86\framework\signapk.jar将上述几个文件放置同一个文件夹目录下

执行java -jar signapk.jar bluepandakey.x509.pem bluepandakey.pk8 pandatv.apk pandatvsign.apk就可以获得到签名好的pandatvsign.apk 尝试执行命令查看下签名是否正确jarsigner -verify -verbose -certs pandatvsign.apk>signinfo.txt

再次安装签名好的pandatvsign.apkadb install pandatvsign.apk成功! Ps:若手机中已有原始的pandatv,则安装会提示INSTALL_FAILED_UPDATE_INCOMPATIBLE。是因为包名一样,但是我们把签名改了,导致无法正确安装。可以卸载原始的android版本,或者在androidmanifest.xml中修改包名。

接下来就是见证奇迹的时刻了




欲穷千里目,更上一层楼


接下来我打算尝试读懂一些代码,打开熊猫tv,随便找个直播,点击送礼物。可恶,居然提示没有登录

我这都要破解你了,还需要登录?先去string.xml中搜下请先登录。<string name="live_notify_please_login">请先登录</string><string name="login_first">请先登录</string>有2个字段对应这个翻译。在public.xml 查找到对应的字段id,分别是0x7f0700bc 0x7f0700c7。再去smali中一搜。几十项。我这暴脾气,还是先放弃走字串这条路了。找下那个礼物盒子的图标好了input_icon_gif_normal.png id是 7f0201e7Smali搜下居然没有。在xml文件中搜下终于有了。原来input_icon_gif.xml 中加载了礼物盒子图片input_icon_gif_normal,并且处理了按下和正常情况下显示不同的图片。找到加载input_icon_gif.xml的布局Layout_full_control.xml。得到其中input_icon_gif.xml的id为button_full_control_gift 值是0x7f0e0270。最终在smali中搜0x7f0e0270得到位置smali\com\panda\videoliveplatform\view\layout\LiveRoomFullControlLayout.smali大约699行

看不懂smali没关系,结合几个关键字猜一下。这是通过0x7f0e0270 获取到input_icon_gif这个vew。然后添加onclick点击事件。并且onclick的事件看来是用内部类写的。在com/panda/videoliveplatform/view/layout/LiveRoomFullControlLayout$5.smali的 onClick方法中。这下没有什么smali基础那是真看不懂了。我们考虑着在这个地方加点log。我先在自己熟悉的程序中包装一个输出log的代码比如

把自己的程序反编。看到对应的smali代码如下

调用

依葫芦画瓢,我们把这个代码片段,加到了LiveRoomFullControlLayout$5.smali的 onClick方法中。打包,签名,安装,打开熊猫,抓取log。不幸的是,点击礼物图标就熊猫tv就崩溃了。查看log提示Verification failed on class com.panda.videoliveplatform.view.layout.LiveRoomFullControlLayout$5 in /data/app/com.panda.videoliveplatform-2/base.apk because: Verifier rejected class com.panda.videoliveplatform.view.layout.LiveRoomFullControlLayout$5 due to bad method void com.panda.videoliveplatform.view.layout.LiveRoomFullControlLayout$5.onClick(android.view.View)重新检查了2遍LiveRoomFullControlLayout$5.smali。应该是调用的类要修改invoke-direct {p0}, Lcom/freecom/proxyhost/FragmentDetail;->showStack()V改成invoke-direct {p0}, Lcom/panda/videoliveplatform/view/layout/LiveRoomFullControlLayout$5;->showStack()V再次验证成功。重复上面的步骤整理出各种需要的log类型。



接下来考虑到,如果需要在不同的地方添加不同的log,都需要去添加这么多的代码段,并修改调用的对象,岂不是非常繁琐和麻烦。这种果断应该抽象成工具。于是将所有log输出打包整理成一个文件crack.smali并放置于smali根目录。

那么后续所有需要调用log输出的地方仅需要简单的调用invoke-static {v1}, Lcrack;->log1(Ljava/lang/String;)Vinvoke-static {v0}, Lcrack;->I(I)Vinvoke-static {v0,v1}, Lcrack;->J(J)Vinvoke-static {}, Lcrack;->showStack()V等。在注入了log之后,终于弄清楚了点击调用的逻辑。先判断是否登录,若没有登录,则弹出提示,否则将会展示所有的礼物内容。

并且这段代码中走进判断的流程有字段0x7f0700bc,反查下就是<public type="string" name="live_notify_please_login" id="0x7f0700bc" /><string name="live_notify_please_login">请先登录</string>证实了我们的想法。果断把if nez改成了 if eqz 。成功跳过了登录要求的判断。

大功告成!   


温故而知新,可以为师矣

Apk的破解过程


上面我们对熊猫tv进行了破解,更换了主界面的图标,更换了加载界面。意味着界面,资源类的全部替换一遍只是时间问题了。接着我们尝试在感兴趣的代码段中添加log,可以打出各种变量值,甚至是调用的堆栈。并且把打log的注入整合成了工具。可以轻易移植到任意其他要破解的项目中。在看懂了部分代码之后,我们尝试改变了其中一个判断的逻辑,改变了代码执行的流程。实现了最简单的注入破解。 在apk破解的过程中总会遇到各种各样的问题,apk被加固了。中间代码混淆过了,全是abcd难以理解。注入代码不完善引发了其他bug。签名校验等等。随便一个问题都可以单独开一个课题深入讨论。而对于我们而言,在遇到困难时应该冷静对待,耐心寻找突破口。在我们开发应用的时候,也需要重视起来代码的安全防护,防止被人轻易破解,二次打包。

最后再次重申,破解应用只是为了研究学习,提高安全意识。

点评

不错。写得很详细!我都不敢写APP了这样。。。  发表于 2017-3-20 17:03
哈哈,楼主好可爱: “我这都要破解你了,还需要登录?”  发表于 2017-3-20 01:58

免费评分

参与人数 23吾爱币 +34 热心值 +22 收起 理由
青白Pallor + 1 + 1 用心讨论,共获提升!
842035019 + 1 + 1 用心讨论,共获提升!
pojiekris + 1 + 1 谢谢@Thanks!
YYL7535 + 1 + 1 谢谢@Thanks!
霖° + 1 + 1 热心回复!
clwh2006 + 1 + 1 谢谢@Thanks!
moohan + 1 + 1 用心讨论,共获提升!
860384505 + 1 + 1 我很赞同!
qaz003 + 1 谢谢@Thanks!
dadao815 + 1 + 1 谢谢@Thanks!
wbyzzz + 1 + 1 用心讨论,共获提升!
qtfreet00 + 12 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
a5606495 + 1 + 1 热心回复!
明月相照 + 1 + 1 谢谢@Thanks!
fengshu + 1 + 1 热心回复!
biscuitlx + 1 + 1 热心回复!
抢地主 + 1 用心讨论,共获提升!
jackl10010 + 1 + 1 我很赞同!
linso + 2 + 1 收好
532学习研究会所 + 1 已收藏,蟹蟹
查理大弟 + 1 + 1 学习了
青霄 + 2 + 1 谢谢@Thanks!
de星 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| tp_soon 发表于 2017-3-20 22:35 |楼主
caddy 发表于 2017-3-20 09:30
送礼物都是服务端判断的,客户端改了也没啥用吧

是的,理论上后台对前台都是不信任的,所以后台做得完善,前台处理了也很难欺骗到后台。
这篇主要还是讲一些基础的操作,和其中的一些技巧,思路。
比如定位代码,注入log,抽象一些常用工具类等。
推荐
 楼主| tp_soon 发表于 2017-6-6 10:48 |楼主
wanggggg1 发表于 2017-6-1 22:56
我有个直播软件需要开机启动,能帮我改一下吗?

开机启动可以监听个boot complete的广播。 但是必须用户有启动过。或者考虑和其他apk绑定去拉活。
沙发
netle8 发表于 2017-3-18 13:17
3#
路过的风 发表于 2017-3-18 13:19
教程是不是转载的呢?
4#
楚轩 发表于 2017-3-18 13:21
本帖最后由 楚轩 于 2017-3-18 13:22 编辑

复制粘贴不行,请上传原图
5#
天秤男 发表于 2017-3-18 13:21
图片全死
6#
caizzx 发表于 2017-3-18 13:22
图片没了0.0.
7#
 楼主| tp_soon 发表于 2017-3-18 13:39 |楼主
netle8 发表于 2017-3-18 13:17
教程不错,可惜图全挂了

哈哈哈,我是新人,看样子还不能上传图片呢,有没管理员能帮忙处理下的?
8#
zqguang3708 发表于 2017-3-18 13:56
图片看不到哎
9#
 楼主| tp_soon 发表于 2017-3-18 14:28 |楼主
楚轩 发表于 2017-3-18 13:21
复制粘贴不行,请上传原图

请教下该如何插入图片?编辑了,点图片没有可选本地的按钮,选择网络图片,试了看上去还是没能正确显示。
10#
roinlong 发表于 2017-3-18 15:18
小白还是看不懂这个,得慢慢来了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表