• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • 办公软件
  • 多媒体
  • 图形图像
  • 系统工具
  • 安全杀毒
  • 聊天工具
  • 电脑学习
  • 应用软件
  • 网络软件
  • 课件工具
  • 浏览器
  • 手机软件
您的位置:首页 > 软件教程 >手机软件 > Android apk反编译基础(apktoos)图文教程

Android apk反编译基础(apktoos)图文教程

作者:佚名 字体:[增加 减小] 来源:互联网

本文主要包含apk,反编译,apktoos等软件教程,佚名希望在学习及工作中可以帮助到您

很久有写过一个广工图书馆主页一个类爬虫的demo(因为没接口,只能扒取静态网页),实现一些图书馆系统的一些功能。但最近发现图书馆系统在html页面上做了手脚,一页html页面中嵌入了几千行的注释,并有了自己的App,应该是为了增加扒取的流量成本来防止别人去扒取网页,不过加注释这手段就不敢恭维了,内网访问速度还行,但外网访问的话体验很差的。 

 如下图:一堆注释,导致一个网页要2MB 

dfe4342t5h5e6uw23t

 

主页上的APP,必然是用了图书馆的后台接口和服务器交互的,从而想试试用反编译的手段来看看APP使用了什么接口。(另外更简单可以通过tcpdump来给Android手机抓包分析其接口,再用Wireshark来分析tcp包,不过你想要知道全部接口的话,可能需要一个个接口去调用,会比较麻烦,采用反编译,可能集中在一个类中找到这些接口)。

 

首先要准备的工具:(了解更多反编译工具可以去看雪论坛下载或者学习-Link)

APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境。可以对APK进行反编译,使用它可以将其反编译成非常接近打包前的原始格式。逆向AndroidManifest.xml、资源文件 resources.arsc以及将dex文件反编译成可以调试的smali文件。修改后,可以将其编译回apk文件。APKTool也可以用来汉化Android软件然后重新打包发布。 
官方:http://code.google.com/p/android-apktool/
 

解压缩APKTool,并把要反编译的APK放入目录中

   

反编译:

通过CMD进入上面的目录,执行命令: apktool decode ZhaoBenShu.apk outdir  

稍等片刻完成反编译,反编译后的文件会在outdir目录下。

    

 

    ---outdir目录结构

    

res :资源文件,跟adnroid工程目录下的res基本一样,各种UI图片  XML布局文件  values xml文件(多了一个public.xml,有各个资源的id号(R.java中的id))
smail:这个是重点文件夹,里面都是smail格式文件,是Dalvik虚拟机执行的操作码(Dalvik opcodes),这些操作吗有自己的语法,如果有学过JNI的话, 这些语法还是比较容易看懂和理解的。AndroidManifest.xml:Android工程下的AndroidManifest.xml
apktool.yml:用于重打包。

 

smail语法:(全部语法请link)

smail中的数据类型签名跟java中的是一样的,如下。

 

