大家一听到反编译、逆向工程就觉得好像离自己很远,都是些黑客才干的事儿,但实际情况并不是这样,做过手机游戏开发的小伙伴应该都知道,一个游戏包从开发测试到最终在游戏商店上架,中间会经过,代码混淆,增加渠道资源,包体加固等等,这些工作都需要使用反编译和再次打包的技术。
安卓反编译用到的主要工具就是ApkTool了,最常用的命令如:
反编译apk包
apktool d app.apk
打包成apk文件
apktool b app
但在实际使用过程中,有时可能反编译会失败,大多数原因是使用的apktool版本与生成apk的安卓版本不匹配,特别是使用最新的安卓SDK版本,这时候我们可以下载最新的apktool,如果还是解决不了问题,那就只能等apktool官方升级了。但是! 如果我们使用Java调用apktool,如果apktool还没有兼容最新版本的安卓SDK,那我们就可以自己来升级啦。
Java调用apktool反编译方法:
import brut.androlib.Androlib;
import brut.androlib.ApkDecoder;
public void decompile() {
ApkDecoder decoder = new ApkDecoder();
decoder.setApkFile(apkFile);
decoder.setForceDelete(true);
decoder.setDecodeSources((short) 16);
decoder.setOutDir(outputDir);
decoder.decode();
}
读取AndroidManifest.xml清单文件:
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public static Document readAndroidManifest(){
File manifestFile = new File(apkFile.getDecompiledDirectory(), "AndroidManifest.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(manifestFile);
doc.getDocumentElement().normalize();
return doc;
}
修改APK包名
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public static void renamePackage(Document manifestDoc, String newPackage){
Element element = getElementByTag(manifestDoc,newPackage);
element.setAttribute("package",newPackage);
}
public static Element getElementByTag(Document document, String tag) {
NodeList elementList = document.getElementsByTagName(tag);
if (elementList.getLength() != 1)
return null;
Node nNode = elementList.item(0);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
return (Element) nNode;
}
return null;
}
经过了一顿操作,往包里加入了我们自己的料,最终再次打包生成apk。
重新生成apk文件
import brut.androlib.Androlib;
import brut.androlib.ApkOptions;
public void builder() {
ApkOptions apkOptions = new ApkOptions();
new Androlib(apkOptions).build(apkFile.getDecompiledDirectory(), outFile);
}
以上是反编译及二次打包常用方法介绍,获取更多资料及下载全部代码,请访问AnyPacker官网。