142113ea809342a8cc7d2ed7d53583e6d5daac791Erik// Copyright 2011 Google Inc. All Rights Reserved. 242113ea809342a8cc7d2ed7d53583e6d5daac791Erik 342113ea809342a8cc7d2ed7d53583e6d5daac791Erikpackage com.android.vending.sectool.v1; 442113ea809342a8cc7d2ed7d53583e6d5daac791Erik 542113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.content.Context; 642113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.content.res.AssetManager; 742113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport android.util.Log; 842113ea809342a8cc7d2ed7d53583e6d5daac791Erik 942113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.BufferedReader; 1042113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.File; 113f4f1b76c1b6238a59e02ecf2e0a993db565307dErikimport java.io.FileInputStream; 1242113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.FileOutputStream; 133f4f1b76c1b6238a59e02ecf2e0a993db565307dErikimport java.io.IOException; 1442113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.InputStream; 1542113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.InputStreamReader; 1642113ea809342a8cc7d2ed7d53583e6d5daac791Erikimport java.io.OutputStream; 173f4f1b76c1b6238a59e02ecf2e0a993db565307dErikimport java.util.zip.CRC32; 1842113ea809342a8cc7d2ed7d53583e6d5daac791Erik 1942113ea809342a8cc7d2ed7d53583e6d5daac791Erikpublic class BackendTest { 2042113ea809342a8cc7d2ed7d53583e6d5daac791Erik 213f4f1b76c1b6238a59e02ecf2e0a993db565307dErik public static boolean profileExists(File f) { 2242113ea809342a8cc7d2ed7d53583e6d5daac791Erik return f.exists(); 2342113ea809342a8cc7d2ed7d53583e6d5daac791Erik } 24b0143ecb5bfc6eeb272b2ec790b40d252c32e6a1Erik 253f4f1b76c1b6238a59e02ecf2e0a993db565307dErik public static boolean isImmunized(File f) { 269311625f6103a969e976a7e69ac9226159a55c12RoboErik long length = f.length(); 273f4f1b76c1b6238a59e02ecf2e0a993db565307dErik if (GoogleSecurityToolActivity.DEBUG) 289311625f6103a969e976a7e69ac9226159a55c12RoboErik Log.d("AVST", "length is " + length); 299311625f6103a969e976a7e69ac9226159a55c12RoboErik return length == 0 || length == 8 || length == 28; 303f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 31b0143ecb5bfc6eeb272b2ec790b40d252c32e6a1Erik 323f4f1b76c1b6238a59e02ecf2e0a993db565307dErik public static long profSize(File f) { 333f4f1b76c1b6238a59e02ecf2e0a993db565307dErik return f.length(); 343f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 35b0143ecb5bfc6eeb272b2ec790b40d252c32e6a1Erik 369311625f6103a969e976a7e69ac9226159a55c12RoboErik public static boolean crcMatches(File f, long crc) { 373f4f1b76c1b6238a59e02ecf2e0a993db565307dErik if (GoogleSecurityToolActivity.DEBUG) 383f4f1b76c1b6238a59e02ecf2e0a993db565307dErik Log.d("AVST", "Getting checksum"); 399311625f6103a969e976a7e69ac9226159a55c12RoboErik return getChecksum(f) == crc; 403f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 4142113ea809342a8cc7d2ed7d53583e6d5daac791Erik 429311625f6103a969e976a7e69ac9226159a55c12RoboErik public static String runRemovalCommand(Context context, File f) { 4342113ea809342a8cc7d2ed7d53583e6d5daac791Erik StringBuffer output = new StringBuffer(); 443f4f1b76c1b6238a59e02ecf2e0a993db565307dErik InputStream in = null; 453f4f1b76c1b6238a59e02ecf2e0a993db565307dErik OutputStream os = null; 4642113ea809342a8cc7d2ed7d53583e6d5daac791Erik try { 4742113ea809342a8cc7d2ed7d53583e6d5daac791Erik AssetManager am = context.getAssets(); 489311625f6103a969e976a7e69ac9226159a55c12RoboErik in = am.open("droiddreamcleanall"); 4942113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append("aa"); 503f4f1b76c1b6238a59e02ecf2e0a993db565307dErik File location = context.getFileStreamPath("droiddreamclean"); 51af7cdee2bd6332896761befdc1f3c5e840ab7b66RoboErik if (location.exists()) { 52af7cdee2bd6332896761befdc1f3c5e840ab7b66RoboErik location.delete(); 53af7cdee2bd6332896761befdc1f3c5e840ab7b66RoboErik location.createNewFile(); 54af7cdee2bd6332896761befdc1f3c5e840ab7b66RoboErik } 553f4f1b76c1b6238a59e02ecf2e0a993db565307dErik os = new FileOutputStream(location); 5642113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append("bb"); 5742113ea809342a8cc7d2ed7d53583e6d5daac791Erik byte[] buff = new byte[16000]; 5842113ea809342a8cc7d2ed7d53583e6d5daac791Erik int read; 5942113ea809342a8cc7d2ed7d53583e6d5daac791Erik while ((read = in.read(buff)) > 0) { 6042113ea809342a8cc7d2ed7d53583e6d5daac791Erik os.write(buff, 0, read); 6142113ea809342a8cc7d2ed7d53583e6d5daac791Erik } 6242113ea809342a8cc7d2ed7d53583e6d5daac791Erik os.close(); 6342113ea809342a8cc7d2ed7d53583e6d5daac791Erik in.close(); 6442113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append("cc"); 6542113ea809342a8cc7d2ed7d53583e6d5daac791Erik Runtime rt = Runtime.getRuntime(); 663f4f1b76c1b6238a59e02ecf2e0a993db565307dErik rt.exec("/system/bin/chmod 755 " + location.toString()); 6742113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append("dd"); 689311625f6103a969e976a7e69ac9226159a55c12RoboErik Process process = rt.exec(f.getAbsolutePath() + " -c " 693f4f1b76c1b6238a59e02ecf2e0a993db565307dErik + location.toString()); 7042113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append("ee"); 7142113ea809342a8cc7d2ed7d53583e6d5daac791Erik 7242113ea809342a8cc7d2ed7d53583e6d5daac791Erik// String removalCommand = "/system/bin/profile -c ls /"; 7342113ea809342a8cc7d2ed7d53583e6d5daac791Erik// Log.i(TAG, "command: " + removalCommand); 7442113ea809342a8cc7d2ed7d53583e6d5daac791Erik// Process process = Runtime.getRuntime().exec(removalCommand); 7542113ea809342a8cc7d2ed7d53583e6d5daac791Erik 7642113ea809342a8cc7d2ed7d53583e6d5daac791Erik BufferedReader bReader = new BufferedReader(new InputStreamReader(process 7742113ea809342a8cc7d2ed7d53583e6d5daac791Erik .getInputStream())); 789311625f6103a969e976a7e69ac9226159a55c12RoboErik StringBuffer binOutput = new StringBuffer(); 7942113ea809342a8cc7d2ed7d53583e6d5daac791Erik char[] buffer = new char[4096]; 8042113ea809342a8cc7d2ed7d53583e6d5daac791Erik while ((read = bReader.read(buffer)) > 0) { 819311625f6103a969e976a7e69ac9226159a55c12RoboErik binOutput.append(buffer, 0, read); 8242113ea809342a8cc7d2ed7d53583e6d5daac791Erik } 8342113ea809342a8cc7d2ed7d53583e6d5daac791Erik bReader.close(); 849311625f6103a969e976a7e69ac9226159a55c12RoboErik // Marks the start of our output, trim anything before it 859311625f6103a969e976a7e69ac9226159a55c12RoboErik int elhIndex = binOutput.lastIndexOf("elh"); 869311625f6103a969e976a7e69ac9226159a55c12RoboErik if (elhIndex == -1) { 879311625f6103a969e976a7e69ac9226159a55c12RoboErik elhIndex = 0; 889311625f6103a969e976a7e69ac9226159a55c12RoboErik } 899311625f6103a969e976a7e69ac9226159a55c12RoboErik output.append(binOutput.substring(elhIndex, binOutput.length())); 9042113ea809342a8cc7d2ed7d53583e6d5daac791Erik 9142113ea809342a8cc7d2ed7d53583e6d5daac791Erik process.waitFor(); 9242113ea809342a8cc7d2ed7d53583e6d5daac791Erik } catch (Exception e) { 933f4f1b76c1b6238a59e02ecf2e0a993db565307dErik if (GoogleSecurityToolActivity.DEBUG) 943f4f1b76c1b6238a59e02ecf2e0a993db565307dErik Log.d(GoogleSecurityToolActivity.TAG, e.getMessage()); 9542113ea809342a8cc7d2ed7d53583e6d5daac791Erik output.append(e.getMessage()); 963f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } finally { 973f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// if (os != null) { 983f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// os.close(); 993f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// } 1003f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// if (in != null) { 1013f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// in.close(); 1023f4f1b76c1b6238a59e02ecf2e0a993db565307dErik// } 10342113ea809342a8cc7d2ed7d53583e6d5daac791Erik } 10442113ea809342a8cc7d2ed7d53583e6d5daac791Erik return output.toString(); 10542113ea809342a8cc7d2ed7d53583e6d5daac791Erik } 106b0143ecb5bfc6eeb272b2ec790b40d252c32e6a1Erik 1073f4f1b76c1b6238a59e02ecf2e0a993db565307dErik public static long getChecksum(File f) { 1083f4f1b76c1b6238a59e02ecf2e0a993db565307dErik try { 1093f4f1b76c1b6238a59e02ecf2e0a993db565307dErik FileInputStream in = new FileInputStream(f); 1103f4f1b76c1b6238a59e02ecf2e0a993db565307dErik CRC32 crc = new CRC32(); 1113f4f1b76c1b6238a59e02ecf2e0a993db565307dErik byte[] bytes = new byte[8192]; 1123f4f1b76c1b6238a59e02ecf2e0a993db565307dErik int byteCount; 1133f4f1b76c1b6238a59e02ecf2e0a993db565307dErik crc.reset(); 1143f4f1b76c1b6238a59e02ecf2e0a993db565307dErik while ((byteCount = in.read(bytes)) > 0) { 1153f4f1b76c1b6238a59e02ecf2e0a993db565307dErik crc.update(bytes, 0, byteCount); 1163f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 1173f4f1b76c1b6238a59e02ecf2e0a993db565307dErik in.close(); 1183f4f1b76c1b6238a59e02ecf2e0a993db565307dErik long sum = crc.getValue(); 1193f4f1b76c1b6238a59e02ecf2e0a993db565307dErik if (GoogleSecurityToolActivity.DEBUG) 1203f4f1b76c1b6238a59e02ecf2e0a993db565307dErik Log.d("AVST", "crc is --" + sum + "--"); 1213f4f1b76c1b6238a59e02ecf2e0a993db565307dErik return sum; 122b0143ecb5bfc6eeb272b2ec790b40d252c32e6a1Erik 1233f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } catch (IOException e) { 1243f4f1b76c1b6238a59e02ecf2e0a993db565307dErik e.printStackTrace(); 1253f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 1263f4f1b76c1b6238a59e02ecf2e0a993db565307dErik return -1; 1273f4f1b76c1b6238a59e02ecf2e0a993db565307dErik } 12842113ea809342a8cc7d2ed7d53583e6d5daac791Erik 12942113ea809342a8cc7d2ed7d53583e6d5daac791Erik} 130