如何反编译360 apk文件

要做Android逆向第一步就是apktool.
apktool将apk中得代码反编译成smali代码.

然而,某些app利用apktool的一些"死角", 让其不能正常工作, 导致整个反汇编过程失败.
幸运的是apktool是开源的, 于是你自己编一个apktool来逆向那些app了~

首先来看, 默认情况下, 使用apktool反编译360手机卫士发生了什么:

命令:
代码:
  $ java -jar apktool.jar ~/Desktop/xxx/360.apk -f -o ~/Desktop/xxx/360.apk_out/
然后发生异常:
代码:
I: Using Apktool 2.0.3-831765-SNAPSHOT on 360.apk
I: Loading resource table...
Exception in thread "main" brut.androlib.AndrolibException: Multiple res specs: drawable/
  at brut.androlib.res.data.ResTypeSpec.addResSpec(ResTypeSpec.java:78)
  at brut.androlib.res.decoder.ARSCDecoder.readEntry(ARSCDecoder.java:248)
  at brut.androlib.res.decoder.ARSCDecoder.readTableType(ARSCDecoder.java:212)
  at brut.androlib.res.decoder.ARSCDecoder.readTableTypeSpec(ARSCDecoder.java:154)
  at brut.androlib.res.decoder.ARSCDecoder.readTablePackage(ARSCDecoder.java:116)
  at brut.androlib.res.decoder.ARSCDecoder.readTableHeader(ARSCDecoder.java:78)
  at brut.androlib.res.decoder.ARSCDecoder.decode(ARSCDecoder.java:47)
  at brut.androlib.res.AndrolibResources.getResPackagesFromApk(AndrolibResources.java:544)
  at brut.androlib.res.AndrolibResources.loadMainPkg(AndrolibResources.java:63)
  at brut.androlib.res.AndrolibResources.getResTable(AndrolibResources.java:55)
  at brut.androlib.Androlib.getResTable(Androlib.java:66)
  at brut.androlib.ApkDecoder.setTargetSdkVersion(ApkDecoder.java:198)
  at brut.androlib.ApkDecoder.decode(ApkDecoder.java:96)
  at brut.apktool.Main.cmdDecode(Main.java:165)
  at brut.apktool.Main.main(Main.java:81)
然后 我们发现什么都没有输出.
于是我们要解决这个问题.

解决这个问题的第一步就是, 要找到apktool源码的位置:(可能你需要翻墙)
  apktool的代码有两个下载地址(一个是github上, 一个是他们的官网上?) 粗略看了貌似代码是一样的:
  git clone https://github.com/iBotPeaches/Apktool.git
  git clone https://bitbucket.org/iBotPeaches/apktool.git
随便下载一个源码, 然后, 找到崩溃的最后一句的位置:
  ResTypeSpec.java的第78行: (被我注释掉的,就是第78行了:  是的, 直接注释掉, 就可以解决不能反编译360卫士的问题)
代码:
      public void addResSpec(ResResSpec spec) throws AndrolibException {
        if (mResSpecs.put(spec.getName(), spec) != null) {// fuck 360
            // throw new AndrolibException(String.format("Multiple res specs: %s/%s", getName(), spec.getName()));
        }
    }
为什么这里可以直接注释掉? 因为根据上下文来看, 这只是一个无关痛痒的异常, 没必要因为这个异常让反编译过程终止.  所以都懒得继续看什么, 直接注释掉这个异常,就OK了.

然后, 关于如何编译apktool工程, 请一定要参看其官网的描述:
====================================================
  http://ibotpeaches.github.io/Apktool/build/

How to Build Apktool from source
Apktool is a collection of 1 project, containing 5 sub-projects.

brut.apktool.lib - (Main, all the Library code)
brut.apktool.cli - The cli interface of the program
brut.j.dir - Utility project
brut.j.util - Utility project
brut.j.common - Utility project
smali - submodule of JesusFreke’s smali tool
The main project can be found below

