[轉]Android 代碼混淆和加固 so庫 簡單教你一行代碼實現

混淆

因為開啟混淆會使編譯時間變長,所以debug模式下不開啟。我們需要做的是:
1.將release下minifyEnabled的值改為true,打開混淆;
2.buildConfigField?不顯示log日志

?

為什么要混淆:

?

  • 優化java的字節碼
  • 減小apk文件的大小,在混淆過程中會刪除未使用過的類和成員
  • 代碼安全,使類、函數、變量名隨機變成無意義的代號形如:a,b,c...之類。防止app被反編譯之后能夠很容易的看懂代碼

?

?

APP需要保留的公共部分(通用)

  1. 四大組件以及子類;
  2. 自定義Application;
    1. native方法
    2. R下面的資源
    3. 序列化(Parcelable,Serializable)
    4. support下面的繼承子類
    5. Activity中參數是view的方法
    6. 枚舉
    7. 自定義View
    8. 帶有回調函數(On*Listener,OnEvent)
    9. WebView

?

1. 判斷程序是否運行在模擬器上

boolean isRunningInEmualtor() {boolean qemuKernel = false;Process process = null;DataOutputStream os = null;try{  process = Runtime.getRuntime().exec("getprop ro.kernel.qemu");  os = new DataOutputStream(process.getOutputStream());BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));os.writeBytes("exit\n");  os.flush();process.waitFor();// getprop ro.kernel.qemu == 1  在模擬器// getprop ro.product.model == "sdk"  在模擬器// getprop ro.build.tags == "test-keys"  在模擬器qemuKernel = (Integer.valueOf(in.readLine()) == 1);Log.d("com.droider.checkqemu", "檢測到模擬器:" + qemuKernel);             } catch (Exception e){  qemuKernel = false;Log.d("com.droider.checkqemu", "run failed" + e.getMessage()); } finally {try{  if (os != null) {  os.close();  }  process.destroy();  } catch (Exception e) {}  Log.d("com.droider.checkqemu", "run finally"); }return qemuKernel;}

2. 檢測keystore簽名,再與之前得做比較

public int getSignature(String packageName) {      PackageManager pm = this.getPackageManager();PackageInfo pi = null;int sig = 0;try {pi = pm.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);Signature[] s = pi.signatures;sig = s[0].hashCode();  } catch (Exception e1) {sig = 0;e1.printStackTrace();}return sig;}
?

3. 檢測包名,版本名和版本號,然后做判斷:

private String getAppInfo() {try {String pkName = this.getPackageName();String versionName = this.getPackageManager().getPackageInfo(pkName, 0).versionName;int versionCode = this.getPackageManager().getPackageInfo(pkName, 0).versionCode;return pkName + "   " + versionName + "  " + versionCode;} catch (Exception e) {}return null;}

?4.完整性校驗

  • 對簽名文件中classes.dex哈希值的校驗

Android工程代碼經編譯打包生成apk包后,開發者需要對其簽名才能在安卓市場上發布供用戶下載和安裝。對apk包簽名后,會在原apk包結構基礎上加入META-INF文件目錄。

META-INF文件目錄下含有三個文件:MANIFEST.MF文件、ANDROIDD.SF文件、ANDROIDD.RSA文件,META_INF目錄文件結構如下圖所示:

其中,MANIFEST.MF文件描述了在簽名時,簽名工具對apk包中各個文件摘要計算后的哈希值,并對哈希值做了Base64編碼。MANIFEST.MF文件中描述的classes.dex文件的SHA-1哈希值如下圖所示:

一旦攻擊者對APK中反編譯并篡改代碼,經二次打包簽名后的classes.dex文件的SHA-1必定改變,因此,我們可以將該文件中的classes.dex文件的SHA-1哈希值保存起來作為校驗對比值,應用程序啟動時讀取apk安裝包中的MANIFEST.MF文件,解析出classes.dex的SHA-1哈希值,然后與原SHA-1哈希值進行比較,判斷此APK包代碼文件是否被篡改。
通過檢查簽名文件classes.dex文件的哈希值來判斷代碼文件是否被篡改的java實現代碼如下所示:

通過檢查簽名文件classes.dex文件的哈希值來判斷代碼文件是否被篡改
@param orginalSHA 原始Apk包的SHA-1值

