security - 如何避免APK的某個文件被逆向工程?

  显示原文与译文双语对照的内容

我開發一個支付處理應用安卓,我想阻止黑客訪問任何資源, assets 或源代碼 APK文件。

If someone changes. apk extension to. zip then they can unzip it and easily access all resources of app and assets,and using dex2jar and a Java decompiler, they can also access source code. 很容易反向工程一個android的apk文件(更多細節見堆棧溢出問題 逆向工程從一個apk文件項目

我使用了 Android SDK提供的混淆工具。 當我逆向工程使用簽名密鑰庫和混淆器生成的APK文件時,我得到了混淆代碼。 但是,Android組件的名稱保持不變,並且應用中使用的一些代碼,如 key-values,保持不變。 根據混淆器文檔,該工具無法混淆 Manifest 文件中提到的組件。

現在我的問題是:

  1. 我怎麼能完全避免逆向工程的一個android的apk? 這可能嗎?
  2. 如何保護應用程序,assets 和源代碼的所有資源,以便黑客不能以任何方式入侵APK文件?
  3. 有一種方法可以讓黑客更加困難甚至不可能? 如何保護APK文件中的源代碼?
时间:

1.如何完全避免對 Android APK逆向工程? 這可能嗎?

相反,完全避免逆向工程沒有任何技巧。

@inazaruk: 也很好地說 無論你做什麼你的代碼,一個潛在的攻擊者能夠以任何方式改變它她或他覺得可行。 你基本上不能保護你的應用程序被修改。 你放入的任何保護都可以被禁用或者刪除。

2.如何保護應用程序,assets 和源代碼的所有資源,以便黑客無法以任何方式 hack 文件?

你可以用不同的技巧讓黑客更難。 例如使用模糊處理( 如果是Java代碼) 。 這通常會降低逆向工程的速度。

3 。有什麼方法可以讓黑客更加困難甚至不可能? 如何保護APK文件中的源代碼?

就像大家所說,而且你可能知道,沒有 100%安全性。 但是,谷歌內置的Android的地方是混淆器。 如果你有的選項包括共享庫 C++ 中,可以包含所需的代碼來驗證文件大小。集成。等等 如果需要添加外部在每次構建本地庫添加到庫中的硬軟體文件夾,那麼你可以使用它通過下面的建議。

將該庫放在默認為"庫"的本地庫路徑中,該路徑在你的項目文件夾中。 如果你建立的本機代碼 'armeabi' 目標然後把它放到了 libs/armeabi 。 如果是使用構建 armeabi-v7a 然後會開始將來自 libs/armeabi-v7a 。


<project>/libs/armeabi/libstuff.so

現在,你不能保護/res 目錄中的文件,因為它們現在被保護。

不過,你可以採取一些措施來保護你的源代碼,或者至少它如果不是一切。

  1. 使用類似混淆器的工具。這些工具會混淆你的代碼,並且在反編譯時更難閱讀,如果不是不可能的話。
  2. 將服務中最關鍵的部分移出應用程序,並將它的放入 web service,隱藏在像PHP這樣的伺服器端語言。 例如如果你有一個演算法,你會花費一百萬美元來寫。 顯然你不希望人們從你的應用中搶走它。 移動演算法並讓它處理遠程伺服器上的數據,並使用該應用簡單地提供數據。 或者使用NDK將它們原生地寫入. so 文件,這比apks更容易被反編譯。 我認為. so 文件的反編譯器現在甚至不存在。 另外,就像在評論中提到的@nikolay,在伺服器和設備之間交互時應該使用 SSL 。
  3. 在設備上存儲值時,不要將它的存儲為原始格式。 例如如果你有一個遊戲,並且你正在存儲遊戲貨幣的金額,用戶在SharedPreferences中。 假設是 10000 幣。 不是直接保存 10000,而是使用 ((currency*2)+1)/13 之類的演算法保存它。 所以 10000, 你保存 1538.53846154 SharedPreferences 。 然而,上面的例子並不是完美的,你必須工作,以得到一個不會丟失貨幣的舍入錯誤。
  4. 你可以為伺服器端任務做類似的事情。 現在,讓我們來看看你的付款處理應用程序。 假設用戶必須支付 $200 。 不要向伺服器發送原始的$200 值,而是發送一系列更小predefined預定義的值,這些值可以添加到 $200 。 例如在你的伺服器上有一個將單詞與值等同的文件或者表格。 假設 Charlie 對應于 $47,而 John 對應于 $3 。 而不是發送 $200 時,你可以發送 Charlie 四次, John 四次。 在伺服器上,解釋它們的含義並添加它。 這可以防止黑客向你的伺服器發送任意值,因為他們不知道哪個詞對應什麼值。 作為安全措施的補充,你也可以得到類似於 3的等式,並且每天更改關鍵字的每一個 n 數。
  5. 最後,你可以將隨機無用的源代碼插入到你的應用程序中,這樣黑客就可以在大海撈針。 插入包含來自互聯網的Fragment的隨機類,或者只用於計算隨機事物( 如Fibonacci序列)的函數。 確保這些類是編譯的,但不是由應用程序的實際功能使用的。 添加足夠的假類,黑客會很難找到你真正的代碼。

總之,沒有辦法保護你的應用程序 100% 。 你可以讓它更難,但不是不可能。 你的web伺服器可能會妥協,黑客可以找出關鍵詞通過監測多個事務量和關鍵詞你發送,黑客可以通過源和煞費苦心地去找出哪些代碼是一個假。

你只能反擊,但永遠不能贏。

1.如何完全避免對 Android APK逆向工程? 這可能嗎?

這是不可能的,

2.如何保護應用程序,assets 和源代碼的所有資源,以便黑客不能以任何方式入侵APK文件?

當有人將. apk 擴展更改為. zip, 之後,在解壓縮之後,有人可以輕鬆獲得所有資源( 除了 Manifest.xml ),但使用英鎊 APKtool 可以獲得清單文件的真實內容。 再一次,一個沒有。

3 。有什麼方法可以讓黑客更加困難甚至不可能? 如何保護APK文件中的源代碼?

再一次,不,但你可以阻止某個級別,也就是說

即使使用 Smali,人們也可以使用你的代碼。 總之,這是不可能的。

100%避免逆向工程的android的apk是不可能的,但你可以使用這些方法來避免提取更多的數據,如源代碼, assets apk,形式和資源:

  1. 使用混淆器混淆應用程序代碼

  2. 使用 NDK使用c和 C++ 將你的應用程序的核心和安全代碼在 .so 文件的一部分

  3. 要保護資源,不要將 assets 文件夾中的所有重要資源包含在文件夾中。 在應用程序首次啟動時下載這些資源。

開發人員可以採取以下措施防止APK被盜,

  • 最基本的方法是使用像 ProGuard 這樣的工具來迷惑他們的代碼,但是直到現在,完全阻止有人反編譯一個應用。

  • 我也聽說過一個工具 HoseDex2Jar 。 它通過在 Android APK中插入無害代碼來停止 Dex2Jar,它迷惑和禁用 Dex2Jar 並保護代碼免受反編譯。 它可以阻止黑客將一個APK反編譯為可讀的java代碼。

  • 使用某些伺服器端應用程序僅在需要時與應用程序通信。 它可以幫助防止重要數據。

總之,你不能完全保護你的代碼和潛在的黑客。 不知何故,你可以有點困難和令人沮喪的任務反編譯代碼。 最有效的方法之一是在原生 code(C/C++) 中編寫並將它的存儲為編譯的庫。

1.如何完全避免對 Android APK逆向工程? 這可能嗎?

不可能的

2.如何保護應用程序,assets 和源代碼的所有資源,以便黑客不能以任何方式入侵APK文件?

開發人員可以採取措施,如使用混淆器等工具混淆他們的代碼,但到目前為止,它已經很難完全防止有人反編譯應用程序。

這是一個非常好的工具,可以增加'正在反轉'代碼的難度,同時減少代碼的佔用。

集成的混淆器支持:混淆器現在用SDK工具打包。 開發者現在可以混淆他們的代碼作為發布版本的集成部分。

3 。有什麼方法可以讓黑客更加困難甚至不可能? 如何保護APK文件中的源代碼?

在研究時,我了解了 HoseDex2Jar 。 這裡工具將保護代碼免受反編譯,但似乎不可能完全保護你的代碼。

一些有用的鏈接,你可以參考它們。

這裡的主要問題是,可以反編譯dex文件,答案是"的"。 有disassemblers像 dedexersmali 。

正確配置的混淆器將混淆你的代碼。 DexGuard是一個商業擴展的商業擴展版本,可以幫助更多的。 但是,你的代碼仍然可以轉換為 smali,並且具有reverse-engineering經驗的開發人員可以從smali中找出你正在做什麼。

也許選擇一個好的許可,並以最好的方式實施它。

...