https://github.com/iBotPeaches/Apktool

Requirements
JDK (1.7)
git
Build Steps
We use gradle to build. It’s pretty easy. First clone the repository.

git clone --recursive git://github.com/iBotPeaches/Apktool.git
cd Apktool
For steps 4-6 use ./gradlew for unix based systems or gradlew.bat for windows.
[./gradlew][gradlew.bat] applyPatches - Applies smali patches, creating brut.apktool.smali directory.
[./gradlew][gradlew.bat] build fatJar - Builds Apktool, including final binary.
Optional (You may build a Proguard jar) [./gradlew][gradlew.bat] build fatJar proguard
After 1-2 minutes you should have a jar file at

./brut.apktool/apktool-cli/build/libs/apktool-xxxxx.jar

Cleaning
Cleaning the project, removes all build directories and wipes the brut.apktool.smali directory. You must reapply patches via step 4 above to re-create the brut.apktool.smali. This must be done before building Apktool again..
====================================================
鉴于有的人英文不行? 那就提供一键编译方法吧:(Linux/MAC下)
  步骤一:首先进入到代码根目录, 要清理一下缓存目录:
     $ rm -rf brut.apktool.smali/ && rm ./brut.apktool/apktool-cli/build/libs/apktool-cli.jar
  步骤二: 在代码根目录, 一键编译:
    $ ./gradlew applyPatches && ./gradlew  build fatJar && ./gradlew  build fatJar proguard && ./brut.apktool/apktool-cli/build/libs/apktool-cli.jar

注: 如果是window下, 请讲上述步骤二的"./gradlew"全部替换为"gradlew.bat", 步骤一的清理缓存,请自行查找替代命令
注2: JDK1.7是编译必须的. 可能你还需要在本地配置下gradle命令环境, 也许不需要.



编译成功以后, 你就可以拿到apktool-xxxxx.jar. 
然后使用这个apktool-xxxxx.jar去反编译360试试?
代码:
  $ java -jar apktool-xxxxx.jar ~/Desktop/xxx/360.apk -f -o ~/Desktop/xxx/360.apk_out/
伸手党: apktool-cli.jar放在百度云盘了:
链接: http://pan.baidu.com/s/1i4oWc2D 密码: nktm

授人以鱼,不若授人以渔. 以上就是解决那些不能被反编译的apk的方法~

over 



最后把apktool-cli.jar 改为apktool.jar 替换apktool文件下的apktool.jar

