Apk文g破解可见源码
Q. 获取apk?/span> ?#8205;?/span> 囄
直接?WinRAR打开Qres/drawable直接拖拽出来卛_?/span>
Q.获取xml文g信息
虽然能用WinRAR看到里面的xml文gQ但是xml是经q优化的Q无法直接查看,需要用apktool 工具 Q?/span> 下蝲 地址Q?/span> https://code.google.com/p/android-apktool/ ?/span>
下蝲 apktool-1.3.1.tar.bz2和apktool-install-windows-2.2_r01-2.tar.bz2解压到同一个目录, 然后把待破解的apk文g拯到同一目录QDOS在cmd下进入apktool所在\径,然后输入apktool d "XXX1" "XXX2",XXX1指的是你要反~译的apk文gQXXX2指的是反~译后文件存攄路径Q?/span>
如:apktool d "C:/taobao.apk" "C:/taobao"
解压apk文gQ直接拖?rar解压软g)Q找到classes.dex文g 在cmd下进入dex2jar.bat所在\径, 然后输入“dex2jar.bat XXX”QXXX指的是你要反~译的apk中的classes.dex文g所在\径及名称(classes上面解压得到)Q?/span> 如:dex2jar.bat D:/classes.dexQ?/span> q样会生成一?/span> classes.dex.dex2jar.jar文gQ然后用jd-gui工具jar文g反编译成java文gQ选择?存所有,它会生成一个压~文Ӟ所有的源码都在q个压羃文g中,解压了就可以看到详细的代码了。很强大吧?/span> fromQhttp://hi.baidu.com/eblson/blog/item/312de07b5e594dff2f73b353.html ----------------------------------------- 一、获得APK源代码: 工具下蝲 Q需用到 dex2ja r ?/span> JD-GUI q?/span> 2 个工?/span> dex2jar 下蝲地址 Q?/span> http://laichao.googlecode.com/files/dex2jar-0.0.7-SNAPSHOT.zip 步骤Q?/span> 1. ?/strong> apk 文g改名?/span> .zip Q然后解压羃 , 得到其中?/span> classes.dex 文gQ它是 java 文g~译后再通过 dx 工具打包成的 , 所以现在我们就用上q提到的 2 个工h逆方向导?/span> java 源文?/span> --------------------------------------------------------------------------------- ?/span> . 反编?/span> apk 生成E序的源代码和图片?/span> XML 配置、语a资源{文件?/strong> 工具下蝲Q?/span> ?/span> http://code.google.com/p/android-apktool/ ?/span> 载获得, apktool-1.0.0.tar.bz2 ?/span> apktool-install-windows-2.1_r01-1.zip 两个?/strong> ?/strong> 1. 解压~下载的两个文g包, apktool-install-windows-2.1_r01-1.zip 解压~后得到的包里有 aapt.exe ?/span> apktool.bat. Q注意要?/span> apktool-1.0.0.tar.bz2 解压后的一?/span> .jar 文g copy q来Q?/span> 2. 打开命oH口 Q开?/span> > q行Q输?/span> cmd Q回车。)q入?/span> apktool.bat 的文件夹里?/span> 输入Q?/strong> apktool dC:/***.apk C:/*** 文g?/span> Q命令行解释Q?/span> apktool d 要反~译的文?/span> 输出文g夹) 特别注意Q你要反~译的文件一定要攑֜ C 盘的根目录里Q?/span> 3. 打开 C:/*** 文g?/span> 可以得到我们学院的各种资源了?/span> fromQhttp://www.apkbus.com/forum.php?mod=viewthread&tid=118 ------------------------------------------- 本文主要介绍如何逆向一个Android的APK应用E序Q本文提供的Ҏ仅供研究学习之用?/p> 本文需要用到的工具?/p> jdk q个用于搭徏javaq行环境 AXMLPrinter2.jar q个用于逆向.xml文g baksmali.jar q个用于逆向classex.dex文g ׃ Android ?.apk 文g实际上就是一?zip ??/span> 可以直接?winrar ?开 如下图所C: 用rar打开之后 我们可以看到该文件实际上是一个zip? 里面包含了META-INF文g夹,q个文gҎ用于保存{文gQ确保包的完整性的 res文g夹下是apk所要用的资源文Ӟ都是原封不动C存,我们可以直接?取出来,做汉化时可以直接阅读string文g然后q行修改 AndroidManifest.xml文g则是~译q后的一个配|文Ӟ用于?明程序中所包含的activity,service以及E序所h的能力,也就是权限。resources.arsc则是~译q后的一个资源说明文Ӟ?我们要关注的主要是classes.dex 。我们编写的AndroidE序Q在源程序里的所?java的文Ӟ最l都~译到这??dex文g当中Q在Android手机上的dalvik虚拟 Z执行?/p> 首先Q我们介l如何逆向一?xml文g ׃apk包里的xml文g我们直接用记事本打开q是有一些ؕ?/p> 所以需要我们还原才能更好的看出 q里需要用到AXMLPrinter2.jar 工具 具体的则是打开命o? 我们以AndroidManifest.xmlZQ输入如下命?/p> java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt 有兴的也可以写成一?bat的脚本,方便执行 我们可以看看 执行的结?/p> 执行前的AndroidManifest.xml文g 执行之后 我们可以再看?/p> 基本能还原的跟源E序大致相同 q里我是拿的eoe出的一个墙U程序ؓ?/p> 接下来,大家肯定更加兛_classes.dex的逆向 q个其实跟之前那个也很相?/p> 采用baksmali.jarq个工具Q国外一个对Android研究的很深入?大牛做的 执行代码 java -jar baksmali.jar -o classout/ classes.dex 讲classes.dex能逆向成一个文件夹 q里我可以截个图l大家看?/p> 点开其中一个文?我们l箋来看 大家是不是觉得这个代码很亲切 ? 从这个代码我们基本能大致推断出源E序的一些结构流E?/p> 从中借鉴 本文仅供研究学习之用 Ƣ迎与我讨论交流 本文地址如下 转蝲h明此?/p> http://blog.csdn.net/Zengyangtech/archive/2010/08/12/5807517.aspx
3 Q反 ~译 dex获取 Java 源代?/span>
Apktool工具只能反编译成smali的中间代码文Ӟq里需要借助另外一?/span> 开?/span> 工具Qdex2jarQ下载地址Q?/span> http://code.google.com/p/dex2jar/ 。这个工具不能直接翻译成java文gQ但是可以把dex文g转换成jar文gQ然后可以通过 jad工具把jar文g反编译成Java源文Ӟjd-gui下蝲地址Q?/span> http://java.decompiler.free.fr/jd-gui/downloads/jd-gui-0.3.3.windows.zip ?/span>
详细步骤Q?/p>
JD-GUI 下蝲地址Q?/span>
windows ?/span> JD-GUI Q?/span> http://laichao.googlecode.com/files/jdgui.zip
Linux ?/span> JD-GUI Q?/span> http://laichao.googlecode.com/files/jd-gui-0.3.2.linux.i686.tar.gz
2. ?/span> classes.dex 拯?/span> dex2jar.bat 所在目录?/span>
在命令行模式下定位到 dex2jar.bat 所在目录,q行 dex2jar.batclasses.dex Q生?/span> classes.dex.dex2jar.jar
3. q行 JD-GUI 工具Q它是绿色无d装的Q?/span>
打开上面?/span> jar 文gQ即可看到源代码
提供了获得汉字的拼音首字母的Ҏ
JDK版本 无版本限?br /> 功能 实现了获得一个汉字的拼音首字母功能,为汉字排序提供了方便
Ƣ迎大家提意见,交流
代码如下Q?/p>
/**
* Title:获得汉字的拼音首字母
* Description: GB 2312-80 把收录的汉字分成两。第一U汉字是常用汉字Q计 3755 个,
* |于 16?5 区,按汉语拼韛_母/WŞ序排列Q第二汉字是次常用汉字Q?br /> * ?3008 个,|于 56?7 区,按部首/W画序排列Q所以本E序只能查到
* 对一U汉字的声母。同时对W合声母QzhQchQshQ只能取首字母(zQcQsQ?nbsp;
* Copyright: Copyright (c) 2004
* Company:
* @author not attributable
* @version 1.0
*/
public class GetFirstLetter {
// 国标码和Z码{换常?br /> private static final int GB_SP_DIFF = 160;
//存放国标一U汉字不同读音的起始Z?br /> private static final int[] secPosvalueList = {
1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787,
3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027, 4086,
4390, 4558, 4684, 4925, 5249, 5600};
//存放国标一U汉字不同读音的起始Z码对应读?br /> private static final char[] firstLetter = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'w', 'x', 'y', 'z'};
//获取一个字W串的拼音码
public static String getFirstLetter(String oriStr) {
String str = oriStr.toLowerCase();
StringBuffer buffer = new StringBuffer();
char ch;
char[] temp;
for (int i = 0; i < str.length(); i++) { //依次处理str中每个字W?br /> ch = str.charAt(i);
temp = new char[] {
ch};
byte[] uniCode = new String(temp).getBytes();
if (uniCode[0] < 128 && uniCode[0] > 0) { // 非汉?br /> buffer.append(temp);
}
else {
buffer.append(convert(uniCode));
}
}
return buffer.toString();
}
/** 获取一个汉字的拼音首字母?br /> * GB码两个字节分别减?60Q{换成10q制码组合就可以得到Z?br /> * 例如汉字"?的GB码是0xC4/0xE3Q分别减?xA0Q?60Q就?x24/0x43
* 0x24转成10q制是36Q?x43?7Q那么它的区位码是3667Q在对照表中读音?#8216;n'
*/
private static char convert(byte[] bytes) {
char result = '-';
int secPosvalue = 0;
int i;
for (i = 0; i < bytes.length; i++) {
bytes[i] -= GB_SP_DIFF;
}
secPosvalue = bytes[0] * 100 + bytes[1];
for (i = 0; i < 23; i++) {
if (secPosvalue >= secPosvalueList[i] &&
secPosvalue < secPosvalueList[i + 1]) {
result = firstLetter[i];
break;
}
}
return result;
}
}