前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

反编译修改APK包名的实现方法 | 泰卓网 泰卓网 简单就是美~ 搜索 --> 首页 Android Tizen Linux Java 大杂烩 Apr252012 反编译修改APK包名的实现方法 作者:wzhongyu 发布:2012-04-25 16:00 分类:Android 阅读:7,918 浏览数 2条评论 说明:反编译只是为了学习,请尊重他人劳动成果。 准备工作(笔者是基于Ubuntu10.10环境进行的): 1. 安装JDK并配置环境变量,这块都比较熟悉了,就不再介绍。 2. 安装android sdk并配置环境变量。 3. 下载apktool,下载地址请自行搜索。 4. 生成keystore文件,用于对修改后打包的apk进行签名。 笔者的apktool放在/home/jade/apps/apktool目录下,需要修改的apk及修改过程中用到的临时文件均存放在/home/jade/testdec目录下,下载的所有操作都是基于这两个目录的,使用DecompileProject.apk文件作为修改的对象,故下面不再介绍修改过程中用到的文件及位置。DecompileProject.apk安装运行后,可以看到共有两个界面,如下图: 首先进行keystore文件生成工作,生成keystore使用的是jdk的keytool工具,具体执行过程如下: keytool -genkey -alias mykey.keystore -keyalg RSA -validity 20000 -keystore mykey.keystore //这里要注意keystore的名字和alias要一致,不然签名时会出问题 输入keystore密码: //这里输入密码 再次输入新密码: 您的名字与姓氏是什么? [Unknown]: jade 您的组织单位名称是什么? [Unknown]: jade 您的组织名称是什么? [Unknown]: jade 您所在的城市或区域名称是什么? [Unknown]: wh 您所在的州或省份名称是什么? [Unknown]: hb 该单位的两字母国家代码是什么 [Unknown]: CN CN=jade, OU=jade, O=jade, L=wh, ST=hb, C=CN 正确吗? [否]: y 输入<mykey.keystore>的主密码 (如果和 keystore 密码相同,按回车): //这里一般直接按回车即可 再次输入新密码: 这样就生成了一个用于签名的keystore文件了,-validity 20000指定keystore的过期时间位2w天。 然后开始反编译apk包,首先执行如下命令,将apk文件反编译解压: cd /home/jade/apps/apktool/ java -jar apktool.jar d /home/jade/testdec/DecompileProject.apk /home/jade/testdec/DecompileProject回车后会输出如下信息: I: Baksmaling&#8230; I: Loading resource table&#8230; I: Loaded. I: Loading resource table from file: /home/jade/apktool/framework/1.apk I: Loaded. I: Decoding file-resources&#8230; I: Decoding values*/* XMLs&#8230; I: Done. I: Copying assets and libs&#8230; 这样就完成了修改的第一步,把需要修改的文件反编译解压出来。下载开始修改包名工作,进入/home/jade/testdec/DecompileProject目录,用文本编辑器打开AndroidManifest.xml文件,可以看到文件内容如下: <?xml version="1.0" encoding="utf-8"?> <manifest android:versionCode="1" android:versionName="1.0" package="com.jade.decompile" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minSdkVersion="3" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:debuggable="true"> <activity android:label="@string/app_name" android:name=".DecompileProjectActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SencondTestActivity" /> </application> </manifest> </pre> 这里可以看到这个应用只有两个Activity:DecompileProjectActivity和SencondTestActivity,应用的包名为:com.jade.decompile,这里我们把包名改为新的自己的包名:com.tidroid.test,修改后的文件内容如下: <?xml version="1.0" encoding="utf-8"?> <manifest android:versionCode="1" android:versionName="1.0" package="com.tidroid.test" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-sdk android:minSdkVersion="3" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:debuggable="true"> <activity android:label="@string/app_name" android:name=".DecompileProjectActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SencondTestActivity" /> </application> </manifest> 这样完成了修改包名的第一步,因为两个Activity的包名还没有改过来,这个时候打了包的应用也不能正常使用(虽然把<activity android:label=&#8221;@string/app_name&#8221; android:name=&#8221;.DecompileProjectActivity&#8221;>这里改为用全包名com.jade.decompile.DecompileProjectActivity可以启动第一个界面,但是即使把第二个Activity的也改为用全包名com.jade.decompile.SencondTestActivity,在跳转到第二个界面的时候仍然会出问题,因为Android默认在打开第二个Activity时是基于应用的包来查找的,这样就会看到应用实际上是去找com.tidroid.test.com.jade.decompile.SencondTestActivity,所以会出错。),下一步就是去修改Activity的包名了。进入smali/com/jade/decompile文件夹,用文本编辑器打开所有以.smali结尾的文件,使用替换功能把所有的Lcom/jade/decompile/替换成Lcom/tidroid/test/也就是新的包名,然后保存所有文件。这样就把类的包名也改过来了,现在可以开始下一步了,把修改后的文件重新打包成apk文件。 在命令行apktool目录下执行如下命令: java -jar apktool.jar b /home/jade/testdec/DecompileProject /home/jade/testdec/DecompileProject_new.apk 输出如下信息: I: Checking whether sources has changed&#8230; I: Smaling&#8230; I: Checking whether resources has changed&#8230; I: Building resources&#8230; I: Building apk file&#8230; 打包完成后,在/home/jade/testdec/目录下躲了一个apk安装包DecompileProject_new.apk,但是现在这个安装包还不能直接安装,因为新的apk文件尚未签名。下一步就是对这个apk文件进行签名了,在命令行下转到/home/jade/testdec/目录,对新的安装包进行重新签名(使用jdk的工具jarsigner),执行如下命令: cd /home/jade/testdec jarsigner -verbose -keystore mykey.keystore -signedjar DecompileProject_new_signed.apk DecompileProject_new.apk mykey.keystore 回车后会要求输入keystore的密码,就是前面生成mykey.keystore时输入的密码,输入密码并回车后,就开始签名了,输出如下信息: 输入密钥库的口令短语: 正在添加: META-INF/MANIFEST.MF 正在添加: META-INF/MYKEY_KE.SF 正在添加: META-INF/MYKEY_KE.RSA 正在签名: res/drawable-hdpi/ic_launcher.png 正在签名: res/drawable-ldpi/ic_launcher.png 正在签名: res/drawable-mdpi/ic_launcher.png 正在签名: res/drawable-xhdpi/ic_launcher.png 正在签名: res/layout/main.xml 正在签名: res/layout/main2.xml 正在签名: AndroidManifest.xml 正在签名: classes.dex 正在签名: resources.arsc 完成签名后,这个apk就可以安装了,这样就完成了一个apk文件的包名修改。备注:前面生成keystore时提到keystroe的名字要和alias(别名)一致,如果不一致会出问题。问题就是无法完成签名,提示如下信息: jarsigner: 找不到 xxx.keystore 的证书链。xxx.keystore 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。 所以为了能够正常签名,保持一致还是必要的。 新打包的apk安装后,在应用程序管理里就可以看到有两个DecompileProject应用存在,如下图: 为了在修改过程中查看修改的效果,笔者为后面打包部分的操作写了一个脚本,有需要的可以参考下: echo &#8220;正在生成apk安装文件&#8230;&#8230;.&#8221; cd /home/jade/apps/apktool/ java -jar apktool.jar b /home/jade/testdec/DecompileProject /home/jade/testdec/DecompileProject_new.apk echo &#8220;对apk安装文件签名&#8230;&#8230;.&#8221; cd /home/jade/testdec #这里是自动输入keystore的密码 (echo &#8220;123456&#8243;)|jarsigner -verbose -keystore mykey.keystore -signedjar DecompileProject_new_signed.apk DecompileProject_new.apk mykey.keystore echo &#8220;删除手机上已安装的文件&#8230;&#8230;.&#8221; adb uninstall com.tidroid.test echo &#8220;在手机上安装新的文件&#8230;&#8230;.&#8221; adb install DecompileProject_new_signed.apk #这里的删除安装文件可有可有可无,根据需要自行保留 rm -f DecompileProject_new*.apk echo &#8220;启动应用&#8230;&#8230;.&#8221; #这里是通过adb shell来启动修改后的应用。 (echo &#8220;am start -n com.tidroid.test/com.tidroid.test.DecompileProjectActivity exit&#8221;)|adb shell 本文固定链接: http://www.tidroid.com/article_85.html | 泰卓网 该日志由 wzhongyu 于2012年04月25日发表在 Android 分类下, 原创文章转载请注明: 反编译修改APK包名的实现方法 | 泰卓网 关键字: apk反编译, apk签名, 修改apk包名 【上一篇】Tizen SDK下载安装及基本概览【下一篇】(泰泽)Tizen 1.0 Larkspur SDK及源代码发布 您可能还会对这些文章感兴趣! 文档笔记3:Fragments Android使用Properties文件保存信息的永久链接 Android使用SharedPreferences保存配置信息 文档笔记4:Loader Android1.5模拟器访问网络 Android中使用Google地图 Linux sed命令助力Android快速修改项目包名 Android自定义对话框(Custom Dialog) Android创建信笺纸栏式编辑器(1) Android程序国际化处理 Android Samples之贪吃蛇(3)让游戏跑起来 (泰泽)Tizen 1.0 Larkspur SDK及源代码发布(2) Linux C编程一站式学习Android版下载 Java Sax解析两级栏目嵌套XML(列表嵌套) 文档笔记5:Tasks and Back Stack 站点迁移 反编译修改APK包名的实现方法:目前有2 条留言 沙发 Alex: 貌似很麻烦的样子…… 顺便问下评论右边那个即时预览Gravatar头像是怎么实现的…… 2012-05-03 12:00 wzhongyu: 反编译是比较麻烦,如果你的邮箱在Gravatar注册过,那就应该是读你自己设置的头像。如果没有的话,我的博客是在后台配了一个默认的。 2012-05-08 11:09 最新日志热评日志随机日志 Java内存泄漏介绍 站点迁移 最简单的试用Linux的方法(有浏览器就能 Ubuntu处理不能正常识别的Android设备 Tracy老师的英语学习截图记录 Android4.4命名KitKat Android Doc Reading Record 090813 Java中interface的多重继承 解决Android中运行时ClassNotFoundE 图说PhoneGap3.0的变化 Android Samples之贪吃蛇(2)精灵 文档笔记1:Android应用基础知识 Ubuntu处理不能正常识别的Android设备 反编译修改APK包名的实现方法 最简单的试用Linux的方法(有浏览器就能 文档笔记4:Loader 解决Android中运行时ClassNotFoundE Android Doc Reading Record 090813 分析Android版QQ游戏大厅中游戏的启动 站点迁移 大家赞助 最活跃的读者 最新评论 www.356688.com:能坚持写博客,至少也是个有恒心的 Alessandra:感谢分享!超级赞! 就是哈哈:很久没来了,有更新,相当给力啊~ 35秒杀网:不止一次的来过,有价值的博客,收 steven:十分感谢! zyjtjpu:View 大写 andy:不好意思請問一下 编译時發生 jadem:vlc现在在google pla 小铅笔:谢谢 笑话据点:多更新,要不然还以为您老人家去保 标签云集 ClassNotFoundException apk签名 android sax 地图 自定义View MapABC Fragments interface ListView obtainStyledAttributes 修改包名 layout_weight English 地图ApiKey Html 继承 sed WebView 设备识别 Android反编译 udev android模拟器网络 Properties 自动提示输入 QQ游戏免安装实现方法 vlc-android源码编译 Tizen SDK 国际化 返回键事件处理 Task GridView 列表优化 Loader android vlc-android 修改apk包名 am apk反编译 target Java 九宫格 Back Stack java sax 贪吃蛇游戏代码 tizen Activity Service Linux C编程 罗伯特穆格 usb android 自定义对话框 xml嵌套列表 Linux C编程一站式学习 Ubuntu udev 信笺纸编辑器 phonegap Google地图 访问网页 日历控件 Tracy linux 通讯录头像 google doodle android 4.4 QQ游戏大厅 博客统计 日志总数:50 篇 评论总数:62 篇 标签数量:70 个 链接总数:2 个 建站日期:2011-04-25 运行天数:1009 天 最后更新:2013-10-29 Copyright &copy; 2012-2013 泰卓网. Powered by WordPress. Theme by Weisay.