android源碼被混淆了還原方法為:

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了扎賚諾爾免費建站歡迎大家使用!
1、得到 classes.dex文件;直接用機器上的解壓軟件 打開 .apk 文件,解壓出 classes.dex 文件。
2、還原.jar文件;這一步需要用到一個工具 dex2jar (谷歌的代碼庫里有)下載完了,解壓,然后把第一步的 產(chǎn)物(即那個classes.dex文件)放到 dex2jar的解壓目錄(解壓目錄里 有 dex2jar.bat 文件,檢查一下,沒有的話說明目錄不對)。
3、查看.jar文件;這一步就是傳統(tǒng)的 反編譯 了,需要工具輔助,這里用到的工具是jd-gui()下載系統(tǒng)對應(yīng)的版本,解壓,(xp系統(tǒng))會看到一個 .exe文件,沒錯就是 單文件綠色版,雙擊,選擇 第二步 生成的 .jar,即可。
其實不要混淆的主旨就在于混淆會改變方法的名字,類的名字,但是對于外部的一些引用是通過名字找到對應(yīng)的方法,類,這些可能是通過string找到方法,類,但是string里的字段是不會進行混淆,所以還是會保留原來的名字,這樣混淆過后通過原來的名字去找混淆后的名字,是肯定找不到,所以就會報出nosuchfileException,(對于gson,反射,jsbridge,第三方庫都是這個原因),至于說枚舉類型,我還暫時沒懂 為什么,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結(jié),消化成自己的知識了,若有什么錯誤的地方,還望指出,相信讀了這兩篇文章之后你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什么不能混淆
-keepclasseswithmembernames class * { # 保持native方法不被混淆 native methods; }
-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆 public static final Android.os.Parcelable$Creator *; }
發(fā)布一款應(yīng)用除了設(shè)minifyEnabled為ture,你也應(yīng)該設(shè)置zipAlignEnabled為true,像Google Play強制要求開發(fā)者上傳的應(yīng)用必須是經(jīng)過zipAlign的,zipAlign可以讓安裝包中的資源按4字節(jié)對齊,這樣可以減少應(yīng)用在運行時的內(nèi)存消耗。
原文:
其實不要混淆的主旨就在于混淆會改變方法的名字,類的名字,但是對于外部的一些引用是通過名字找到對應(yīng)的方法,類,這些可能是通過string找到方法,類,但是string里的字段是不會進行混淆,所以還是會保留原來的名字,這樣混淆過后通過原來的名字去找混淆后的名字,是肯定找不到,所以就會報出nosuchfileException,(對于gson,反射,jsbridge,第三方庫都是這個原因),至于說枚舉類型,我還暫時沒懂 為什么,還望共同學習,一起成長。
文章是讀了兩篇博客寫出來,也是自己總結(jié),消化成自己的知識了,若有什么錯誤的地方,還望指出,相信讀了這兩篇文章之后你也會懂混淆,一個是如何混淆,一個是哪些該混淆,為什么不能混淆
混淆apk是一個很基礎(chǔ)的工作,博客上也有一堆介紹,本文提供一下這類工作的解決思路。在安卓源碼下面和android studio里面的做法差異不大,本文以android源碼舉例。
首先在對應(yīng)mk文件里面添加proguard enabled的語句,系統(tǒng)有一個自帶的build/core/proguard.flags,默認是使用這個文件,而且一般項目默認是關(guān)閉的,這也是有原因的。因為這里的proguard.flags是沒有針對app的配置的,使用默認的混淆,app很有可能就不工作了。
添加了mk文件修改之后,在Android.mk同級根目錄創(chuàng)建本app自有的proguard.flags。新增內(nèi)容如下,這里需要注意,網(wǎng)上很多demo,基本分為三部分,一部是保留app基礎(chǔ)功能部分的內(nèi)容不混淆;2是保持app對外接口,例如get、set、isxx、AIDL、public、native層的接口或者類;3.是第三方j(luò)ar包或接口。混淆的基本原理就是將上訴類或接口進行統(tǒng)一簡單字母的替換,如果改變了這些對外接口的名字,很有可能被別人使用的時候就找不到對應(yīng)哦接口
一些第三方的庫如何不進行混淆,這個根據(jù)項目特點,可以自行搜索,比如百度的地圖包什么的。
然后是如何驗證和解決混淆過程遇到的問題,因為是對接口名進行替換,如果出現(xiàn)混淆問題的話,log里面一定會有類似
這個時候只需要對相關(guān)接口進行例外(-keep)即可,然后用android-studio,直接打開或者dex2jar進行反解可以看到相關(guān)的接口是否被簡單替換。
簡單來說,Android 進行ProGuard,可以起到壓縮,混淆,預檢,優(yōu)化的功能,雖然不能說更安全但還是一個不容忽視的環(huán)節(jié)。
首先在build.gradle 中將混淆的開關(guān)打開,即 minifyEnabled 置為 true
然后就要去proguard-rules.pro寫入我們的混淆的規(guī)則(如文件其名),防止重要的類被混淆移除了。
省事第一步,先套個模板,就是找到網(wǎng)上博客上別人分享好的模板,像四大組件,主流開源庫,JNI調(diào)用本地方法,R資源等的混淆規(guī)則都一般有了,注意一點就是套模板,也要套個時間比較近的,沒有翻車的模板,可以能比較節(jié)省自己的時間,畢竟這么多行不一定能快速看出來,打個包出來才發(fā)現(xiàn)有問題就尷尬啦。
一般來說,用了混淆的模板后,我們還會有很多項目專屬的需要混淆的部分,例如我們的自定義View,Json解析的實體類,反射用到的類,還有我們依賴的非主流的開源框架,SDK等等。
對于自定義View,很多的模板都會將繼承與View的類用keep指令防止被混淆。有個偷懶的方法就是把自定義View 放入同一個包,再把這個包的類都寫入混淆規(guī)則,就可以搞定了。
對于Json解析的實體類,反射用到的類都是同理可得,找到那些不能被移除的,把它們寫入自己的混淆規(guī)則里面。
所以如果在做項目時,有提前想到要給項目做混淆的,在導入依賴時就順手把對應(yīng)混淆規(guī)則寫了,那事后就快活似神仙了。
首先,先判斷下它是否內(nèi)置了混淆規(guī)則。如果不聲明它的混淆規(guī)則也正常運行,說明已經(jīng)它帶了混淆。
但是生活往往不會一帆風順,一般來說會有各種報錯,所以還是需要對它聲明混淆。
最簡單的辦法就是找到依賴的這個包,就這個包的類都寫入混淆規(guī)則。例如:
項目里導入了一個非主流的開源庫,然后我需要對它寫入混淆規(guī)則,確保它能正常工作。
這時候不可以認為直接去使用它的地方,將有關(guān)它 import的類 keep class 就可以。
因為可能它內(nèi)部還會使用包內(nèi)其他類,所以最好仔細排查,最簡(tou)單(lan)就是把這個包的類都 用 keep 指令,防止它們被混淆。如下所示:
一般來說就可以防止這個開源庫里的類被混淆了。
例如
先使用 -libraryjars 命令 ,對導入的jar包和 so 文件進行聲明保留它們。
如果依舊出錯,嘗試去External library文件夾 或者使用 這個SDK的地方 找到這個 SDK的包找到,并把這個包里的類 都用 keep 指令保持不被移除。如:
根據(jù)包名,寫入混淆規(guī)則
一般來說,這樣就可以避免這個SDK的類被混淆啦
好了,最后附上一份自己做的項目的混淆規(guī)則(偽模板)
代碼混淆(code obfuscation)是指將計算機程序的代碼,轉(zhuǎn)換成一種功能上等價,所謂功能上的等價是指其在變換前后功能相同或相近。其解釋如下:程序P經(jīng)過混淆變換為P‘,若P沒有結(jié)束或錯誤結(jié)束,那么P’也不能結(jié)束或錯誤結(jié)束;而且P‘程序的結(jié)果應(yīng)與程序P具有相同的輸出。否則P’不是P的有效的混淆。
目前對于混淆的分類,普遍是以Collberg 的理論為基礎(chǔ),分為布局混淆(layout obfuscation)、數(shù)據(jù)混淆(data obfuscation)、控制混淆(control obfuscation)和預防混淆(preventive obfuscation)這四種類型。
1. 布局混淆
布局混淆是指刪除或者混淆軟件源代碼或者中間代碼中與執(zhí)行無關(guān)的輔助文本信息,增加攻擊者閱讀和理解代碼的難度。軟件源代碼中的注釋文本、調(diào)試信息可以直接刪除,用不到的方法和類等代碼或數(shù)據(jù)結(jié)構(gòu)也可以刪除,這樣即可以使攻擊者難以理解代碼的語義,也可以減小軟件體積,提高軟件裝載和執(zhí)行的效率。軟件代碼中的常量名、變量名、類名和方法名等標識符的命名規(guī)則和字面意義有利于攻擊者對代碼的理解,布局混淆通過混淆這些標識符增加攻擊者對軟件代碼理解的難度。標識符混淆的方法有多種,例如哈希函數(shù)命名、標識符交換和重載歸納等。哈希函數(shù)命名是簡單地將原來標識符的字符串替換成該字符串的哈希值,這樣標識符的字符串就與軟件代碼不相關(guān)了;標識符交換是指先收集軟件代碼中所有的標識符字符串,然后再隨機地分配給不同的標識符,該方法不易被攻擊者察覺;重載歸納是指利用高級編程語言命名規(guī)則中的一些特點,例如在不同的命名空間中變量名可以相同,使軟件中不同的標識符盡量使用相同的字符串,增加攻擊者對軟件源代碼的理解難度。布局混淆是最簡單的混淆方法,它不改變軟件的代碼和執(zhí)行過程。
2. 數(shù)據(jù)混淆
數(shù)據(jù)混淆是修改程序中的數(shù)據(jù)域,而對代碼段不作處理。常用的數(shù)據(jù)混淆方式有合并變量、分割變量、數(shù)組重組、字符串加密等。
合并變量是將幾個變量合并為一個數(shù)據(jù),原來的每個變量占據(jù)其中一個區(qū)域,類似于一個大的數(shù)據(jù)結(jié)構(gòu)。分割變量則是將一個變量分割為兩個變量,對分割前后提供一種映射關(guān)系,將對一個變量的操作轉(zhuǎn)化為對分割后兩個變量的操作。
數(shù)組重組有數(shù)組的分割、合并、折疊和平滑等幾種方式。分割是將一個數(shù)組分成2個或多個相同維度的數(shù)組;合并則相反;折疊是增加數(shù)組的維數(shù);平滑則是相反。
在ELF文件中,全局變量和常量字符串存放在數(shù)據(jù)段中,反匯編工具可以輕易查找到字符串與代碼之間的引用關(guān)系。在軟件破解中,通過一些字符串提示可以很方便的找到代碼關(guān)鍵語句,從而破解軟件。字符串加密則可以對這些明顯的字符串進行加密存儲,在需要時再進行解密。
3. 控制混淆
控制混淆也稱流程混淆,它是改變程序的執(zhí)行流程,從而打斷逆向分析人員的跟蹤思路,達到保護軟件的目的。一般采用的技術(shù)有插入指令、偽裝條件語句、斷點等。偽裝條件語句是當程序順序執(zhí)行從A到B,混淆后在A和B之間加入條件判斷,使A執(zhí)行完后輸出TRUE或FALSE,但不論怎么輸出,B一定會執(zhí)行。
控制混淆采用比較多的還有模糊謂詞、內(nèi)嵌外聯(lián)、打破順序等方法。
模糊謂詞是利用消息不對稱的原理,在加入模糊謂詞時其值對混淆者是已知的,而對反混淆者卻很難推知。所以加入后將干擾反匯編者對值的分析。模糊謂詞的使用一般是插入一些死的或不相關(guān)的代碼(bogus code),或者是插入在循環(huán)或分支語句中,打斷程序執(zhí)行流程。
內(nèi)嵌(in-line)是將一小段程序嵌入到被調(diào)用的每一個程序點,外聯(lián)(out-line)是將沒有任何邏輯聯(lián)系的一段代碼抽象成一段可被多次調(diào)用的程序。
打破順序是指打破程序的局部相關(guān)性。由于程序員往往傾向于把相關(guān)代碼放在一起,通過打破順序改變程序空間結(jié)構(gòu),將加大破解者的思維跳躍。
4. 預防混淆
預防混淆一般是針對專用的反編譯器設(shè)計的,目的就是預防被這類反編譯器反編譯。他是利用特定的反編譯器或反混淆器的弱點進行專門設(shè)計。預防混淆對于特定的反編譯器非常有效,所以在使用時要綜合利用各種反編譯器的特點進行設(shè)計。
本文題目:android混淆,android混淆代碼aidl
轉(zhuǎn)載來于:http://chinadenli.net/article3/dsgsdos.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)頁設(shè)計公司、App設(shè)計、外貿(mào)網(wǎng)站建設(shè)、微信小程序、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)