Webプロジェクトの復号化
環境:tomcat 6.X+struts 2.X+MyIbatis+Spring 3.x
暗号化:AESで暗号化し、ファイルのバイトコードを読み込み、バイトコードを暗号化してソースファイルを置き換える
復号化:
1、tomcatのWebappClassLoaderでソースコードを修正する(自動義類ローダ);
2、springソースコードコードコードコードコードコードコードコードを修正する.
暗号化方法
にある WebappClassLoaderでの復号化
springのcodeパッケージのSimpleMetadataReaderモディファイヤ構築関数
L o c a l v a r i a b eTableParameterName Discovererでも復号が必要です.
注意:(この暗号化には問題があります)
1、暗号解読アルゴリズムは一貫性を保つ必要がある.
2、暗号化鍵は同一鍵であること.
暗号化:AESで暗号化し、ファイルのバイトコードを読み込み、バイトコードを暗号化してソースファイルを置き換える
/**
*
*
*/
public static byte[] encrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
復号化:
1、tomcatのWebappClassLoaderでソースコードを修正する(自動義類ローダ);
2、springソースコードコードコードコードコードコードコードコードを修正する.
暗号化方法
public static byte[] decrypt(byte[] data, String key) throws Exception {
Key k = toKey(Base64.decode(key));
byte[] raw = k.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
return cipher.doFinal(data);
}
にある WebappClassLoaderでの復号化
/**
*
* */
//--------------------------------------start----------------------------------//
byte []data=null;
try {
if(isDecode(name)){
System.out.println("2818:--&&&-"+name);
data=AESUtils.decrypt(entry.binaryContent, key);
}else{
data=entry.binaryContent;
}
} catch (Exception e) {
e.printStackTrace();
}
try {
clazz = defineClass(name, data, 0,
data.length,
new CodeSource(entry.codeBase, entry.certificates));
//--------------------------------------end----------------------------------//
springのcodeパッケージのSimpleMetadataReaderモディファイヤ構築関数
// TODO
SimpleMetadataReader(Resource resource, ClassLoader classLoader)
throws IOException {
InputStream is = resource.getInputStream();
ClassReader classReader = null;
try {
String name = "";
if (resource.getURI().toString().indexOf("jar:file") == -1) {
name = resource.getFile().getAbsolutePath();
if (!"".equals(name) && isDecode(name, cams)) {
byte[] data = inputStreamToByte(is);
try {
is = new ByteArrayInputStream(AESUtils.decrypt(data,
key));
// is = new ByteArrayInputStream(data);
} catch (Exception e) {
e.printStackTrace();
}
}
}
classReader = new ClassReader(is);
} finally {
is.close();
}
L o c a l v a r i a b eTableParameterName Discovererでも復号が必要です.
注意:(この暗号化には問題があります)
1、暗号解読アルゴリズムは一貫性を保つ必要がある.
2、暗号化鍵は同一鍵であること.