android apk反编译到java源码的实现方法

文山蓝栋三七

文山蓝栋三七

2016-02-19 11:19

有一种朋友不在生活里,却在生命力;有一种陪伴不在身边,却在心间。图老师即在大家的生活中又在身边。这么贴心的服务你感受到了吗?话不多说下面就和大家分享android apk反编译到java源码的实现方法吧。

Android由于其代码是放在dalvik虚拟机上的托管代码,所以能够很容易的将其反编译为我们可以识别的代码。

之前我写过一篇文章反编译Android的apk包到smali文件 然后再重新编译签名后打包实现篡改apk的功能。

最近又有一种新的方法来实现直接从Android apk包里的classes.dex文件,把dex码反编译到java的.class二进制码,然后从.class二进制码反编译到java源码想必就不用我来多说了吧。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

首先我们需要的工具是dex2jar和jd-gui

其中第一个工具dex2jar是用来把classex.dex文件也就是dex二进制码转化为java的标准.class二进制码,然后jd-gui是把标准的.class二进制码再反编译为java源码。

首先从apk包里面提取出classes.dex

放到dex2jar目录下

然后在命令行下执行

dex2jar.bat classes.dex

这时执行成功后会生成一个classes.dex.dex2jar.jar文件

这个文件再用jd-gui打开,如下图

几乎跟我自己写的这个程序的源码一样

提供这个反编译方法主要用于大家学习与研究,有问题可以与我邮件讨论。

希望大家不要用这个方法从事恶意的活动,毕竟,别人辛辛苦苦写程序也不容易,用这个方法可以大致的学习到别人写的程序的逻辑,架构,希望对大家有所帮助。

Android 逆向apk程序的心得

本文主要介绍如何逆向一个Android的APK应用程序,本文提供的方法仅供研究学习之用。

本文需要用到的工具有

jdk 这个用于搭建java运行环境

AXMLPrinter2.jar  这个用于逆向.xml文件

baksmali.jar 这个用于逆向classex.dex文件

由于Android的.apk文件实际上就是一个zip文件 可以直接用winrar打开

如下图所示:

用rar打开之后 我们可以看到该文件实际上是一个zip包 里面包含了META-INF文件夹,这个文件夹是用于保存签名文件,确保包的完整性的

res文件夹下就是apk所要用的资源文件,都是原封不动地保存,我们可以直接提取出来,做汉化时就可以直接阅读string文件然后进行修改

AndroidManifest.xml文件则是编译过后的一个配置文件,用于声明程序中所包含的activity,service以及程序所具有的能力,也就是权限。resources.arsc则是编译过后的一个资源说明文件,而我们要关注的主要是classes.dex 。我们编写的Android程序,在源程序里的所有.java的文件,最终都编译到这样1个.dex文件当中,在Android手机上的dalvik虚拟机上执行。

首先,我们介绍如何逆向一个.xml文件

由于apk包里的xml文件我们直接用记事本打开还是有一些乱码

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

所以需要我们还原才能更好的看出

这里需要用到AXMLPrinter2.jar 工具

具体的则是打开命令行 我们以AndroidManifest.xml为例,输入如下命令

java -jar AXMLPrinter2.jar AndroidManifest.xml AndroidManifest.txt

有兴趣的也可以写成一个.bat的脚本,方便执行

我们可以看看 执行的结果

执行前的AndroidManifest.xml文件

执行之后 我们可以再看看

代码如下:
?xml version="1.0" encoding="utf-8"?
manifest
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:versionCode="322"
 android:versionName="ver 3.2.2"
 package="com.eoeandroid.wallpapers.christmas"
 
 application
  android:label="@7F040000"
  android:icon="@7F020004"
  
  activity
   android:label="@7F040001"
   android:name=".Main"
   
   intent-filter
    
    action
     android:name="android.intent.action.MAIN"
     
    /action
    category
     android:name="android.intent.category.LAUNCHER"
     
    /category
   /intent-filter
  /activity
  service
   android:name=".service.SyncDeviceInfosService"
   
  /service
  meta-data
   android:name="com.mobclix.APPLICATION_ID"
   android:value="30c0e2bb-a878-43cb-830b-a39fcae33b0c"
   
  /meta-data
 /application
 uses-sdk
  android:minSdkVersion="3"
  
 /uses-sdk
 uses-permission
  android:name="android.permission.INTERNET"
  
 /uses-permission
 uses-permission
  android:name="android.permission.SET_WALLPAPER"
  
 /uses-permission
 uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE"
  
 /uses-permission
 uses-permission
  android:name="android.permission.ACCESS_NETWORK_STATE"
  
 /uses-permission
 uses-permission
  android:name="android.permission.READ_PHONE_STATE"
  
 /uses-permission
 uses-permission
  android:name="android.permission.ACCESS_NETWORK_STATE"
  
 /uses-permission
/manifest

基本能还原的跟源程序大致相同

这里我是拿的eoe出的一个墙纸程序为例

接下来,大家肯定更加关心classes.dex的逆向

这个其实跟之前那个也很相似

采用baksmali.jar这个工具,国外一个对Android研究的很深入的大牛做的

执行代码

java -jar baksmali.jar -o classout/ classes.dex

讲classes.dex能逆向成一个文件夹

这里我可以截个图给大家看看

点开其中一个文件 我们继续来看

大家是不是觉得这个代码很亲切,对从这个代码我们基本能大致推断出源程序的一些结构流程从中借鉴,本文仅供研究学习之用,欢迎与我讨论交流

展开更多 50%)
分享

猜你喜欢

android apk反编译到java源码的实现方法

编程语言 网络编程
android apk反编译到java源码的实现方法

Java反编译的研究

编程语言 网络编程
Java反编译的研究

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Android如何防止apk程序被反编译(尊重劳动成果)

编程语言 网络编程
Android如何防止apk程序被反编译(尊重劳动成果)

谈谈JAVA程序的反编译

编程语言 网络编程
谈谈JAVA程序的反编译

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

解决java 查看JDK中底层源码的实现方法

编程语言 网络编程
解决java 查看JDK中底层源码的实现方法

如何防止SWF文件被反编译

flash教程
如何防止SWF文件被反编译

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

win8系统如何同步IE的收藏夹?

win8系统如何同步IE的收藏夹?

html5+css3实现一款注册表单实例

html5+css3实现一款注册表单实例
下拉加载更多内容 ↓