public static void apkVerifyWithSHA(Context context, String baseSHA) {  String apkPath = context.getPackageCodePath(); // 獲取Apk包存儲路徑  try {  MessageDigest dexDigest = MessageDigest.getInstance("SHA-1");  byte[] bytes = new byte[1024];  int byteCount;  FileInputStream fis = new FileInputStream(new File(apkPath)); // 讀取apk文件  while ((byteCount = fis.read(bytes)) != -1) {  dexDigest.update(bytes, 0, byteCount);  }  BigInteger bigInteger = new BigInteger(1, dexDigest.digest()); // 計算apk文件的哈希值  String sha = bigInteger.toString(16);  fis.close();  if (!sha.equals(baseSHA)) { // 將得到的哈希值與原始的哈希值進行比較校驗  Process.killProcess(Process.myPid()); // 驗證失敗則退出程序  }  } catch (NoSuchAlgorithmException e) {  e.printStackTrace();  } catch (FileNotFoundException e) {  e.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  }  } 

5.Android逆向-.so文件動態調試步驟

?

so庫加密的方法

1.是在有源碼的基礎上進行對特定的section進行加密

2.基于二進制級別的特定函數的加密

?

參考博客:

https://blog.csdn.net/nicolelili1/article/details/79243744

?

https://blog.csdn.net/feibabeibei_beibei?t=1

?


---------------------
作者:深南大盜
來源:CSDN
原文:https://blog.csdn.net/WHB20081815/article/details/88960114
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS微課1000例】0004:值提取至點(Extract value to point)

文章目錄 問題描述值提取至點工具介紹案例實現過程注意事項問題描述 研究區分布有成千上萬個離散的矢量點(根據范圍創建隨機點),但是點上沒有高程值,研究區DEM是有的,那么怎樣在ArcGIS中提取每個點對應的高程值? 離散點分布情況: DEM數據(ArcGlobe中三維顯示):

C語言試題159之計算字符串中子串出現的次數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

關于Android studio找不到sqlite數據庫的解決方法

打開Android Device Monitor,剩下的與Eclipse相同。轉載于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019獨角獸企業重金招聘Python工程師標準>>> apache php 環境裝好了,下載了TP5的項目,然后部署上去之后,端口81,,但是 訪問 127.0.0.1:81 正常 127.0.0.1:81/admin,報錯 404 Not Found 原因是,…

論DATASNAP遠程方法支持自定義對象作參數

論DATASNAP遠程方法支持自定義對象作參數 DATASNAP遠程方法已經可以支持自定義對象作參數,這是非常方便的功能。 1)自定義對象 type TMyInfo class(TObject) public AccountNo: string; SQL: string; Params: string; end; 2)遠程方法定義 f…

[轉]Android-Proguard(代碼混淆)

一:混淆是什么,該怎么做? 如果我們的app正常發布就必須要經歷混淆這一步,混淆可以使我們的app不那么容易被別人用反編譯工具破解,就算被破解,想要讀懂我們的源碼也是非常費勁的,因為混淆過的源碼…

學妹,你要的C語言版AOE網絡數據結構來了,就這么簡單!

文章目錄AOE關鍵路徑編程AOE完整求解程序AOE關鍵路徑編程 不難發現AOE圖最大特點是沒有回路,并且有向圖方向始終是從源點走向匯點,且源點匯點都是一個。 把圖1寫成鄰接矩陣文件,見文件P200G736.TXT,并在此復制G0.C到AOE.C&#x…

C語言試題160之某個公司采用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下: 每位數字都加上 5,然后用和除以 10 的余數代替該數字,再將第一位和第四位交換,第二位和第三位

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:某個公司采用公用電話傳遞數…

C# 關于狀態機的實現(案例版)

大部分的狀態機都是有限狀態機,某些業務環境,或者其他環境中,如果有狀態機其實還是很方便的。比如,我是用在了單個客戶的Socket通信上,未連接狀態,我就等連接。已連接狀態,就等待下一步指令狀態…

測試并發應用 (一)監控Lock接口

聲明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernndez Gonzlez 譯者:鄭玉婷 校對:方騰飛 監控Lock接口 Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界…

[There will be more story......]

This blog will keep on updating.轉載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根據生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "雙魚", "白羊", "金牛", "雙子"…

[轉]Android 項目的代碼混淆,Android proguard 使用說明

簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼,我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代碼的開源項目。它的主要作用就是混淆,當然它還能對字節碼進行縮減體積、優化等,但那些對于我們來說都算是次要…

數據結構與算法:終于可以用三種語言(C,C#,JavaScript)把圖的廣度優先遍歷講清楚了(推薦收藏)

文章目錄鄰接矩陣存儲圖的廣度優先遍歷過程分析C語言實現隊列編程程序中加入圖的處理函數結果的再次分析C#語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹JavaScript語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹鄰接矩陣存儲圖的廣度優先遍歷過程分析 對圖1這樣…

C語言試題161之求100000以內的自守數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:自守數是…

改造.NET遺留應用

淺議.NET遺留應用改造TLDR:本文介紹了遺留應用改造中的一些常見問題,并對改造所能開展的目標、原則、策略進行了概述。一、背景概述1、概述或許僅“遺留應用”這個標題就比較吸睛,因為我聽過太多人吐槽了。Robert Martin在《修改代碼的藝術》…

GitHub的DGit改進了平臺的可靠性、性能以及可用性

GitHub最近悄悄地發布了DGit,全稱為“分布式Git”。這是一種基于Git創建的分布式存儲系統,其目標是改進使用GitHub時的可靠性、可用性以及性能。\\DGit是一個應用層面的協議,它利用了Git分布式的特性,將每個倉庫在三臺不同的、獨立…

用靜態NAT實現外網PC訪問內網服務器

在我們的生產環境中常常處于安全考慮將服務器置于內網環境中,但同時得向外網提供各種服務功能,此時就需要用到NAT技術。下面是我用思科的仿真軟件搭建的一個實驗環境,實現外網PC訪問內網服務器。先說明一下實驗環境:路由器R0左邊為…

[轉]分布式事務之TCC服務設計和實現注意事項

1、TCC簡介 TCC是一種比較成熟的分布式事務解決方案,可用于解決跨庫操作的數據一致性問題; TCC是服務化的兩階段編程模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和…

量化投資策略的評估標準及其計算公式

收益率指標:分為策略的總收益率和策略的年化收益率 策略的總收益率: 策略的總收益率是評價一個策略盈利能力的最基本的指標,其計算方法為: 公式中Vt表示策略最終的股票和現金的總價值,V0表示策略最初的股票和現金的總…