B---byteC---charD---doubleF---floatI---intJ---longS---shortV---voidZ---boolean[XXX---arrayLxxx/yyy---object

 

    smail代码例子:

        

 初看smail文件,可能会觉得有一些凌乱。不过只要把几种语法弄懂了,就可以很好地阅读smail文件。
 smail比较常用语法 ( 非全部)分为: 赋值,取值,函数调用,if语句,返回值等。

赋值取值:


例子:
 iget-object v6, p0, Lcom/zbsh/code/clas/ClassSystem$9;->val$vBarCodes:Ljava/util/ArrayList;

分析:

iget个取值操作,i=instance,是用来instance filed(实例变量),object是类的意思。 v6是本地寄存器,p0在这里是代表this(在非static函数正代表this,在static函数中代表第一个参数)。Lcom/zbsh/code/clas/ClassSystem是表示包路径为 Lcom/zbsh/code/clas下的ClassSystem类,->相当于C/C++的箭头操作符,后面是类中的变量或者方法vBarCodes是ClassSystem中的一个变量,Ljava/util/ArrayList是vBarCodes这个变量的类型 (是java中类的签名)

作用:

把ClassSystem中vBarCodes的值存放在寄存器v6中,vBarCodes的类型必须是对象,且是实例变量非静态变量。
其中object可以是替换成基本数据类型:iget-boolean   iget-byte  iget-char   iget-short等等。

同样的:

sget- [type]用来获取static变量。(少了一个p0,因为静态变量是没有this的)

aget-[type]用来获取array类型。

[x]get vx, vy,把寄存器vy中的值赋给vx。

赋值:

同样都有以下几种:
iput-[type]
sput-[type]
aput-[type]

也支持寄存器和寄存器之间的赋值,寄存器和变量之间的赋值。

函数调用
:
 invoke-direct 调用private函数
invoke-super 调用父类函数
invoke-static 调用静态函数
invoke-virtual 用于调用protected或public函数(相当于C++的虚函数,java的重载函数,只有protect和public能够重载)
还有一种比较特殊的:invoke-xxxxx/range:参数多于5个的时候,要加/rang


 例子:

invoke-virtual {v4, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

 v4是this,代表 Ljava/lang/String的一个实例,v1是函数的第一个参数,在这里是调用放在V4寄存器中类型为Ljava/lang/String的实例的equal ()方法,并传入参数v1,返回的结果是Z类型,也就是boolean类型。

如果是invoke-static{v4, v1}, 不同遇在于invoke-virtual {v4, v1}的是v4不是this,而是第一个参数。v1是第二个参数,所调用的方法需要两个参数。

 

返回值:

获取返回值:

move-result vx :把上一个方法返回的值,存在寄存器 vx中。

返回返回值:

return-void   没返回。
return vx       返回寄存器中vx的值  。

 

if语句:

if-eq vx,vy,target:eq:equal  如果vx==xy 跳转到target目标代码,否则执行顺序执行下一句代码
if-ne vx,vy,target:nq :not equal  如果vx!=xy 跳转到target目标代码,否则执行顺序执行下一句代码       
if-eqz vx,target:eqz : equal zero  如果vx==0 跳转到target目标代码,否则执行顺序执行下一句代码     
if-nez vx,target:nez :not equal zero   如果vx!=0 跳转到target目标代码,否则执行顺序执行下一句代码    

读smail,找接口:
   

以搜索接口为例子:
根据文件命名找到GropZbshFind.smali这个文件,应该就是搜索Activity。

在其中有一段代码:


.parameter "savedInstanceState"</font></p> <p><font face="Courier New"> .prologue
.line 13
invoke-super {p0, p1}, Lcom/zbsh/code/thrd/GroupActivity;->onCreate(Landroid/os/Bundle;)V</font></p> <p><font face="Courier New"> .line 14
const-class v0, Lcom/zbsh/code/ZbshFindMain;</font></p> <p><font face="Courier New"> invoke-virtual {v0}, Ljava/lang/Class;->getName()Ljava/lang/String;</font></p> <p><font face="Courier New"> move-result-object v0</font></p> <p><font face="Courier New"> new-instance v1, Landroid/content/Intent;</font></p> <p><font face="Courier New"> const-class v2, Lcom/zbsh/code/ZbshFindMain;</font></p> <p><font face="Courier New"> i

您可能想查找下面的文章:

  • xapk格式文件怎么安装到手机 xapk安装详细教程
  • 靠谱助手安装失败怎么办?靠谱助手安装apk失败、应用安装失败的解决方法介绍
  • 如何提取已安装的应用包 R.E管理器提取已安装apk包图文教程
  • 360手机助手上传APK安装包与手机截图教程步骤图解
  • Android apk反编译基础(apktoos)图文教程

相关文章

  • 支付宝AA收款只能收取等额的钱吗 支付宝aa收款功能详解
  • 木瓜金融app怎么实名认证呢?
  • 陌陌app怎么推荐喜欢的时刻?
  • 秀色秀场app怎么加入护卫队?
  • William Chen手把手教你给APP配种 APPmixer配种视频教程
  • 支付宝app怎么使用成都智慧医保看病?
  • 天天相册怎么修图?天天相册剪裁图片大小的教程
  • 支付宝的声波支付功能怎么用 支付宝钱包声波支付怎么付款
  • 猎豹1元神器是什么?猎豹1元神器功能是什么?
  • 微店买家版怎么收藏自己喜欢的店铺?

文章分类

  • 办公软件
  • 多媒体
  • 图形图像
  • 系统工具
  • 安全杀毒
  • 聊天工具
  • 电脑学习
  • 应用软件
  • 网络软件
  • 课件工具
  • 浏览器
  • 手机软件

最近更新的内容

    • 一拍直播怎么样好不好?微信朋友圈直播神器一拍直播使用图文教程
    • 美柚4.0蜜友圈专属社区功能上线:让女生想说就说
    • 智联招聘app怎么拉黑公司? 智联招聘将公司加入黑名单的教程
    • 爱思助手怎么获取iPhone开机密码
    • 百度视频手机版怎么缓存视频?百度视频app离线缓存视频的方法介绍
    • 支付宝彩票在哪里签到?
    • 快看漫画app缓存该怎么一键清除?
    • 触漫app怎么招募人员?
    • 支付宝怎么获得绿色能量 支付宝蚂蚁森林收集绿色能量方法
    • 百度云怎么设置密码?手机百度云密码锁设置方法介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有