【安全与逆向】- APP安全防护

作者: 拔萝卜占坑 | 来源:发表于2020-01-20 10:37 被阅读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
  • 代码检测
    1. 检测debuggable
    if ((getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0){
         Log.e("","程序被串改");
         android.os.Process.killProcess(android.os.Process.myPid());
    }
    
    1. 检测调试器是否链接
    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;
  }

相关文章

网友评论

    本文标题:【安全与逆向】- APP安全防护

    本文链接:https://www.haomeiwen.com/subject/avkdzctx.html