目前加固对于App开发人员来说,不管是App Store的审核4.3问题,还是为了防止逆向工程、篡改、反编译等问题,加固都算是一个必备的选择了。
但是加固技术在一步步升级的同时,其固有的安全缺陷和兼容性问题却始终未能得到解决。
目前,加固技术已经发展到第五代--虚机源码保护,使用代码类型更广泛,App保护级别更高,兼容性更强。那么,这一波技术升级,能解决上面的安全和兼容性问题吗?我们先挨个看看各代技术的优势和缺陷吧。
第一代加固技术:动态加载
第一代加固技术中的动态加载功能通常被用于保护应用程序中的核心代码,以及防止恶意攻击者对代码进行反编译、逆向工程等操作。动态加载功能通常包括以下几个步骤:
1.加密:将应用程序中的核心代码进行加密处理,以防止恶意攻击者对代码进行解密操作。
2.动态加载:在应用程序启动时,动态加载器会将加密后的代码加载到内存中,并对其进行解密操作。
3.代码完整性检查:在加载代码后,动态加载器会对代码进行完整性检查,以确保代码没有被篡改或修改。
4.运行时保护:在应用程序运行期间,动态加载器会对代码进行保护,以防止攻击者利用漏洞对代码进行攻击或修改。
核心代码
用Java代码简单写了一个动态加载的核心代码:
import java.io.File;
import java.io.FileInputStream;
import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class DynamicLoader {
private static final String KEY = "mysecretkey"; // 加密密钥
private static final String FILE_PATH = "/path/to/encrypted/code"; // 加密后的代码文件路径
private static final String MD5_CHECKSUM = "1234567890abcdef1234567890abcdef"; // 加密前的代码的MD5校验和
public static void main(String[] args) throws Exception {
byte[] encryptedCode = loadEncryptedCode(); // 加载加密后的代码
byte[] decryptedCode = decrypt(encryptedCode); // 解密代码
checkCodeIntegrity(decryptedCode); // 检查代码完整性
runCode(decryptedCode); // 运行代码
}
// 加载加密后的代码
private static byte[] loadEncryptedCode() throws Exception {
File file = new File(FILE_PATH);
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[(int) file.length()];
fis.read(buffer);
fis.close();
return buffer;
}
// 解密代码
private static byte[] decrypt(byte[] encryptedData) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
SecretKeySpec keySpec = new SecretKeySpec(KEY.getBytes(), "AES");
cipher.init(Cipher.D