【安全与逆向】- APP安全防护
2020-01-20 本文已影响0人
拔萝卜占坑
代理检测
在自己的应用里检测当前手机是否设置了代理,如果设置者禁止应用的网络请求,达到被抓包的目的。
- 第一种
通过手机设置wifi代理。通过下面方式检测。
public static boolean isWifiProxy() {
final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
String proxyAddress;
int proxyPort;
if (IS_ICS_OR_LATER) {
proxyAddress = System.getProperty("http.proxyHost");
String portStr = System.getProperty("http.proxyPort");
proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
} else {
proxyAddress = android.net.Proxy.getHost(context);
proxyPort = android.net.Proxy.getPort(context);
}
return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}
- 第二种
现在很多网络请求框架都支持代理设置,这样就可以不用系统默认的代码,就算别人通过反编译代码找到了代理检测地方并去掉,也不能抓到包。当然,反编译后也可以去掉框架的代理设置。
检测调试器
- 禁止程序调试
debuggable = false - 代码检测
- 检测debuggable
if ((getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0){ Log.e("","程序被串改"); android.os.Process.killProcess(android.os.Process.myPid()); }
- 检测调试器是否链接
if (android.os.Debug.isDebuggerConnected()){ android.os.Process.killProcess(android.os.Process.myPid()); }
检测模拟器
如果应用发布后,应该是在真机上使用,如果不是,这阻止运行。
- ro.product.model
模拟器中一般为sdk,真机里面一般是手机型号 - ro.build.tags
模拟器中一般为test-keys,真机里面一般是release-keys - ro.kernel.qemu
模拟器中一般为1,真机里面一般没有该属性private boolean isRunningInEmualtor(){ java.lang.Process process = null; DataOutputStream os = null; boolean qk = false; 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\n"); os.flush(); process.waitFor(); qk = Integer.valueOf(in.readLine()) == 1; } catch (IOException e) { qk = false; } catch (InterruptedException e) { e.printStackTrace(); }finally { try { if (os != null){ os.close(); } process.destroy(); } catch (IOException e) { e.printStackTrace(); } } return qk; } }
检查签名
private boolean isModifySignature(String packageName){
PackageManager pm = getPackageManager();
PackageInfo pi = null;
int sig = 0;
try {
pi = pm.getPackageInfo(packageName,PackageManager.GET_SIGNATURES);
Signature[] s = pi.signatures;
sig = s[0].hashCode();
} catch (PackageManager.NameNotFoundException e) {
sig = 0;
e.printStackTrace();
}
if (sig != 1111111111){
Log.e("","签名不一致");
return true;
}
return false;
}
校验检测
private boolean checkCRC(){
boolean mod = false;
long crc = Long.parseLong(getString(R.string.crc));
ZipFile zf;
try {
zf = new ZipFile(getApplicationContext().getPackageCodePath());
ZipEntry ze = zf.getEntry("classes.dex");
if (ze.getCrc() == crc){
mod = true;
}
} catch (IOException e) {
e.printStackTrace();
mod = false;
}
return mod;
}