求可以java反编译工具jd gui成Java的软件,手机版。

Android中的软件安全跟逆向分析[一]—apk反编译破解以及java汇编代码读写 - Android当前位置:& &&&Android中的软件安全跟逆向分析[一]—apk反编译破解Android中的软件安全跟逆向分析[一]—apk反编译破解以及java汇编代码读写&&网友分享于:&&浏览:0次Android中的软件安全和逆向分析[一]—apk反编译破解以及java汇编代码读写& & & &在Android应用开发中,软件安全和逆向分析非常重要。试想如果一个优秀的APP应用没有建立完善的安全机制,从而很容易被黑客破解修改,一方面泄露了应用程序的核心技术,另一方面势必会对用户带来损害,从而造成大量的用户流失。如何反编译破解apk以及保护自己的软件免受反编译破解,是这个系列文章的主题。
& & & &这篇文章主要从apk反编译破解和java汇编语言读写两个方面进行了Android中逆向分析的简述。俗话说:知己知彼,百战不殆。只有了解了apk的反编译破解过程,才能反方面进行加密处理从而避免自己的应用程序被反编译破解。本文通过使用apktool、dex2jar、jd-gui等工具实现了apk的反编译破解,然后修改破解后的java汇编语言、利用jarsigner进行二次签名从而达到改变apk功能的作用。
一、测试环境和工具
& & & &点击即可下载相应工具
windows7 x86
Android SDK和eclipse:adt-bundle-windows-x86-
二、编写Android实例
& & & &首先完成一个Android简单实例的编写,主要功能是输入一个序列号,如果输入序列号为1234,输出“恭喜你,注册成功!”,否则输出”对不起,序列号错误!”。
整个应用程序的工程目录如下,
activity_main.xml文件很简单,就两个控件EditText和Button。
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.cracktest.MainActivity" &
android:id="@+id/et_password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="请输入软件的序列号" /&
android:id="@+id/click"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="确定" /&
MainActivity.java的实现也很简单,显示用Toast实现,
package com.example.
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.T
public class MainActivity extends Activity {
private EditT
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et_password);
eb = (Button) findViewById(R.id.click);
eb.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String pwd = et.getText().toString().trim();
if ("1234".equals(pwd)) {
Toast.makeText(MainActivity.this, "恭喜你,注册成功!", 0).show();
Toast.makeText(MainActivity.this, "对不起,序列号错误!", 0).show();
模拟器上运行这个简单实例如下,
三、apk反编译破解
& & & &假设我们现在要对上述工程生成的apk进行反编译破解,那么该怎么做呢?下面我们进行详细的流程描述。
导出APK到桌面
DDMS-&Devices-&点击stop停止程序-&File Explore-&data-&APP-&.apk-&点击导出键
.zip解压apk
得到apk文件以后,若是直接修改后缀.apk为.zip文件然后解压查看,会发现解压完的文件在编辑器打开为乱码,只能寻求更好的方法来查看apk中的文件。
apktool打开apk
apktool为apk逆向工程的软件,首先拷贝apk到apktool的目录下,然后cmd进入apktool的目录下,执行如下命令即可得到apk的全部的资源素材。
得到apk资源素材后,点击查看,C:\Users\Administrator\Desktop\apktool\com.example.cracktest-1\smali\com\example\cracktest
用编辑器打开MainActivity.smali文件如下,
.class public Lcom/example/cracktest/MainA
.super Landroid/app/A
.source "MainActivity.java"
# instance fields
.field private eb:Landroid/widget/B
.field private et:Landroid/widget/EditT
# direct methods
.method public constructor &init&()V
invoke-direct {p0}, Landroid/app/A-&&init&()V
return-void
.end method
.method static synthetic access$0(Lcom/example/cracktest/MainA)Landroid/widget/EditT
.parameter
iget-object v0, p0, Lcom/example/cracktest/MainA-&et:Landroid/widget/EditT
return-object v0
.end method
# virtual methods
.method protected onCreate(Landroid/os/B)V
.parameter "savedInstanceState"
invoke-super {p0, p1}, Landroid/app/A-&onCreate(Landroid/os/B)V
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&setContentView(I)V
const/high16 v0, 0x7f08
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&findViewById(I)Landroid/view/V
move-result-object v0
check-cast v0, Landroid/widget/EditT
iput-object v0, p0, Lcom/example/cracktest/MainA-&et:Landroid/widget/EditT
const v0, 0x7f080001
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&findViewById(I)Landroid/view/V
move-result-object v0
check-cast v0, Landroid/widget/B
iput-object v0, p0, Lcom/example/cracktest/MainA-&eb:Landroid/widget/B
iget-object v0, p0, Lcom/example/cracktest/MainA-&eb:Landroid/widget/B
new-instance v1, Lcom/example/cracktest/MainActivity$1;
invoke-direct {v1, p0}, Lcom/example/cracktest/MainActivity$1;-&&init&(Lcom/example/cracktest/MainA)V
invoke-virtual {v0, v1}, Landroid/widget/B-&setOnClickListener(Landroid/view/View$OnClickL)V
return-void
.end method
& & & &这就是反编译后生成的java汇编语言,发现读起来很困难,没事,这个在第三部分有讲解,那么我们怎么得到反编译后的java源代码呢?
4. dex2jar生成jar
在apk文件中,修改.apk后缀名为.zip,然后解压得到classes.dex文件,dex2jar工具的作用就是把dex文件转化为jar文件。把得到的classes.dex文件复制到dex2jar目录下,cmd执行命令如下,
5. jd-gui把jar转成java源码
打开jd-gui,直接将生成的classes_dex2jar.jar文件拖入到jd-gui中如下,
点击生成的java包即可查看apk里的java源码,仿真度很高
四、java汇编语言读写
& & & &在上面使用apktool工具生成的.smali文件,打开发现是java汇编语言,很难读懂,下面就上述生成的汇编语言进行简单的说明。apktool生成了两个主要的.smali需要查看,分别为MainActivity.smali和MainActivity$1.smali
.class public Lcom/example/cracktest/MainA
.super Landroid/app/A
.source "MainActivity.java"
# instance fields//类成员变量
.field private eb:Landroid/widget/B
.field private et:Landroid/widget/EditT
# direct methods
.method public constructor &init&()V //Activity构造方法,返回值为Void
.locals 0//本地变量声明0个
.line 11//这两句为自动生成行号等信息
invoke-direct {p0}, Landroid/app/A-&&init&()V
return-void
.end method
.method static synthetic access$0(Lcom/example/cracktest/MainA)Landroid/widget/EditT
.parameter
iget-object v0, p0, Lcom/example/cracktest/MainA-&et:Landroid/widget/EditT
return-object v0
.end method
# virtual methods
.method protected onCreate(Landroid/os/B)V
.parameter "savedInstanceState"
invoke-super {p0, p1}, Landroid/app/A-&onCreate(Landroid/os/B)V
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&setContentView(I)V
const/high16 v0, 0x7f08
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&findViewById(I)Landroid/view/V
move-result-object v0
check-cast v0, Landroid/widget/EditT
iput-object v0, p0, Lcom/example/cracktest/MainA-&et:Landroid/widget/EditT
const v0, 0x7f080001
invoke-virtual {p0, v0}, Lcom/example/cracktest/MainA-&findViewById(I)Landroid/view/V
move-result-object v0
check-cast v0, Landroid/widget/B
iput-object v0, p0, Lcom/example/cracktest/MainA-&eb:Landroid/widget/B
iget-object v0, p0, Lcom/example/cracktest/MainA-&eb:Landroid/widget/B
new-instance v1, Lcom/example/cracktest/MainActivity$1;
invoke-direct {v1, p0}, Lcom/example/cracktest/MainActivity$1;-&&init&(Lcom/example/cracktest/MainA)V
invoke-virtual {v0, v1}, Landroid/widget/B-&setOnClickListener(Landroid/view/View$OnClickL)V
return-void
.end method
.class Lcom/example/cracktest/MainActivity$1;
.super Ljava/lang/O
.source "MainActivity.java"
# interfaces //实现接口
.implements Landroid/view/View$OnClickL
# annotations
.annotation system Ldalvik/annotation/EnclosingM
value = Lcom/example/cracktest/MainA-&onCreate(Landroid/os/B)V
.end annotation
.annotation system Ldalvik/annotation/InnerC
accessFlags = 0x0
name = null
.end annotation
# instance fields//类成员变量
.field final synthetic this$0:Lcom/example/cracktest/MainA
# direct methods //Activity构造方法
.method constructor &init&(Lcom/example/cracktest/MainA)V
.parameter
iput-object p1, p0, Lcom/example/cracktest/MainActivity$1;-&this$0:Lcom/example/cracktest/MainA
invoke-direct {p0}, Ljava/lang/O-&&init&()V
return-void
.end method
# virtual methods
.method public onClick(Landroid/view/V)V
.parameter "v"
const/4 v3, 0x0
iget-object v1, p0, Lcom/example/cracktest/MainActivity$1;-&this$0:Lcom/example/cracktest/MainA
#getter for: Lcom/example/cracktest/MainA-&et:Landroid/widget/EditT
invoke-static {v1}, Lcom/example/cracktest/MainA-&access$0(Lcom/example/cracktest/MainA)Landroid/widget/EditT
move-result-object v1
invoke-virtual {v1}, Landroid/widget/EditT-&getText()Landroid/text/E
move-result-object v1
invoke-interface {v1}, Landroid/text/E-&toString()Ljava/lang/S
move-result-object v1
invoke-virtual {v1}, Ljava/lang/S-&trim()Ljava/lang/S
move-result-object v0
.local v0, pwd:Ljava/lang/S
const-string v1, "1234"
invoke-virtual {v1, v0}, Ljava/lang/S-&equals(Ljava/lang/O)Z
move-result v1
if-eqz v1, :cond_0
iget-object v1, p0, Lcom/example/cracktest/MainActivity$1;-&this$0:Lcom/example/cracktest/MainA
const-string v2, "\u606d\u559c\u4f60\uff0c\u6ce8\u518c\uf\uff01"
invoke-static {v1, v2, v3}, Landroid/widget/T-&makeText(Landroid/content/CLjava/lang/CharSI)Landroid/widget/T
move-result-object v1
invoke-virtual {v1}, Landroid/widget/T-&show()V
return-void
iget-object v1, p0, Lcom/example/cracktest/MainActivity$1;-&this$0:Lcom/example/cracktest/MainA
const-string v2, "\u5bf9\u4e0d\u8d77\uff0c\u5e8f\u\u9519\u8bef\uff01"
invoke-static {v1, v2, v3}, Landroid/widget/T-&makeText(Landroid/content/CLjava/lang/CharSI)Landroid/widget/T
move-result-object v1
invoke-virtual {v1}, Landroid/widget/T-&show()V
goto :goto_0
.end method
在上述分析中,如果v1和v0相等,则执行逻辑
const-string v2, “\u606d\u559c\u4f60\uff0c\u6ce8\u518c\uf\uff01” //如果相等,执行这个逻辑
这句话是什么意思呢?我们可以自己写个java Test测试一下这个字符串,
五、修改反编译后的汇编语言文件
& & & &假设我们现在得到了一个apk反编译后的java汇编语言,如果修改它使的改变它的功能。就上面这个列子而言,如果输入字符串为1234,则显示注册成功,否则显示序列号错误。在汇编语言中它实现的逻辑如下,
if-eqz v1, :cond_0
如果v1和v0的比较返回值为0,即eqz为equal 0的话,执行显示cond_0,显示序列号错误。。。
修改if从句为
if-nez v1, :cond_0
意思是说,如果v1和v0的比较不为0,即v1,v0相等,让它显示序列号错误,相当于和原来的逻辑相反了。
在C:\Users\Administrator\Desktop\apktool\com.example.cracktest-1\smali\com\example\cracktest\MainActivity$1.smali文件中按照上述修改if从句。然后cmd进入apktool目录下,执行命令如下,
生成new.apk新的apk文件后,我们将之部署到模拟器上测试,找到adb安装目录后,cmd执行如下命令,
结果安装解析失败,原因没有签名证书,为什么呢?
点击查看原来的和新的apk文件,我们发现new.apk文件中没有META-INF文件,
META-INF文件夹为应用程序的签名。
为了解决安装apk失败的问题,我们要给new.apk进行签名。
将new.apk复制到signapk目录下,cmd中执行如下命令生成out.apk文件,
在out.apk中已经生成了META-INF文件夹,最后安装out.apk到模拟器上,
还是失败,因为原来模拟器上安装过这个软件,需要重新卸载掉,然后安装就可以了!
模拟器上卸载程序有两种方法:
直接在模拟器中点击menu–&settings –& Applications –& Manage Applications 中点击你需要卸载的apk(就是你的应用软件)–&Uninstall;
进入内嵌的linux,去data/app目录下删除 apk文件,这种方法可以批量删除
rm ApplicationName.apk
卸载之后,重新进行安装如下,
最后在模拟器上测试结果展示
显示结果正好和原来结果相反,证明我们之前修改的.smali汇编语言文件,起了作用。
实际反汇编破解apk过程中,还是用dex2jar工具比较好,如果一个工程应用程序很复杂,那么直接查看汇编语言文件.smali会是项庞大的工程。no zuo no die !
六、参考引用
android apk反编译详解
Android APK反编译就这么简单 详解(附图)
Android APK反编译详解(附图)
谈谈android反编译和防止反编译的方法
未完待续。。。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有smali2java下载v1.0.0.558 官方版_smali代码反编译成java代码工具西西软件下载
西西软件下载最安全的下载网站、值得信赖的软件下载站!
相关软件 /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /英文/ /中文/顶好评:50%踩坏评:50请简要描述您遇到的错误,我们将尽快予以修正。轮坛转帖HTML方式轮坛转帖UBB方式
25.0M/英文/7.2
33.8M/中文/5.4
23.8M/中文/4.2
303M/中文/1.5
651.2M/中文/3.1
41.1M/英文/5.5
11.2M/中文/7.0
官方正式版
71多语官方安装版
绿色免费版
7u67官方正式版
官方最新版
smali2java是一个将smali代码反编译成java代码的工具。什么是smali?smali是将Android字节码用可阅读的字符串形式表现出来的一种语言,可以称之为Android字节码的反汇编语言。使用baksmali或apktool可以将Android应用程序包(apk或jar)反编译为smali代码。特点:smali2java工具基于apktool v1.5.0(baksmali v1.3.4)生成的smali文件,依赖于smali文件中的代码行数(.line关键字)和变量别名(.local关键字)等信息,可以最大程度还原原始的java代码。还原出的java代码将具有原始的变量命名,代码的顺序也与原始的java代码保持一致。因此,本工具也具有局限性,仅适用于带有行数和变量别名信息的smali文件(java编译器的编译选项可以在生成的字节码中剔除这些信息)。smali2java使用了apktool将Android字节码文件转换为smali文件。界面显示中使用了CCrystalTextView作为java语法高亮显示控件,
smali2java v1.0.0.558 官方版
下载帮助西西破解版软件均来自互联网, 如有侵犯您的版权, 请与我们联系。您的位置:> -&
-& >DJ Java Decompiler下载 档案号:#3568
软件授权:
软件大小:
软件语言:
软件评级:
官方主页:
更新时间:
应用平台:
Win9x/NT/2000/XP
复制到论坛
复制到博客
绿盟口号! 伸出你的手 - 绿色分享:
官方评级:4/44085
同类软件推荐
本类下载排行Jar 应用程序反编译成.java文件有什么办法吗?
[问题点数:40分,结帖人qinceo]
Jar 应用程序反编译成.java文件有什么办法吗?
[问题点数:40分,结帖人qinceo]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年3月 总版技术专家分月排行榜第二
2014年2月 Java大版内专家分月排行榜第一2013年8月 Java大版内专家分月排行榜第一2013年5月 Java大版内专家分月排行榜第一2013年4月 Java大版内专家分月排行榜第一2013年3月 Java大版内专家分月排行榜第一2013年2月 Java大版内专家分月排行榜第一
2016年1月 Java大版内专家分月排行榜第二2015年12月 Java大版内专家分月排行榜第二2015年8月 Java大版内专家分月排行榜第二2015年3月 Java大版内专家分月排行榜第二2015年1月 Java大版内专家分月排行榜第二2014年12月 Java大版内专家分月排行榜第二2014年11月 Java大版内专家分月排行榜第二2014年6月 Java大版内专家分月排行榜第二2014年4月 Java大版内专家分月排行榜第二2014年1月 Java大版内专家分月排行榜第二2013年11月 Java大版内专家分月排行榜第二
2015年9月 Java大版内专家分月排行榜第三2015年6月 Java大版内专家分月排行榜第三2015年5月 Java大版内专家分月排行榜第三2015年2月 Java大版内专家分月排行榜第三2014年3月 Java大版内专家分月排行榜第三2013年12月 Java大版内专家分月排行榜第三
2013年10月 总版技术专家分月排行榜第三
2014年3月 Java大版内专家分月排行榜第一2014年1月 Java大版内专家分月排行榜第一2013年12月 Java大版内专家分月排行榜第一2013年11月 Java大版内专家分月排行榜第一2013年10月 Java大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。&&&&java反编译软件,.class .jar等后缀文件均可反编译成.java文件
java反编译软件,.class .jar等后缀文件均可反编译成.java文件
很好用的java反编译软件,.class .jar等后缀文件均可反编译成.java文件,适合win7系统。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
课程资源下载排行}

我要回帖

更多关于 java防止反编译 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信