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