本篇文章是本人对《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
下载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对象中去。
5)编写一个使用本地truststore的DefaultHttpClient的子类。
6) GET请求
搞定! 现在, 全部 .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上。