標籤:
1、檢測調試器
在代碼中檢測調試器的動態調試
首先在AndroidMainfest.xml檔案中設定android:debuggable="false",讓程式不可調試。這樣別人想動態調試時必然要修改它的值,然後我們在動態中檢測它的值是否被修改過,代碼如下
if((getApplicationInfo().flag &=ApplicationInfo.FLAG_DEBUGGABLE)!=0){ android.os.Process.killProcess(android.os.Process.myPid()); }
2、檢查簽名
軟體在發布時都有開發人員獨一無二的密鑰檔案對其簽名,因此可以通過簽名檔案對程式合法性做出判斷
public int getSignature(){ PackageManager pm = this.getPackageManager(); PackageInfo pi = null; int sig = 0; try{ pi = pm.getPackageInfo(getPackageName(),PackageManager.GET_SIGNATURES); Signatures[] s = pi.signatures; sig = s[0].hashCode(); }catch(Exception e1){ sig = 0; e1.printStackTrace(); } return sig;}
然後與自己事先獲得的簽名的hashcode進行比較
3、dex校正保護
反編譯軟體的實質是反編譯classes.dex檔案,因此也可以通過對這個檔案的校正來檢測合法性
因為classes.dex檔案是在安裝包的zip檔案中的,所以可以通過zip的CRC校正值來比較,可以將事先擷取的校正值儲存在代碼中或者網路上與擷取的進行比較。
private boolean checkCRC(){ boolean beModified = false; long crc = xxxx ;你事先擷取的crc值 ZipFile zf; try{ zf = new ZipFile(getApplicationContext().getPackageCodePath()); ZipEntry ze = zf.getEntry("class.dex"); if(ze.getCRC() == crc){ beModified = true; } }catch(IOException e){ beModified = false; } return beModified;}
以上摘自《Android軟體安全與逆向分析》
這些都是在Java層實現都比較弱,可以將代碼放到native方法裡,提高強度
一些Android程式的反逆向方法