Androidコード混同とsoライブラリの強化簡単なコード実装を教えます
5555 ワード
紛らわす
オン混同はコンパイル時間を長くするのでdebugモードではオンになりません.私たちがしなければならないのは:1.
なぜ混同するのか: javaのバイトコードを最適化 apkファイルのサイズを小さくすると、混同中に未使用のクラスとメンバー が削除されます.コードは安全で、クラス、関数、変数名をランダムに無意味な代名詞形にします:a,b,c...などです.appが逆コンパイルされることを防止するコード を容易に理解することができる.
APPが保持する必要がある公共部分(共通)の4つのコンポーネントとサブクラス. カスタムアプリケーション; native方法 R以下のリソース シーケンス化(Parcelable,Serializable)
supportの次の継承サブクラス Activityにおけるパラメータがviewである方法 列挙 カスタムView コールバック関数(On*Listener,OnEvent) 付き WebView
1.プログラムがシミュレータ上で実行されているかどうかを判断する
2.keystore署名を検出し、前と比較する
3.パッケージ名、バージョン名、バージョン番号を検出し、次のように判断します.
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値
5.Android逆方向-.soファイル動的デバッグ手順
soライブラリ暗号化の方法
1.ソースコードに基づいて特定のsectionを暗号化する
2.バイナリレベルに基づく特定の関数の暗号化
参考ブログ:
https://blog.csdn.net/nicolelili1/article/details/79243744
https://blog.csdn.net/feibabeibei_beibei?t=1
オン混同はコンパイル時間を長くするのでdebugモードではオンになりません.私たちがしなければならないのは:1.
release minifyEnabled
の値をtrue
に変更し、混同を開く.2.buildConfigField
logログを表示しないAPPが保持する必要がある公共部分(共通)
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.整合性検査
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