Android 解密apk并在运行时执行它

Android 解密apk并在运行时执行它,android,encryption,classloader,Android,Encryption,Classloader,我有一个用AES加密的apk,它存储在我的SD卡上。当我从对话框中输入密码短语时,文件将被解密。这是我的代码: public class MainActivity extends Activity { //@SuppressWarnings("unchecked") private static final String TAG = "MyActivity"; @Override protected void onCreate(Bundle savedInstanceState

我有一个用AES加密的apk,它存储在我的SD卡上。当我从对话框中输入密码短语时,文件将被解密。这是我的代码:

    public class MainActivity extends Activity {

//@SuppressWarnings("unchecked")
private static final String TAG = "MyActivity";
@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);       

     AlertDialog.Builder alert = new AlertDialog.Builder(this);

        alert.setTitle("Title");
        alert.setMessage("Message");

        // Set an EditText view to get user input 
        final EditText input = new EditText(this);
        alert.setView(input);

        alert.setPositiveButton("Ok", new
    DialogInterface.OnClickListener()   {
        public void onClick(DialogInterface dialog, int whichButton) {
        String value = input.getText().toString();
        try {
                Decrypt(value);
                Log.d(TAG,value);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }});


        alert.setNegativeButton("Cancel", new
    DialogInterface.OnClickListener() {
             public void onClick(DialogInterface dialog, int
    whichButton) {
                 // Canceled.
            }
            });

             alert.show();  
    }
    static void Decrypt(String Key) throws IOException, NoSuchAlgorithmException,
    NoSuchPaddingException, InvalidKeyException {

    final String libPath = Environment.getExternalStorageDirectory() +  
    "/encrypted.jar";
    FileInputStream fis = new FileInputStream(libPath);

    FileOutputStream fos = new  
    FileOutputStream(Environment.getExternalStorageDirectory() + "/decrypted.jar");
    SecretKeySpec sks = new SecretKeySpec(Key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, sks /*originalKey*/);
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    int b;
    byte[] d = new byte[8];
    while((b = cis.read(d)) != -1) {
    fos.write(d, 0, b);
    }
    fos.flush();
    fos.close();
    cis.close();
    }
现在我希望当我点击OK按钮时,不仅加密的文件被解密,它也被执行。我应该如何进行?我应该使用自定义类加载器吗?有什么想法吗? 谢谢

您不能“执行”APK,就像您不能“执行”ZIP文件一样


如果“execute”是指“install”,那么您可以使用
ACTION\u VIEW
和适当的
Uri
以及MIME类型来访问外部存储上未加密的APK文件。

感谢@commonware的回复。我想知道定制的类加载器是否可以用来运行加密文件?如果我扩展了dexclassloader?@Shoaib:因为加密的APK是毫无意义的IMHO,所以我没有调查过试图从加密的APK加载类。毕竟,任何想解密APK的人都可以解密,因为你的加密密钥和算法是通过检查你的主应用程序知道的。是的,我知道任何拥有密钥的人都可以获得源代码。这与其说是一个逆向工程问题,不如说是一个练习:)是的,我在征求关于如何进行的建议