成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Andorid APK反逆向解決方案:梆梆加固原理探尋

移動開發 Android
梆梆是一個面向Android開發者的應用保護解決方案,它可以有效的阻止Android APK包被逆向工程破解,從而保護開發者的利益,防治打包黨。那么它到底是如何實現這一效果的呢,梆梆的解決方案真的無懈可擊嗎?來看網友對其技術實現的分析。

一、序言

目前Android市場充斥著大量的盜版軟件,開發者的官方應用被“打包黨”們惡意篡改。如何使程序代碼免受盜版篡改就成了開發者面臨的頭等大事,今天我們將分析一個不錯的解決方案---梆梆加固(http://www.secneo.com/appProtect/)。

通過對App進行加固保護。梆梆可以有效防止移動應用在運營推廣過程中被破解、盜版、二次打包、注入、反編譯等破壞,保障程序的安全性、穩定性,對移動應用的整體邏輯結構進行保護,保證了移動應用的用戶體驗。

二、梆梆加固逆向分析過程

首先我們通過對APK加固前后文件結構的比較,來了解梆梆加固對APK文件所做的處理。為了使分析過程足夠簡單,我新建一個最簡單的測試程序,并上傳到梆梆加固,整個加固過程大概需要4天的時間才可以完成,這是一個漫長的等待過程。

該測試程序包含了Activity、Service、ContentProvider、BroadcastRecevier四大組件、Application、普通類、Jni調用等7類對象,目的就是全面的了解梆梆的加固效果。

1、apk加固前后靜態文件結構及動態運行時對比分析

(1) 加固前后靜態文件結構變化(左為加固前,右為加固后)

加固后apk新增以下文件:

                  assets\meta-data\manifest.mf  //APK文件列表SHA1-Digest
                  assets\meta-data\rsa.pub        //RSA公鑰信息
                  assets\meta-data\rsa.sig         //數字簽名文件
                  assets\classes.jar                    //已加密原classes.dex文件
                  assets\com.example.hellojni    //ARM平臺二進制可執行文件
                  assets\com.example.hellojni.x86  //x86功能同上
                  libs\armeabi\libsecexe.so        //ARM平臺共享庫文件
                  libs\x86\libsecexe.so               //x86功能同上

加固后修改文件:

                 AndroidMainfest.xml  //(如果應用配置有Application信息,則該文件加固前后相同,如果應用未配置Application信息,則該文件加固前后不相同,梆梆會配置Application信息為自己實現類)
                 classes.dex

對classes.dex進行反編譯,觀察代碼樹結構變化:(左為加固前,右為加固后)

(2)加固前后動態運行時變化

運行原程序,系統僅創建一個相關進程,但是加固的程序,系統會為其同時創建三個相關程序進程:

進程啟動順序:597進程創建605進程,605進程又創建了607進程

通過查看maps文件獲取597進程映射文件信息

通過map文件可以看出,597進程為主進程,android各組件在該進程中運行。

605和607進程并無與apk文件相關文件信息,通過cmdline查看啟動參數:

初步懷疑該進程為assets\com.example.hellojni 可執行文件運行結果。

2、梆梆加固保護效果分析

我們通過逆向分析加固后的app,來看看梆梆加固對app的保護效果。

程序代碼的第一執行點是Application對象,首先查看TestApplication類對象。

程序的Util類完成大部分的java層邏輯,

ACall類主要完成對libsecexe.so JNI的調用:

查看libsecexe.so文件導出函數,發現所有函數名都經過加密處理,與我們平時jni調用產生的函數名并不同。平時jni產生的函數名應該為這樣格式Java_com_secapk_wrapper_ACall_{函數名}

抗靜態分析:

Util類通過MyClassLoader完成對加密classes.jar的動態加載,內存中解密classes.jar,完成動態加載。

jni方法對應so函數名的混淆。

抗動態調試: 

當使用IDA動態調試該程序時,程序無法建立連接調試。

梆梆加固可以有效常用的逆向分析方法。

#p#

三、梆梆加固技術實現關鍵點猜想

(1)如何使DexClassLoader動態加載組件具有生命周期?

根據APK文件是否在AndroidManifest.xml配置Applicaiton信息,梆梆加固會做不同的處理:

通過上傳Applicaiton不同配置的APK文件,我們發現:

當APK配置有Applicaition信息時,梆梆加固重寫Application類

當APK未配置Application信息時,梆梆加固新建類,并在AndroidManifest.xml中配置自己Application類

因此Applicaiton就是程序的第一執行點。

我們知道DexClassLoader加載的類是沒有組件生命周期的,也就是說即使DexClassLoader通過對dex的 動態加載完成了對組件類的加載,              當系統啟動該組件時,還會出現加載類失敗的異常。我已經在“Android APK加殼技術方案”中提出了一種使DexClassLoader加載組件類具有生命周期的方法。

運行加固后的程序并通過Mat內存分析工具查看類加載情況:

如上圖所示,組件類的加載類已經被修改為com.secapk.wrapper.MyClassLoader類,可以得出結論,該方式和我提出方式基本相同,通過修改系統組件類ClassLoader來實現。

(2)如何混淆native方法在so庫函數對應關系?

 jni方法注冊方式有兩種:

1、通過javah產生函數頭,該種方式產生的方法具有固定的格式。該方式使逆向分析人員比較容易獲取java層native方法對應的本地方法。

2、在JNI_OnLoad方法中手動注冊jni方法,不易查找對應關系。

使用第二種方式可以實現混淆java層native方法和so函數的對應關系。

  1. #include <string.h>   
  2. #include <jni.h>   
  3.    
  4. JNIEXPORT jstring JNICALL abcdefghijklmn( JNIEnv* env,jobject thiz )   
  5. {   
  6.     return (*env)->NewStringUTF(env, "Hello from JNI !");   
  7. }   
  8.    
  9. JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)   
  10. {   
  11.     JNIEnv* env = NULL;   
  12.     jint result = -1;   
  13.    
  14.     if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {   
  15.         return JNI_ERR;   
  16.     }   
  17.     JNINativeMethod gMethods[] = {   
  18.         { "stringFromJNI""()Ljava/lang/String;", (void*)abcdefghijklmn },   
  19.     };   
  20.     jclass clazz = (*env)->FindClass(env, "com/example/hellojni/HelloJni");   
  21.        
  22.     if (clazz == NULL) {   
  23.         return JNI_ERR;   
  24.     }   
  25.     if ((*env)->RegisterNatives(env, clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0){   
  26.         return JNI_ERR;   
  27.     }   
  28.     /* success -- return valid version number */   
  29.     result = JNI_VERSION_1_4;   
  30.     return result;   
  31. }   

以上代碼中的字符串都是明文(比如“stringFromJNI”),如果這些文明字符串都換成密文的話,再通過運行時解密,相應的對應關系更不易看出。

(3)如何使DexClassLoader加載加密的dex文件?

雖然不了解梆梆加固是怎么做的,不過通過分析它的運行邏輯,我推測了一種可行的實現方案:了解該方案需要對 Android DexClassLoader的整個加載流程需要有清 晰的了解。

首先推斷assets\classes.jar是一個加密的jar包。

正常的DexClassLoader加載的流程如下:會有一個DexOpt產生odex過程

但是梆梆加固后的應用DexClassLoader加載過程并沒有該過程的log信息。

推斷加密的jar包里面含有odex文件,如果不是odex文件的話,DexClassLoader肯定會在運行時釋放未加密的odex文件到目錄,這樣的話被保護的邏輯也就泄露了。

DexClassLoader加載過程會在java層和C層產生不同的數據結構,java層并沒有實質性的數據, 所有的數據都在c層,我們可用通過底層代碼完成dex數據的解析。底層dex分析是可以支持byte[]數組的,解密 odex數據,傳遞過去就行了。這樣java層就可以調用了。

以下是大概偽代碼實現步驟:

  1. int loadDex(char * dexFileName) 
  2.     char *dvm_lib_path = "/system/lib/libdvm.so"
  3. void * handle; 
  4. DvmGlobals gDvm; 
  5.     handle = dlopen( dvm_lib_path, int mode); 

1、讀取dexFileName文件內容并解密到byte數組。

2、調用dexFileParse函數解析byte數組為DexFile

\dalvik\libdex\DexFile.c

DexFile* dexFileParse(const u1* data, size_t length, int flags)//dlsym(handle, "dexFileParse");

3、調用allocateAuxStructures轉換DexFile為DvmDex,(由于該方法為static方法,因此需要按照其邏輯自行實現)

\dalvik\vm\DvmDex.c

static DvmDex* allocateAuxStructures(DexFile* pDexFile) 

4、添加DvmDex到gDvm.userDexFiles

\dalvik\vm\Init.c

struct DvmGlobals gDvm; //gDvm = dlsym(handle, "gDvm");

5、修改MyDexClassLoader中的mDexs對象的mCookie值,mCookie主要用于映射底層DvmDex數據DexClassLoader.mDexs[0].mCookie值

(4)so如何實現程序的反調試?

同linux反調試基本原理相同,這里提供一種方式就是在JNI_Onload中調用ptrace方 法,ptrace被廣泛用于調試(比如IDA)和進程代碼注入(比如LBE,金山等權限管理功能實現),一個進程只能被一個進程ptrace,如果你自己 調用ptarce,這樣其它程序就無法通過ptrace調試或者 向您程序進程注入代碼。

ptrace(PTRACE_TRACEME,0 ,0 ,0);

通過本人實驗,該種方式可以實現so的反調試。

三、總結

通過以上分析,梆梆加固的確可以有效防止移動應用在運營推廣過程中被破解、盜版、二次打包、注入、反編譯等破壞,不過如果Android惡 意軟件也通過這種方式加固保護,這將會給移動安全分析人員帶來巨大的挑戰,因為安全分析人員經常使用的代碼靜態邏輯分析和動態調試分析在該情況下都失效了。

梆梆官方聲稱不會對惡意軟件進行加固,的確在加固的過程中發現存在安全軟件掃描信息和云測試處理流程,不過這些措施只能減少而不能徹底杜絕惡意軟件通過梆梆加固保護。如何不被惡意軟件利用是梆梆需要解決的問題。

責任編輯:徐川 來源: 看雪安全論壇
相關推薦

2016-09-18 17:05:23

2010-11-24 14:15:00

2009-11-17 15:00:03

2025-06-09 07:45:00

2023-06-04 00:05:10

2023-09-14 15:44:46

分布式事務數據存儲

2022-05-19 13:33:39

系統客戶端鏈路追蹤

2018-12-03 12:17:27

Semptian解決方案

2012-05-27 16:21:31

IDC華為

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:26:30

YADRO解決方案

2018-12-03 12:13:21

Mellanox解決方案

2016-01-08 15:44:31

東華網智反統方醫院

2009-05-14 19:18:54

虛擬化災備服務器

2016-03-13 17:58:57

2009-07-15 17:09:32

Swing線程

2010-12-21 17:28:58

2012-05-27 17:01:36

華為云教育數據

2018-12-03 12:23:45

IBMMCM解決方案
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内精品99 | 午夜精品一区二区三区三上悠亚 | 国产福利在线 | 中文字幕精品一区二区三区精品 | 免费人成在线观看网站 | 涩涩鲁亚洲精品一区二区 | av看片网站| 久久久久一区二区三区 | 欧美一区二区三区国产精品 | 中文字幕高清一区 | 亚洲国产18| 免费视频一区二区 | 一区二区小视频 | 五月天天色 | 黄色电影在线免费观看 | 日本一区视频在线观看 | www.久久久| 欧美精品福利 | 国产精品久久久久久亚洲调教 | 521av网站| 伊人看片| 日本在线中文 | 亚洲国产一区二区三区在线观看 | 狠狠干网站 | 久草网址| 国产偷录视频叫床高潮对白 | 日本精品999| 日日夜夜精品免费视频 | 欧美成年黄网站色视频 | 亚洲精品免费视频 | 精品久久久久久久久久 | 日本亚洲欧美 | 97av视频在线观看 | 国产精品视频一区二区三区不卡 | 欧美精品一区二区三区四区 在线 | 欧美精品在欧美一区二区 | 久久国内 | 国产一区二区在线免费视频 | 成人午夜激情 | 中文字幕乱码亚洲精品一区 | 亚洲精品一级 |