Android 解密apk并在运行时执行它
我有一个用AES加密的apk,它存储在我的SD卡上。当我从对话框中输入密码短语时,文件将被解密。这是我的代码: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
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的人都可以解密,因为你的加密密钥和算法是通过检查你的主应用程序知道的。是的,我知道任何拥有密钥的人都可以获得源代码。这与其说是一个逆向工程问题,不如说是一个练习:)是的,我在征求关于如何进行的建议