Androidコード混同とsoライブラリの強化簡単なコード実装を教えます


紛らわす
オン混同はコンパイル時間を長くするのでdebugモードではオンになりません.私たちがしなければならないのは:1.release minifyEnabledの値をtrueに変更し、混同を開く.2.buildConfigField logログを表示しない
 
  • なぜ混同するのか:
  • javaのバイトコードを最適化
  • apkファイルのサイズを小さくすると、混同中に未使用のクラスとメンバー
  • が削除されます.
  • コードは安全で、クラス、関数、変数名をランダムに無意味な代名詞形にします:a,b,c...などです.appが逆コンパイルされることを防止するコード
  • を容易に理解することができる.
  •  


  •  
    APPが保持する必要がある公共部分(共通)
  • の4つのコンポーネントとサブクラス.
  • カスタムアプリケーション;
  • native方法
  • R以下のリソース
  • シーケンス化(Parcelable,Serializable)

  • supportの次の継承サブクラス
  • Activityにおけるパラメータがviewである方法
  • 列挙
  • カスタムView
  • コールバック関数(On*Listener,OnEvent)
  • 付き
  • 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
    "); 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という3つのファイルがあります.MFファイル、ANDROIDD.SFファイル、ANDROIDD.RSAファイル、META_INFディレクトリファイル構造は下図の通りです.
    ここで、MANIFEST.MFファイルは、署名時に、署名ツールがapkパケット内の各ファイルの要約に対して計算したハッシュ値を記述し、ハッシュ値をBase 64符号化する.MANIFEST.MFファイルに記述するclasses.dexファイルのSHA-1ハッシュ値を下図に示します.
    攻撃者がAPKでコードを逆コンパイル改ざんすると、署名後のclassesが2回パッケージされる.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