Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android安全專項-Apk加固淺析

Android安全專項-Apk加固淺析

編輯:關於Android編程

0x00

原理部分我不獻丑了,上面3篇文章說的很清楚,我直接實戰,講述從0開始如何最終實現加固的整個過程,踩了不少坑。

0x01

第一步創建被加固Apk,就是你的源碼Apk。你做的工作就是防止這個Apk被破解。這個APK要注意以下幾點:

記住你的主Actvitiy名和其他Activity名

這裡寫圖片描述

從途中可知我們的主Activity為doctorq.com.mysourceapk.MainActivity<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPru509DSu7j2QWN0aXZpdHnD+86qPGNvZGU+ZG9jdG9ycS5jb20ubXlzb3VyY2VhcGsuLlN1YkFjdGl2aXR5PC9jb2RlPjwvcD4NCjxoMiBpZD0="記住你創建的application名">記住你創建的Application名

從圖中可知我們的Application為doctorq.com.mysourceapk.MyApplication

盡量不要添加布局文件

采用的方式和參考文章的做法是一樣的,顯式添加控件,如下:

 TextView content = new TextView(this);
        content.setText("I am Source Apk");
        content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(MainActivity.this, SubActivity.class);
                startActivity(intent);
            }
        });
        setContentView(content);

        Log.i("demo", "app:" + getApplicationContext());

activity的父類都為Activity

這裡寫圖片描述

繼承於AppCompatActivity在解殼程序中運行的時候報如下的錯誤,自身運行沒啥問題:


03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime: FATAL EXCEPTION: main
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime: Process: xposed.doctorq.com.decode2, PID: 16721
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime: java.lang.NoClassDefFoundError: doctorq/com/mysourceapk/SubActivity
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at doctorq.com.mysourceapk.MainActivity$1.onClick(MainActivity.java:21)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.view.View.performClick(View.java:4444)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:18440)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:733)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5001)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:  Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.DexFile.defineClassNative(Native Method)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.DexFile.defineClass(DexFile.java:222)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:215)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.DexPathList.findClass(DexPathList.java:322)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at doctorq.com.mysourceapk.MainActivity$1.onClick(MainActivity.java:21) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.view.View.performClick(View.java:4444) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:18440) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:733) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:136) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5001) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:515) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:806) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622) 
03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method) 

效果

這裡寫圖片描述

這個demo就是主界面上有一個TextView,可以點擊跳轉到下一個Activity。

這個時候我們能APK文件,這個文件我們第三步需要用。

0x02

第二步解殼程序,也就是源程序的宿主,他也是一個APK,但是這個APK需要注意的地方更多,我踩了很多坑:

修改AndroidManifest.xml

這個文件的修改位置很多,修改後如下所示:





    
        
        
            
                

                
            
        
        
        
    

主要修改位置有以下幾點:

添加meta-data信息

這個APPLICATION_CLASS_NAME指向的是我們源碼中的Application的子類,這也是之前特別提醒的原因

修改主Activity

我們要講解殼程序本身的Activity替換成源碼的主Activity,這個時候解殼程序裡的activity其實是沒有用的,刪掉也不影響。


            
                

                
            
        

添加其他Activity

我們在源碼程序的中activity都要在解殼程序的配置文件中配置:

 
        

在ProxyApplication的修改

主要修改就是主Activity的修改:


 try {
                Object actObj = dLoader.loadClass("doctorq.com.mysourceapk.MainActivity");
                Log.i("demo", "actObj:" + actObj);
            } catch (Exception e) {
                Log.i("demo", "activity:" + Log.getStackTraceString(e));
            }

打包

因為你修改的包名啊,activity名啊,是識別不了的,這個時候可以通過gradleassemble來打包。

這個時候得到我們解殼程序的APK和dex文件,這兩個文件我們一會都要用。

這裡寫圖片描述

0x03

第三步加固工具,這個工具是一個java項目,我們在eclipse中創建:具體的原理是將源碼APK加到解殼程序的dex文件後面。這個沒什麼坑,沒啥可講的,加固成功後,會得到一個產物,我們將這個產物命名為classes.dex,因為一會要替換到解殼APK中的classes.dex文件。

這裡寫圖片描述

0x04

第四步是替換解殼程序中的classes.dex,這個時候用到WinRAR工具,首先找到解殼程序,然後刪除借殼程序中的classes.dex,添加第三部產生的classes.dex文件

這裡寫圖片描述

0x05

第五步是重簽名,因為APK被修改了,這個時候直接安裝,會報無簽名的錯誤,所以這個時候我們用Auto-sign這個工具去簽名,具體做法我在Android安全專項測試之反編譯中講過。

這裡寫圖片描述

安裝完畢後,可以打開我們的解殼程序了,這個時候一定要看清楚我們進的是解殼程序的app,而不是我們之前的源碼app:

這裡寫圖片描述

0x06

源碼下載地址

0x07

這個demo中我們的源碼中沒有布局文件,這在實際項目中是不可能,那麼這些布局文件怎麼添加,有人提出將所有布局文件添加到解殼程序中,這樣就能找到了。

0x08

我們做了這麼多,真的加固了麼?ok,我們來實驗下,我們用apktool來反編譯下:


58deMacBook-Pro-7:Auto-sign wuxian$ apktool d testerhome.apk
I: Using Apktool 2.0.3 on testerhome.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/wuxian/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

實際上是成功的,有的人就會瘋了,你不是說加固了,怎麼還能被反編譯了,我們來看看反編譯後的產物:

這裡寫圖片描述

你會發現,我們看不到源碼demo項目中的代碼,連包名都沒發現,你能看到的只是解殼程序的東西,我們加固的目的是起到了,但是解殼程序能被反編譯也是有風險的,畢竟我們的一些核心代碼寫在了ProxyApplication中,這又怎麼辦呢?我暫時也不知道,思考一下吧

   
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved