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方法里,提高强度