如何反编译android应用并重新打包

 我来答
匿名用户
2017-05-11
展开全部
一.看android的源代码   1)将Apkd.apk 用zip解压后,出现了一个classes.dex文件   2014/02/19 19:42   .   2014/02/19 19:42   ..   2014/02/19 15:35 1,656 AndroidManifest.xml   2014/02/19 15:35 687,024 classes.dex   2014/02/19 15:49   META-INF   2014/02/19 15:49   res   2014/02/19 15:35 2,200 resources.arsc   2)进入到dex2jar目录中,运行情况如下:   D:\developer\tools\test_apk\dex2jar-0.0.9.15>dex2jar.bat "..\Apkd(d2j)\classes.d   ex"   this cmd is deprecated, use the d2j-dex2jar if possible   dex2jar version: translator-0.0.9.15   dex2jar ..\Apkd(d2j)\classes.dex -> ..\Apkd(d2j)\classes_dex2jar.jar   Done.   在apk所在的目录会出现 classes_dex2jar.jar 文件。   3) 用JD-GUI对jar包进行查看,可以查看源文件   二.反编译apk   1.在 下载 APKTOOL中的三个文件(aapt.exe、apktool.bat、apktool.jar)解压缩到你的Windows安装目录下,以方便使用Dos命令.   2012/12/06 11:44 854,016 aapt.exe   2014/02/19 17:15 277,372 Apkd.apk //示例用 apk文件   2012/12/23 23:39 92 apktool.bat   2013/02/03 02:37 2,655,843 apktool.jar   2.进入到apktool.bat所在的目录,运行:   apktool d Apkd.apk decode_dir   反编译后,decode_dir目录下的内容如下:   2014/02/19 17:16 716 AndroidManifest.xml   2014/02/19 17:16 237 apktool.yml   2014/02/19 17:18   build   2014/02/19 17:16   res   2014/02/19 17:16   smali   此时我可以查看原文件AndroidManifest.xml了,也是查看smali源文件(是用smali语言写的,可以对照java看)。   三.APKTOOL的使用   1).decode   该命令用于进行反编译apk文件,一般用法为   apktool d   代表了要反编译的apk文件的路径,最好写绝对路径,比如C:\MusicPlayer.apk   代表了反编译后的文件的存储位置,比如C:\MusicPlayer   如果你给定的已经存在,那么输入完该命令后会提示你,并且无法执行,需要你重新修改命令加入-f指令   apktool d –f   这样就会强行覆盖已经存在的文件   2).build   该命令用于编译修改好的文件,一般用法为   apktool b   这里的   就是刚才你反编译时输入的   (如C:\MusicPlayer),输入这行命令后,如果一切正常,你会发现C:\MusicPlayer内多了2个文件夹build和dist,其中分别存储着编译过程中逐个编译的文件以及最终打包的apk文件。   3).install-framework   该命令用于为APKTool安装特定的framework-res.apk文件,以方便进行反编译一些与ROM相互依赖的APK文件。具体情况请看常见问题   四.smali与java源码对照,并做出相应的修改   java源代码:   import android.os.Bundle;   import android.app.Activity;   import android.view.Menu;   import android.widget.*;   public class MainActivity extends Activity {   @Override   protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.activity_main);   TextView a = (TextView)this.findViewById(R.id.test) ;   a.setText("raoliang");   }   @Override   public boolean onCreateOptionsMenu(Menu menu) {   // Inflate the menu; this adds items to the action bar if it is present.   getMenuInflater().inflate(R.menu.main, menu);   return true;   }   }   对应的smali源代码:   .class public Lali/text/apkd/MainActivity;   .super Landroid/app/Activity;   .source "MainActivity.java"   # direct methods   .method public constructor ()V   .locals 0   .prologue   .line 8   invoke-direct {p0}, Landroid/app/Activity;->()V   return-void   .end method   # virtual methods   .method protected onCreate(Landroid/os/Bundle;)V   .locals 2   .parameter "savedInstanceState"   .prologue   .line 12   invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V   .line 13   const/high16 v1, 0x7f03   invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->setContentView(I)V   .line 14   const/high16 v1, 0x7f08   invoke-virtual {p0, v1}, Lali/text/apkd/MainActivity;->findViewById(I)Landroid/view/View;   move-result-object v0   check-cast v0, Landroid/widget/TextView;   .line 15   .local v0, a:Landroid/widget/TextView;   const-string v1, "raoliang"   invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V   .line 16   return-void   .end method   .method public onCreateOptionsMenu(Landroid/view/Menu;)Z   .locals 2   .parameter "menu"   .prologue   .line 21   invoke-virtual {p0}, Lali/text/apkd/MainActivity;->getMenuInflater()Landroid/view/MenuInflater;   move-result-object v0   const/high16 v1, 0x7f07   invoke-virtual {v0, v1, p1}, Landroid/view/MenuInflater;->inflate(ILandroid/view/Menu;)V   .line 22   const/4 v0, 0x1   return v0   .end method   通过对比可以看到,常量是没有必变的,可以根据的smali的语法,进行相应的修改   五.3、打包、签名和安装修改后的apk   修改完了,就可以打包回apk了。执行以下命令:   apktool b decode_dir   在mygame目录下的dist在会看到打包好的apk。   当然,现在一般是无法安装的,因为apk还没有签名。下面就来签名。签名需要keystore文件,我已经有专用的keystore了,如果还没有,请参阅这里进行生成。   执行以下命令为重新编译的my_game.apk签名:   jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore   最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。   完整的运行情况如下:   D:\developer\tools\test_apk\new\decode\dist>keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore   输入keystore密码:   再次输入新密码:   您的名字与姓氏是什么?   [Unknown]: rao   您的组织单位名称是什么?   [Unknown]: rao   您的组织名称是什么?   [Unknown]:   您所在的城市或区域名称是什么?   [Unknown]:   您所在的州或省份名称是什么?   [Unknown]:   该单位的两字母国家代码是什么   [Unknown]:   CN=rao, OU=rao, O=Unknown, L=Unknown, ST=Unknown, C=Unknown 正确吗?   [否]: y   输入的主密码   (如果和 keystore 密码相同,按回车):   D:\developer\tools\test_apk\new\decode\dist>jarsigner -verbose -keystore demo.keystore Apkd.apk demo.keystore   输入密钥库的口令短语:   正在添加: META-INF/MANIFEST.MF   正在添加: META-INF/DEMO_KEY.SF   正在添加: META-INF/DEMO_KEY.RSA   正在签名: res/drawable-hdpi/ic_launcher.png   正在签名: res/drawable-mdpi/ic_launcher.png   正在签名: res/drawable-xhdpi/ic_launcher.png   正在签名: res/drawable-xxhdpi/ic_launcher.png   正在签名: res/layout/activity_main.xml   正在签名: res/menu/main.xml   正在签名: AndroidManifest.xml   正在签名: classes.dex   正在签名: resources.arsc   D:\developer\tools\test_apk\new\decode\dist>   到此为止,修改后的apk可以正常的安装了,不过,在安装之前,必须要先卸载以前的apk,不能直接替换(因为签名不一样)
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式