Android安全專項-Apk加固淺析

來源:互聯網
上載者:User

Android安全專項-Apk加固淺析

0x00

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

0x01

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

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

從途中可知我們的主Activity為doctorq.com.mysourceapk.MainActivity

還有一個Activity名為doctorq.com.mysourceapk..SubActivity

記住你建立的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: main03-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime: Process: xposed.doctorq.com.decode2, PID: 1672103-23 13:50:12.258 16721-16721/xposed.doctorq.com.decode2 E/AndroidRuntime: java.lang.NoClassDefFoundError: doctorq/com/mysourceapk/SubActivity03-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 implementation03-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.apkI: Using Apktool 2.0.3 on testerhome.apkI: Loading resource table...I: Decoding AndroidManifest.xml with resources...I: Loading resource table from file: /Users/wuxian/Library/apktool/framework/1.apkI: 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中,這又怎麼辦呢?我暫時也不知道,思考一下吧

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.