android 如何保护我们的app(二)(干货)

本篇文章是本人对《Android安全攻防实战》中的如何“防”的总结和日常工作经验,希望对大家有所帮助。同样欢迎大家查看第一篇android 如何保护我们的app(一)(干货)


同时感谢您的反馈,现在我们进入正题。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



通过检测安装程序、模拟器、调试标志位反逆向工程。

什么是干货啊,不多说了,直接上代码一看就懂:
    /**
	 * 检测安卓程序是不是谷歌应用商店,其他市场也实用
	 * @param context
	 * @return  true 表示是谷歌应用市场
	 */
	public static boolean checkGooglePlayStore(Context context) {
		String installerPackageName = context.getPackageManager()
				.getInstallerPackageName(context.getPackageName());
		return installerPackageName != null
				&& installerPackageName.startsWith("com.google.android");
	}
    /**
	 * 检查自己是不是运行在一台模拟器中
	 * 
	 * @return  true 表示在模拟上
	 */
	@SuppressWarnings("rawtypes")
	public static boolean isEmulator() {
		try {
			Class systemPropertyClazz = Class
					.forName("android.os.SystemProperties");
			boolean kernelQemu = getProperty(systemPropertyClazz,
					"ro.kernel.qemu").length() > 0;
			boolean hardwareGoldfish = getProperty(systemPropertyClazz,
					"ro.hardware").equals("goldfish");
			boolean modelSdk = getProperty(systemPropertyClazz,
					"ro.product.model").equals("sdk");

			if (modelSdk || hardwareGoldfish || kernelQemu) {
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private static String getProperty(Class clazz, String string)
			throws IllegalAccessException, IllegalArgumentException,
			InvocationTargetException, NoSuchMethodException {
		return (String) clazz.getMethod("get", new Class[] { String.class })
				.invoke(clazz, new Object[] { string });
	}
    /**
	 * 检查app的可调式标志位是否被打开了,只有在开发阶段才应该被打开的东西
	 * @param context
	 * @return true   已被打开
	 */
	public static boolean isDebuggable(Context context) {
		return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
	}

Progurd的使用

为了防止自己的劳动成果被别人窃取,混淆代码能有效防止被反编译,这里我给大家推荐这篇我在这就不多说了。


网络安全


这里我们只简单讲下SSL自签名验证证书

怎么做:

1)准备:
下载Bouncy castle的bcprov-jdk15on-154.jar
下载地址
获取证书:
2)Openssl s_client -showcerts -connect [server name]:443 <dev/null.
复制从-------BEGIN CERTIFICATE-------到----------END CERTIFICATE-------
存为mycert.crt文件
把mycert.crt和bcprov-jdk15on-154.jar全放到c://codeproject文件下
3)
keytool -import -v -trustcacerts -alias 0 
-file C:\codeproject\codeprojectsslcert.cer 
-keystore C:\codeproject\customtruststore.bks
 -storetype BKS 
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider
 -providerpath C:\codeproject\bcprov-jdk15on-154.jar
 -storepass androidcookbook


搞定! 现在, 全部 .bks 文件都生成了. 稍后将这些文件复制到安卓应用中res/raw/customtruststore.bks 

4)加载本地truststore到KeyStore对象中去。
/**
*加载本地truststore到KeyStore对象中去。
**/
private static final String STORE_PASSWORD="androidcookbook";//对应上面的storepass
private KeyStore loadKeyStore() throws Exception{
    final KeyStore keyStore =KeyStore.getINstance("BKS");
    final InputStream inputStream=context.getResoures().openRawResource(R.raw.customtruststore);
    try{ 
       KeyStore.load(inputStram,STORE_PASSWORD.toCharArray());
       return keyStore;
    }finally{
       inputStream.close();
    }
}

5)编写一个使用本地truststore的DefaultHttpClient的子类。
public class localTrustStoreMyHttpClient extends DefaultHttpClient{
@Override
protected ClientConnectionManager(){
  SchemeRegistry registry=new SchemeRegistry();
  registry.register(new Scheme("http",PlainSocketFactory.getSocketFactory(),80));
  try{
     registry.register(new Scheme("https",new SSLSocketFactory(loadKeyStore()),443));
  }catch(Exception e){
     e.printStackTrace();
  }
  return new SingleClientConnManager(getParams(),registry);
}
}



6) GET请求
public HttpResponse httpClientRequestUsingLocalKeystore(String url){
   HttpClient client=new localTrustStoreMyHttpClient();
   HttpGet httpGet=new HttpGet(url);
   HttpResponse response=httpClient.execute(httpGet);
   return response;
}


还有一些关于加密的一些demo,我都放到了github上。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值