android反射混淆
❶ android項目對apk進行混淆
混淆apk是一個很基礎的工作,博客上也有一堆介紹,本文提供一下這類工作的解決思路。在安卓源碼下面和android studio裡面的做法差異不大,本文以android源碼舉例。
首先在對應mk文件裡面添加proguard enabled的語句,系統有一個自帶的build/core/proguard.flags,默認是使用這個文件,而且一般項目默認是關閉的,這也是有原因的。因為這里的proguard.flags是沒有針對app的配置的,使用默認的混淆,app很有可能就不工作了。
添加了mk文件修改之後,在Android.mk同級根目錄創建本app自有的proguard.flags。新增內容如下,這里需要注意,網上很多demo,基本分為三部分,一部是保留app基礎功能部分的內容不混淆;2是保持app對外介面,例如get、set、isxx、AIDL、public、native層的介面或者類;3.是第三方jar包或介面。混淆的基本原理就是將上訴類或介面進行統一簡單字母的替換,如果改變了這些對外介面的名字,很有可能被別人使用的時候就找不到對應哦介面
一些第三方的庫如何不進行混淆,這個根據項目特點,可以自行搜索,比如網路的地圖包什麼的。
然後是如何驗證和解決混淆過程遇到的問題,因為是對介面名進行替換,如果出現混淆問題的話,log裡面一定會有類似
這個時候只需要對相關介面進行例外(-keep)即可,然後用android-studio,直接打開或者dex2jar進行反解可以看到相關的介面是否被簡單替換。
❷ Androidx的混淆代碼
在debug上開混淆沒問題,在release上開判穗巧混淆就閃退了。
報androidx.viewpager2.widget.ViewPager2找不到,反射掘鍵族陪出錯。
❸ android開發代碼混淆都混淆哪些
代碼混淆(code obfuscation)是指將計算機程序的代碼,轉換成一種功能上等價,所謂功能上的等價是指其在變換前後功能相同或相近。其解釋如下:程序P經過混淆變換為P『,若P沒有結束或錯誤結束,那麼P』也不能結束或錯誤結束;而且P『程序的結果應與程序P具有相同的輸出。否則P』不是P的有效的混淆。
目前對於混淆的分類,普遍是以Collberg 的理論為基礎,分為布局混淆(layout obfuscation)、數據混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。
1. 布局混淆
布局混淆是指刪除或者混淆軟體源代碼或者中間代碼中與執行無關的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。軟體源代碼中的注釋文本、調試信息可以直接刪除,用不到的方法和類等代碼或數據結構也可以刪除,這樣即可以使攻擊者難以理解代碼的語義,也可以減小軟體體積,提高軟體裝載和執行的效率。軟體代碼中的常量名、變數名、類名和方法名等標識符的命名規則和字面意義有利於攻擊者對代碼的理解,布局混淆通過混淆這些標識符增加攻擊者對軟體代碼理解的難度。標識符混淆的方法有多種,例如哈希函數命名、標識符交換和重載歸納等。哈希函數命名是簡單地將原來標識符的字元串替換成該字元串的哈希值,這樣標識符的字元串就與軟體代碼不相關了;標識符交換是指先收集軟體代碼中所有的標識符字元串,然後再隨機地分配給不同的標識符,該方法不易被攻擊者察覺;重載歸納是指利用高級編程語言命名規則中的一些特點,例如在不同的命名空間中變數名可以相同,使軟體中不同的標識符盡量使用相同的字元串,增加攻擊者對軟體源代碼的理解難度。布局混淆是最簡單的混淆方法,它不改變軟體的代碼和執行過程。
2. 數據混淆
數據混淆是修改程序中的數據域,而對代碼段不作處理。常用的數據混淆方式有合並變數、分割變數、數組重組、字元串加密等。
合並變數是將幾個變數合並為一個數據,原來的每個變數占據其中一個區域,類似於一個大的數據結構。分割變數則是將一個變數分割為兩個變數,對分割前後提供一種映射關系,將對一個變數的操作轉化為對分割後兩個變數的操作。
數組重組有數組的分割、合並、折疊和平滑等幾種方式。分割是將一個數組分成2個或多個相同維度的數組;合並則相反;折疊是增加數組的維數;平滑則是相反。
在ELF文件中,全局變數和常量字元串存放在數據段中,反匯編工具可以輕易查找到字元串與代碼之間的引用關系。在軟體破解中,通過一些字元串提示可以很方便的找到代碼關鍵語句,從而破解軟體。字元串加密則可以對這些明顯的字元串進行加密存儲,在需要時再進行解密。
3. 控制混淆
控制混淆也稱流程混淆,它是改變程序的執行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟體的目的。一般採用的技術有插入指令、偽裝條件語句、斷點等。偽裝條件語句是當程序順序執行從A到B,混淆後在A和B之間加入條件判斷,使A執行完後輸出TRUE或FALSE,但不論怎麼輸出,B一定會執行。
控制混淆採用比較多的還有模糊謂詞、內嵌外聯、打破順序等方法。
模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。所以加入後將干擾反匯編者對值的分析。模糊謂詞的使用一般是插入一些死的或不相關的代碼(bogus code),或者是插入在循環或分支語句中,打斷程序執行流程。
內嵌(in-line)是將一小段程序嵌入到被調用的每一個程序點,外聯(out-line)是將沒有任何邏輯聯系的一段代碼抽象成一段可被多次調用的程序。
打破順序是指打破程序的局部相關性。由於程序員往往傾向於把相關代碼放在一起,通過打破順序改變程序空間結構,將加大破解者的思維跳躍。
4. 預防混淆
預防混淆一般是針對專用的反編譯器設計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設計。預防混淆對於特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設計。
❹ android 代碼混淆演算法有哪些
根據 SDK 的版本不同有 2 中不同的代碼混淆方式,以上的 proguard.cfg 參數詳解中所涉及到的信息是在較低版本 SDK 下的混淆腳本,事實上在高版本的 SDK 下混淆的原理和參數也與低版本的相差無幾,只是在不同 SDK 版本的環境下引入混淆腳本的方式有所不同。具體方法如下:
低版本 SDK 下,項目中同時包含 proguard.cfg 和 project.properties 文件,則只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再將項目 Export 即可。
高版本 SDK 下,項目中同時包含 proguard-project.txt 和 project.properties 文件,這時需要在 proguard-project.txt 文件中進行如下信息的配置,然後再將項目 Export 即可。下面以真實的文件進行演示說明。
復制代碼
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-16
復制代碼
以上的配置信息即是 project.properties 文件中內容,藍色文字為我們在代碼混淆過程中需要添加的配置信息,其中:sdk.dir 為你在當前機器上 SDK 的安裝路徑。如果想保留某個包下的文件不被混淆,可以在 proguard-project.txt 文件中加入保留對應包名的語句即可。
復制代碼
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
-dontwarn com.cnki.android.cnkireader.**
-keep class com.cnki.android.cnkireader.** { *; }
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the javaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
復制代碼
❺ Android中不能做代碼混淆的程序有哪些
常見的不能混淆的AndroidCodeAndroid 程序 ,下面這樣代碼混淆的時候要注意保留。x0dx0ax0dx0aAndroid系虛虛嫌統組件,系統組件有固定的方法被系統調用。x0dx0ax0dx0a被Android Resource 文件引用到的。名字已經固定,也不能混淆,比如自定義的View 。x0dx0ax0dx0aAndroid Parcelable ,需要使用android 序列化的。x0dx0ax0dx0a其他Anroid 官譽尺方建議 不混淆的,如x0dx0ax0dx0aandroid.app.backup..preference.Preferencex0dx0acom.android.vending.licensing.ILicensingServicex0dx0aJava序列化方法,系統序列化需要固定的方法。x0dx0ax0dx0a枚舉 ,系統需要處理枚舉的固定方法。x0dx0ax0dx0a本地方法,不能修改本地方法名x0dx0ax0dx0aannotations 注釋x0dx0ax0dx0a差手資料庫驅動x0dx0ax0dx0a有些resource 文件x0dx0ax0dx0a用到反射的地方
❻ android 混淆
其實不要混淆的主旨就在於混淆會改變方法的名字,類的名字,但是對於外部的一些引用是通過名字找到對應的方法,類,這些可能是通過string找到方法,類,但是string里的欄位是不會進行混淆,所以還是會保留原來的名字,這樣混淆過後通過原來的名字去找混淆後的名字,是肯定找不到,所以就會報出nosuchfileException,(對於gson,反射,jsbridge,第三方庫都是這個原因),至於說枚舉類型,我還暫時沒懂 為什麼,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結,消化成自己的知識了,若有什麼錯誤的地方,還望指出,相信讀了這兩篇文章之後你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什麼不能混淆
-keepclasseswithmembernames class * { # 保持native方法不被混淆 native <methods>; }
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
發布一款應用除了設minifyEnabled為ture,你也應該設置zipAlignEnabled為true,像Google Play強制要求開發者上傳的應用必須是經過zipAlign的,zipAlign可以讓安裝包中的資源按4位元組對齊,這樣可以減少應用在運行時的內存消耗。
原文: http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/
其實不要混淆的主旨就在於混淆會改變方法的名字,類的名字,但是對於外部的一些引用是通過名字找到對應的方法,類,這些可能是通過string找到方法,類,但是string里的欄位是不會進行混淆,所以還是會保留原來的名字,這樣混淆過後通過原來的名字去找混淆後的名字,是肯定找不到,所以就會報出nosuchfileException,(對於gson,反射,jsbridge,第三方庫都是這個原因),至於說枚舉類型,我還暫時沒懂 為什麼,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結,消化成自己的知識了,若有什麼錯誤的地方,還望指出,相信讀了這兩篇文章之後你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什麼不能混淆
❼ 寫給Android 混淆小白的快速混淆方法
簡單來說,Android 進行ProGuard,可以起到壓縮,混淆,預檢,優化的功能,雖然不能說更安全但還是一個不容忽視的環節。
首先在build.gradle 中將混淆的開關打開,即 minifyEnabled 置為 true
然後就要去proguard-rules.pro寫入我們的混淆的規則(如文件其名),防止重要的類被混淆移除了。
省事第一步,先套個模板,就是找到網上博客上別人分享好的模板,像四大組件,主流開源庫,JNI調用本地方法,R資源等的混淆規則都一般有了,注意一點就是套模板,也要套個時間比較近的,沒有翻車的模板,可以能比較節省自己的時間,畢竟這么多行不一定能快速看出來,打個包出來才發現有問題就尷尬啦。
一般來說,用了混淆的模板後,我們還會有很多項目專屬的需要混淆的部分,例如我們的自定義View,Json解析的實體類,反射用到的類,還有我們依賴的非主流的開源框架,SDK等等。
對於自定義View,很多的模板都會將繼承與View的類用keep指令防止被混淆。有個偷懶的方法就是把自定義View 放入同一個包,再把這個包的類都寫入混淆規則,就可以搞定了。
對於Json解析的實體類,反射用到的類都是同理可得,找到那些不能被移除的,把它們寫入自己的混淆規則裡面。
所以如果在做項目時,有提前想到要給項目做混淆的,在導入依賴時就順手把對應混淆規則寫了,那事後就快活似神仙了。
首先,先判斷下它是否內置了混淆規則。如果不聲明它的混淆規則也正常運行,說明已經它帶了混淆。
但是生活往往不會一帆風順,一般來說會有各種報錯,所以還是需要對它聲明混淆。
最簡單的辦法就是找到依賴的這個包,就這個包的類都寫入混淆規則。例如:
項目里導入了一個非主流的開源庫,然後我需要對它寫入混淆規則,確保它能正常工作。
這時候不可以認為直接去使用它的地方,將有關它 import的類 keep class 就可以。
因為可能它內部還會使用包內其他類,所以最好仔細排查,最簡(tou)單(lan)就是把這個包的類都 用 keep 指令,防止它們被混淆。如下所示:
一般來說就可以防止這個開源庫里的類被混淆了。
例如
先使用 -libraryjars 命令 ,對導入的jar包和 so 文件進行聲明保留它們。
如果依舊出錯,嘗試去External library文件夾 或者使用 這個SDK的地方 找到這個 SDK的包找到,並把這個包里的類 都用 keep 指令保持不被移除。如:
根據包名,寫入混淆規則
一般來說,這樣就可以避免這個SDK的類被混淆啦
好了,最後附上一份自己做的項目的混淆規則(偽模板)
❽ android項目中加入zxing,混淆打包出錯,求解決
寫在視圖xml中的onClick響應出錯. 因為寫在xml中的onClick是通過反射調用的, proguard認為它們沒有在代碼中被調用過, 所以將它們從代碼中除掉或改名了. 解決方法:
在proguard.cfg中添加以下代碼, 就可以防止被配在視圖xml中的onClick方法被proguard優化掉
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}123123
jni反調Java方法
這些類或方法同樣可能會被proguard認為沒有調用過而被除掉, 或都被改名. 這些方法最好統一寫在一個類中, 然後這個類不作優化, 或是找出所有jni調用過的類與方法, 在proguard.cfg中配置, 不對它們作優化
其它反射調用的java類與方法
使用反射時一定要注意proguard可能會認為那些方法未被調用過, 會在代碼優化過程中將它們改名或除去. 在使用反射的地方一定要在proguard.cfg中配置, 不優化反射調用過的類和方法
最後在proguard優化過後會產生一些文件
mp.txt – 描述.apk文件中所有類文件間的內部結構
mapping.txt – 列出了原始的類,方法和欄位名與混淆後代碼間的映射。這個文件很重要,當你從release版本中收到一個bug報告時,可以用它來翻譯被混淆的代碼。
seeds.txt – 列出了未被混淆的類和成員
usage.txt – 列出了從.apk中刪除的代碼
要注意分析mapping.txt與usage.txt看xml視圖中寫的onClick響應函數, jni調用到的java類與方法, 反射調用過的類與方法是否被混淆或重命名
-keep class com.badlogic.gdx.backends.Android.**{ *;}
的只是不混淆:這個包下的類(不包括子包里的東西),用到一個第三文的類就要把這個類所在的包,像上面加上
還要注意的是android-support-v4.jar這個包問題,這里加上了對這個jar包的處理
第三方jar的混淆,
-optimizationpasses 5
-dontusemixedcaseclassnames
-
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity // 繼承activity,application,service,broadcastReceiver,contentprovider....不進行混淆
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.
-libraryjars /libs/android-support-v4.jar
-libraryjars /libs/gdx-backend-android.jar
-libraryjars /libs/gdx.jar123123
// 這里不對第三方的jar包的提出WARN
-dontwarn com.badlogic.**
-dontwarn android.support`這里寫代碼片`.v4.**
-dontwarn android.support.v4.view.**12341234
// 這里對第三方jar包的類不進行混淆
-keep class com.badlogic.gdx.backends.android.**{ *;}
-keep class com.badlogic.gdx.**{ *;}
-keep class com.badlogic.gdx.graphics.g2d.**{ *;}
-keep class com.badlogic.gdx.graphics.**{ *;}
-keep class android.support.v4.view.**{ *;}123456123456
// 這里第三方JAR包處理結束
-keepclasseswithmembernames class * { // natvie 方法不混淆
native ;
} 12341234
-keepclasseswithmembers class * {
// 對於所有類,有這個構造函數不進行混淆,主要是為了在layout中的,自定義的view
public (android.content.Context, android.util.AttributeSet);
} 12341234
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
} 123123
-keepclassmembers class * extends android.app.Activity {
// 這個主要是在layout 中寫的onclick方法android:onclick="onClick",不進行混淆
public void *(android.view.View);
} 12341234
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
} 12341234
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
❾ android 混淆 什麼意思
Android代碼混淆,是為了你的apk被他人反編譯之後拿到源碼,如果你混淆了,那反編譯後的apk所有的java類都被改成了a.java/c.java之類的文件名,類裡面的屬性也變成abc之類的了,想拿到你的源碼就不可能了,直接在gradle(app)文件的android節點下加上下邊代碼。
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
❿ android如何將混淆代碼還原
當混淆後的代碼輸出一個堆棧信息時,方法名是不可識別的,這使得調試變得很困難,甚至是不可能的。幸運的是,當ProGuard運行時,它都會輸出一個<project_root>/bin/proguard/mapping.txt文件,而這個文件中包含了原始的類,方法和欄位名被映射成的混淆名字。
retrace.bat腳本(Window)或retrace.sh腳本(Linux,Mac OS X)可以將一個被混淆過的堆棧跟蹤信息還原成一個可讀的信息。它位於<sdk_root>/tools/proguard文件夾中。執行retrace工具的語法如下:
retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
例如:
retrace.bat -verbose mapping.txt obfuscated_trace.txt
如果你沒有指定<stacktrace_file>,retrace工具會從標准輸入讀取。