一、前言:

大家好,今天给大家分享一下Android中的拿来主 义,我们时常会碰到一个自己觉得很漂亮很帅气的应用(apk),所以我们会尝试用WinRAR等之类工具查看,而一般的应用程序打包后的目录通常是这样的 如下图:

当然res里的图片是可以拿来就用的(笔者的好多应用的图片都是从别人的apk里扣出来的),而诸如layout里的布局及权限文件 (AndroidManifest.xml)已经是一堆乱码了,完全看不懂,想看看别人是怎么布局的都不容易。还有源代码都被编译成了 classes.dex,完全看不出什么线索。基于以上的困惑,笔者给大家分享一下Android中的拿来主义。

二、所需工具(点击各自连接进入下载页面):

1.AXMLPrinter2.jar

2.baksmali.jar

3.smali.jar

三、准备工作

为了方便起见,作者把AXMLPrinter2.jar, 还有baksmali.jar,还有smali.jar(下下来为了方便重命名),放在Android SDK tools文件夹中如下图所示:

为了便于大家更容易程序比对,作者写了一个简单的应用(叫APKInstaller)目录结构如下图所示:

四、开始拿来主义

1.用 AXMLPrinter2.jar查看apk中的布局xml文件:

将ApkInstaller应用生成的ApkInstaller.apk(为了方便起见放到tools目录里)用WinRAR等 工具打开,将res/layout/main.xml解压出来(也还是放在tools目录里哦)

打开main.xml文件,内容如下(一堆天文):

这时候AXMLPrinter2.jar派上用场了,打开cmd终端,一直进入到tools目录下,输入如下命令:

java -jar AXMLPrinter2.jar main.xml > main.txt.  (如下图所示)

打开main.txt代码如下(是不是有个123了呵呵~):

[java] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="1"
  5. android:layout_width="-1"
  6. android:layout_height="-1"
  7. >
  8. <WebView
  9. android:id="@7F050000"
  10. android:layout_width="-1"
  11. android:layout_height="-2"
  12. >
  13. </WebView>
  14. </LinearLayout>

为了比对打开源程序中的main.xml代码如下(大家比对一下吧):

[java] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <WebView
  8. android:id="@+id/apk_web"
  9. android:layout_height="wrap_content"
  10. android:layout_width="fill_parent"
  11. />
  12. </LinearLayout>

2.用baksmali.jar反编译classes.dex:

将ApkInstaller.apk里的classes.dex解压到tools目录里,然后baksmali.jar就派上用场了,在cmd命令行里输入如下命令:

java -jar baksmali.jar -o classout/ classes.dex .(如下图所示:)

你将会发现在tools里多一个classout文件夹里面(我代码的包目录结构清晰可见呀),如下图所示:

从上面看出除了Android本身资源的类R开头的,我的源程序里只有一个ApkInstaller.java,完全吻合,真TMD的猥琐呵呵~

下面我们看一下ApkInstaller.smali内容是什么,如以下代码:

[java] view plaincopy

  1. .class public Lcom/tutor/apkinstaller/ApkInstaller;
  2. .super Landroid/app/Activity;
  3. .source "ApkInstaller.java"
  4. # instance fields
  5. .field private apkWeb:Landroid/webkit/WebView;
  6. # direct methods
  7. .method public constructor <init>()V
  8. .registers 1
  9. .prologue
  10. .line 8
  11. invoke-direct {p0}, Landroid/app/Activity;-><init>()V
  12. return-void
  13. .end method
  14. # virtual methods
  15. .method public onCreate(Landroid/os/Bundle;)V
  16. .registers 5
  17. .parameter "savedInstanceState"
  18. .prologue
  19. .line 13
  20. invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
  21. .line 14
  22. const/high16 v2, 0x7f03
  23. invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->setContentView(I)V
  24. .line 15
  25. const/high16 v2, 0x7f05
  26. invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->findViewById(I)Landroid/view/View;
  27. move-result-object v2
  28. check-cast v2, Landroid/webkit/WebView;
  29. iput-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;
  30. .line 16
  31. iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;
  32. invoke-virtual {v2}, Landroid/webkit/WebView;->getSettings()Landroid/webkit/WebSettings;
  33. move-result-object v1
  34. .line 17
  35. .local v1, webSettings:Landroid/webkit/WebSettings;
  36. const/4 v2, 0x1
  37. invoke-virtual {v1, v2}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V
  38. .line 19
  39. const-string v0, "http://frankiewei.net/apk/demos/main/index.html#home"
  40. .line 20
  41. .local v0, apkUrl:Ljava/lang/String;
  42. iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;
  43. invoke-virtual {v2, v0}, Landroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V
  44. .line 21
  45. return-void
  46. .end method

同样为了比对我们看一下ApkInstaller.java的源代码如下:

[java] view plaincopy

  1. package com.tutor.apkinstaller;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.webkit.WebSettings;
  5. import android.webkit.WebView;
  6. public class ApkInstaller extends Activity {
  7. private WebView apkWeb;
  8. @Override
  9. public void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. apkWeb = (WebView)findViewById(R.id.apk_web);
  13. WebSettings webSettings = apkWeb.getSettings();
  14. webSettings.setJavaScriptEnabled(true);
  15. String apkUrl = "http://frankiewei.net/apk/demos/main/index.html#home";
  16. apkWeb.loadUrl(apkUrl);
  17. }
  18. }

我相信大家 已经能看出来门道来了吧,hoho~

3.用smali.jar编译classout成classes.dex:

我们上一步已经将classes.dex反编译成了.smali文件,好了,我们看看smali文件看够了,在偿试把它编译成classes.dex吧,

输入如下命令:java -jar smali.jar classout/ -o classes.dex. 如下图所示:

我们可以将新生成的classes.dex塞入ApkInstaller.apk里覆盖原来的classes.dex文件,这样我们的apk还是一样能用的哦~

Ok~今天就暂时写到这里,这片文章真是不容易呀,写了这么长时间,之间还出现过被来自武汉IP的人把这篇文章删除 过,我又重新写了一遍。希望大家多多进步!thx~

Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)!相关推荐

  1. Android中对APK进行反编译

    概述: 其实反编译很简单,只是利用一些工具包和一些基本命令行的命令对apk文件进行反编程,没有什么高深的技术.下面就让我们一起来学习一下反编译的技术. 注:本博客反编译方法,仅供参考学习使用,禁止用于 ...

  2. [Android]转-Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)!

    原文地址 一.前言: 大家好,今天给大家分享一下Android中的拿来主 义,我们时常会碰到一个自己觉得很漂亮很帅气的应用(apk),所以我们会尝试用WinRAR等之类工具查看,而一般的应用程序打包后 ...

  3. Android安全攻防战,反编译与混淆技术完全解析

    之前一直有犹豫过要不要写这篇文章,毕竟去反编译人家的程序并不是什么值得骄傲的事情.不过单纯从技术角度上来讲,掌握反编译功能确实是一项非常有用的技能,可能平常不太会用得到,但是一旦真的需要用到的了,而你 ...

  4. Android TV下LeanbackLauncher的反编译,AS重新打包修改

    本文介绍Android 7.1平台下Google LeanbakLauncher的反编译流程,并使用AS工具重新打包修改. 最近需要开发一款TV桌面应用,调研了各类桌面,如当贝桌面,小米桌面,开源的猫 ...

  5. android 混淆 去掉log,Android去掉/混淆Log,反编译都看不到

    原标题:Android去掉/混淆Log,反编译都看不到 出发点: 当然是由于编程习惯太好,打了一堆中文log,其实只是想给测试看.然而如果包被反编译,看log基本都能理解流程了,有点尴尬.所以此文主要 ...

  6. 教你使用 Reflector中的Reflexil插件反编译.NET,修复Help Viewer v2.0 - Error: .cab未经Microsoft签名

    教你使用 Reflector中的Reflexil插件反编译.NET,修复Help Viewer v2.0 - Error: Cab was not signed 1. 下载.NET Reflecto并 ...

  7. python编译反编译,你不知道的心机与陷阱

    谈到python的文件后缀,说眼花缭乱也不为过.来看看你遇到过哪些类型! .py 如果这个不知道,呵呵-那请出门左拐,你还是充钱那个少年,没有一丝丝改变.接着打游戏去吧- .pyc 这个后缀应该算是除 ...

  8. RK3399 驱动开发 _ 04 - Android系统中通过fdt文件系统反编译查看设备中真实生效的设备树配置信息

    文章目录 前言 一.设备树保存在文件系哪里? 二.文件系统设备树dts编译与反编译 2.1 设备树原始 dtb 格式 2.2 从设备中获取目标文件fdt 2.3 在ubuntu系统中将fdt反编译成d ...

  9. Android:安装包的反编译

    反编译,即从apk安装包还原出Android源码. 本篇内容将使用dex2jar和jd-gui两个工具. (工具可在微信公众号"我有一计"回复"反编译"进行下载 ...

最新文章

  1. JavaScript之各种继承方式和优缺点
  2. 训练softmax分类器实例_第四章.模型训练
  3. SAP OData CSRF token的后台验证源代码
  4. 简单排序算法(Java实现)
  5. android 使用c 代码实现,JNI开发实现helloworld,调用自己的C代码实现(1)
  6. 公司应该如果管理员工?
  7. vs中四点画矩形的算法_中考热点,初高中衔接之倒角利器四点共圆
  8. Python中对列表list进行定义、增删改查、遍历及与元组的对比
  9. chromedriver不在路径的解决办法
  10. 大数据时代已来,开发者该如何出击?
  11. HDU-3337 Guess the number 测试输入数据
  12. 苏宁成立快递员节PK京东封杀快递,谁的做法更聪明?
  13. [通讯方式] 串口通信
  14. 信息安全与密码学概论
  15. 利用计算机技术全面规划供应,‍ ‍ 利用计算机及网络技术,全面规划供应链中的商流、物流、信息流、资金流等,并进行计划、组织、协调与控制。 ‍ ‍...
  16. 微信跳一跳 可以直接更改分数, POST 请求没有校验
  17. New-Age 目录 (2005.03.22/ 整理和使用ShitMp3 修改MP3信息)
  18. python适合做游戏的背景音乐是什么_适合做游戏的背景音乐
  19. 计算机图形学中的光栅化
  20. 如何解决安装Windows 11/Windows 10时找不到磁盘驱动器(找不到驱动器)

热门文章

  1. html5上传视频和预览,HTML5 上传前预览
  2. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】
  3. Java第二次作业第一题
  4. Python3中的yield from语法
  5. Chrome调试模式获取App混合应用H5界面元素
  6. android studio Cmake undefine func
  7. OpenVINO 部署 Mask-RCNN 实例分割
  8. 双十一囤点知识干货!
  9. Science报道新研究:同行评审后的研究仅比预印本研究质量提高4%
  10. ICCV 2019 | 厦大提出快速NAS检索方法,四小时搜索NN结构