當前位置:首頁 » 安卓系統 » android40混淆

android40混淆

發布時間: 2023-01-07 03:54:00

① android 混淆 什麼意思

Android代碼混淆,是為了你的apk被他人反編譯之後拿到源碼,如果你混淆了,那反編譯後的apk所有的java類都被改成了a.java/c.java之類的文件名,類裡面的屬性也變成abc之類的了,想拿到你的源碼就不可能了,直接在gradle(app)文件的android節點下加上下邊代碼。

buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}

② 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進行反解可以看到相關的介面是否被簡單替換。

③ android源碼被混淆了怎麼還原

android源碼被混淆了還原方法為:
1、得到 classes.dex文件;直接用機器上的解壓軟體 打開 .apk 文件,解壓出 classes.dex 文件。
2、還原.jar文件;這一步需要用到一個工具 dex2jar (谷歌的代碼庫里有http://code.google.com/p/dex2jar/)下載完了,解壓,然後把第一步的 產物(即那個classes.dex文件)放到 dex2jar的解壓目錄(解壓目錄里 有 dex2jar.bat 文件,檢查一下,沒有的話說明目錄不對)。
3、查看.jar文件;這一步就是傳統的 反編譯 了,需要工具輔助,這里用到的工具是jd-gui(http://java.decompiler.free.fr/?q=jdgui)下載系統對應的版本,解壓,(xp系統)會看到一個 .exe文件,沒錯就是 單文件綠色版,雙擊,選擇 第二步 生成的 .jar,即可。

④ Android 混淆壓縮開啟以及自定義混淆規則

1. -keep[,修飾符,...] class_specification,keep混淆命令的模板,修飾符可以暫時不管,因為[]表示可選的;class_specification是對類以及類成員的描述,看下圖

2. -keep命令基本用法: 指定某個包,類,方法,變數和屬性不混淆

3.自定義混淆字典:替換默認的混淆字典,

4.保持源碼的行號、源文件信息不被混淆 方便在崩潰日誌中查看

⑤ android混淆會混淆註解嗎

android混淆會混淆註解。
如果不想註解被混淆,可以參考如下代碼試試:
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation { *; }

⑥ 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 混淆小白的快速混淆方法

簡單來說,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 混淆

其實不要混淆的主旨就在於混淆會改變方法的名字,類的名字,但是對於外部的一些引用是通過名字找到對應的方法,類,這些可能是通過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開發代碼混淆都混淆哪些

代碼混淆(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代碼混淆以及怎麼判斷一個apk代碼是否被混淆過

1、proguard原理
java代碼編譯成二進制class文件,這個class文件也可以反編譯成源代碼,除了注釋外,其他的code基本都可以看到。為了防止重要code被泄露,我們往往需要混淆,即把方法名,變數名,類名,包名等這些java元素的名稱改成讓人意想不到的名稱,這樣代碼結構就沒有變化,還可以運行,但是想弄懂代碼的架構卻很難。proguard就起到了這樣的作用:
一、它可以分析一組class的結構,根據用戶的配置,然後把這些class文件中可以混淆的java元素進行混淆

二、刪除無效的代碼

三、對代碼進行優化(使用adt插件導出的apk,還進行zipalign優化)

預設情況下,proguard會混淆所有代碼,但是下面幾種情況是不能改變java元素的名稱,否則就會導致程序出錯。
一、用到反射的地方(android中的api常用@hide注釋掉,開發者在調用相應的方法時,需要用到反射)

二、當app的代碼要依賴於系統的介面時,如被系統代碼調用的回調方法,這種方法比較復雜

三、java元素名稱是配置文件中配置好的

所以在使用proguard時,我們需要有個配置文件告訴proguard,哪些java元素是不能混淆的。

2、proguard配置

-dontwarn預設proguard會檢查每一個引用是否正確,但是第三方庫里往往有些不會用到的類,沒有正確引用,如果不配置的話,系統就會報錯。

-keep指定的類和類成員被保留作為入口

-keepclassmembes指定的類成員被保留。

-keepclasswithmembers指定的類和類成員被保留,假如指定的類成員存在的話。

熱點內容
扁桃玩的伺服器地址 發布:2025-05-17 12:18:25 瀏覽:509
u盤上傳歌 發布:2025-05-17 12:14:51 瀏覽:613
入門c語言設計 發布:2025-05-17 12:08:31 瀏覽:41
c3演算法 發布:2025-05-17 12:04:19 瀏覽:365
phprecv 發布:2025-05-17 11:55:00 瀏覽:611
福建時鍾監控網關伺服器雲主機 發布:2025-05-17 11:54:28 瀏覽:249
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:963
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:963
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:979
我的世界伺服器圈太大了怎麼辦 發布:2025-05-17 11:15:21 瀏覽:617