在反编译就成功了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package com.qihoo360.mobilesafe.provider; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.os.ParcelFileDescriptor; import android.text.TextUtils; import bl; import c; import d; import e; import f; import g; import h; import i; import j; import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import k; import l; import m; import n; import o; import p; import q; import r; import s; import t; public class SafeGuardProvider extends ContentProvider { public static bl a; private static HashMap b; private static HashMap c; private static HashMap d; private static HashMap e; private static HashMap f; private static HashMap g; private static HashMap h; private static HashMap i; private static HashMap j; private static HashMap k; private static HashMap l; private static HashMap m; private static HashMap n; private static HashMap o; private static HashMap p; private static HashMap q; private static HashMap r; private static HashMap s; private static final UriMatcher t; static { UriMatcher localUriMatcher = new UriMatcher(-1); t = localUriMatcher; localUriMatcher.addURI("com.qihoo360.mobilesafeguard", "blacklist", 1); t.addURI("com.qihoo360.mobilesafeguard", "blacklist/#", 2); t.addURI("com.qihoo360.mobilesafeguard", "msg_history", 3); t.addURI("com.qihoo360.mobilesafeguard", "msg_history/#", 4); t.addURI("com.qihoo360.mobilesafeguard", "call_history", 5); t.addURI("com.qihoo360.mobilesafeguard", "call_history/#", 6); t.addURI("com.qihoo360.mobilesafeguard", "whitelist", 7); t.addURI("com.qihoo360.mobilesafeguard", "whitelist/#", 8); t.addURI("com.qihoo360.mobilesafeguard", "private_in_call", 9); t.addURI("com.qihoo360.mobilesafeguard", "private_in_call/#", 10); t.addURI("com.qihoo360.mobilesafeguard", "private_out_call", 11); t.addURI("com.qihoo360.mobilesafeguard", "private_out_call/#", 12); t.addURI("com.qihoo360.mobilesafeguard", "private_in_mms", 13); t.addURI("com.qihoo360.mobilesafeguard", "private_in_mms/#", 14); t.addURI("com.qihoo360.mobilesafeguard", "private_out_mms", 15); t.addURI("com.qihoo360.mobilesafeguard", "private_out_mms/#", 16); t.addURI("com.qihoo360.mobilesafeguard", "private_mms", 19); t.addURI("com.qihoo360.mobilesafeguard", "private_mms/#", 20); t.addURI("com.qihoo360.mobilesafeguard", "privatelist", 17); t.addURI("com.qihoo360.mobilesafeguard", "privatelist/#", 18); t.addURI("com.qihoo360.mobilesafeguard", "smartwhite", 21); t.addURI("com.qihoo360.mobilesafeguard", "smartwhite/#", 22); t.addURI("com.qihoo360.mobilesafeguard", "private_call_in", 23); t.addURI("com.qihoo360.mobilesafeguard", "private_call_in/#", 24); t.addURI("com.qihoo360.mobilesafeguard", "private_call_out", 25); t.addURI("com.qihoo360.mobilesafeguard", "private_call_out/#", 26); t.addURI("com.qihoo360.mobilesafeguard", "private_mms_in", 27); t.addURI("com.qihoo360.mobilesafeguard", "private_mms_in/#", 28); t.addURI("com.qihoo360.mobilesafeguard", "private_mms_out", 29); t.addURI("com.qihoo360.mobilesafeguard", "private_mms_out/#", 30); t.addURI("com.qihoo360.mobilesafeguard", "private_message", 33); t.addURI("com.qihoo360.mobilesafeguard", "private_message/#", 34); t.addURI("com.qihoo360.mobilesafeguard", "privatecontacts", 31); t.addURI("com.qihoo360.mobilesafeguard", "privatecontacts/#", 32); t.addURI("com.qihoo360.mobilesafeguard", "ipnouselist", 35); t.addURI("com.qihoo360.mobilesafeguard", "ipnouselist/#", 36); HashMap localHashMap1 = new HashMap(); b = localHashMap1; localHashMap1.put("_id", "_id"); b.put("contact_name", "contact_name"); b.put("phone_number", "phone_number"); b.put("blocked_type", "blocked_type"); HashMap localHashMap2 = new HashMap(); c = localHashMap2; localHashMap2.put("_id", "_id"); c.put("address", "address"); c.put("date", "date"); c.put("subject", "subject"); c.put("body", "body"); c.put("read", "read"); c.put("type", "type"); HashMap localHashMap3 = new HashMap(); d = localHashMap3; localHashMap3.put("_id", "_id"); d.put("address", "address"); d.put("date", "date"); d.put("read", "read"); d.put("block_type", "block_type"); HashMap localHashMap4 = new HashMap(); e = localHashMap4; localHashMap4.put("_id", "_id"); e.put("contact_name", "contact_name"); e.put("phone_number", "phone_number"); HashMap localHashMap5 = new HashMap(); f = localHashMap5; localHashMap5.put("_id", "_id"); f.put("name", "name"); f.put("number", "number"); f.put("date", "date"); f.put("blocked_type", "blocked_type"); HashMap localHashMap6 = new HashMap(); g = localHashMap6; localHashMap6.put("_id", "_id"); g.put("name", "name"); g.put("number", "number"); g.put("date", "date"); HashMap localHashMap7 = new HashMap(); h = localHashMap7; localHashMap7.put("_id", "_id"); h.put("name", "name"); h.put("address", "address"); h.put("date", "date"); h.put("subject", "subject"); h.put("body", "body"); HashMap localHashMap8 = new HashMap(); i = localHashMap8; localHashMap8.put("_id", "_id"); i.put("name", "name"); i.put("address", "address"); i.put("date", "date"); i.put("subject", "subject"); i.put("body", "body"); HashMap localHashMap9 = new HashMap(); j = localHashMap9; localHashMap9.put("_id", "_id"); j.put("name", "name"); j.put("address", "address"); j.put("date", "date"); j.put("subject", "subject"); j.put("body", "body"); j.put("mms_recv_type", "mms_recv_type"); j.put("mms_type", "mms_type"); j.put("read", "read"); HashMap localHashMap10 = new HashMap(); k = localHashMap10; localHashMap10.put("_id", "_id"); k.put("contact_name", "contact_name"); k.put("phone_number", "phone_number"); k.put("blocked_type", "blocked_type"); HashMap localHashMap11 = new HashMap(); l = localHashMap11; localHashMap11.put("_id", "_id"); l.put("p_n", "p_n"); l.put("s_a_t", "s_a_t"); HashMap localHashMap12 = new HashMap(); m = localHashMap12; localHashMap12.put("_id", "_id"); m.put("name", "name"); m.put("pre_number", "pre_number"); m.put("number", "number"); m.put("date", "date"); m.put("blocked_type", "blocked_type"); HashMap localHashMap13 = new HashMap(); n = localHashMap13; localHashMap13.put("_id", "_id"); n.put("name", "name"); n.put("pre_number", "pre_number"); n.put("number", "number"); n.put("date", "date"); HashMap localHashMap14 = new HashMap(); o = localHashMap14; localHashMap14.put("_id", "_id"); o.put("name", "name"); o.put("pre_address", "pre_address"); o.put("address", "address"); o.put("date", "date"); o.put("subject", "subject"); o.put("body", "body"); HashMap localHashMap15 = new HashMap(); p = localHashMap15; localHashMap15.put("_id", "_id"); p.put("name", "name"); p.put("pre_address", "pre_address"); p.put("address", "address"); p.put("date", "date"); p.put("subject", "subject"); p.put("body", "body"); HashMap localHashMap16 = new HashMap(); q = localHashMap16; localHashMap16.put("_id", "_id"); q.put("name", "name"); q.put("pre_address", "pre_address"); q.put("address", "address"); q.put("date", "date"); q.put("subject", "subject"); q.put("body", "body"); q.put("mms_recv_type", "mms_recv_type"); q.put("mms_type", "mms_type"); q.put("read", "read"); HashMap localHashMap17 = new HashMap(); r = localHashMap17; localHashMap17.put("_id", "_id"); r.put("contact_name", "contact_name"); r.put("pre_number", "pre_number"); r.put("phone_number", "phone_number"); r.put("blocked_type", "blocked_type"); HashMap localHashMap18 = new HashMap(); s = localHashMap18; localHashMap18.put("_id", "_id"); s.put("contact_name", "contact_name"); s.put("phone_number", "phone_number"); } public int delete(Uri paramUri, String paramString, String[] paramArrayOfString) { Object localObject1 = " AND ("; String str1 = ""; ContentResolver localContentResolver = null; SQLiteDatabase localSQLiteDatabase; try { localSQLiteDatabase = a.getWritableDatabase(); localObject1 = t.match(paramUri); switch (localObject1) { default: String str2 = "Unknown URI " + paramUri; localObject1 = new IllegalArgumentException(str2); label225: throw ((Throwable)localObject1); case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 19: case 20: case 17: case 18: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 33: case 34: case 31: case 32: case 35: case 36: } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值