-
Notifications
You must be signed in to change notification settings - Fork 21
/
Build.java
98 lines (75 loc) · 2.68 KB
/
Build.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.redpois0n;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
public class Build {
public static final String ENCRYPTED_ARCHIVE = "jar.dat";
public static boolean contains(String[] array, String search) {
for (String str : array) {
if (str.equalsIgnoreCase(search)) {
return true;
}
}
return false;
}
public static void build(File input, File output, String mainclass, byte[] key, boolean encall) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(output));
if (!encall) {
ZipFile inp = new ZipFile(input);
Enumeration<? extends ZipEntry> entries = inp.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (!entry.getName().toLowerCase().contains("meta-inf") && !entry.getName().toLowerCase().endsWith(".class")) {
out.putNextEntry(entry);
Utils.copy(inp.getInputStream(entry), out);
out.closeEntry();
}
}
inp.close();
}
ZipFile zip = new ZipFile("Bin.jar");
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
InputStream in = zip.getInputStream(entry);
out.putNextEntry(entry);
Utils.copy(in, out);
out.closeEntry();
in.close();
}
zip.close();
byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), new IvParameterSpec(iv));
FileInputStream is = new FileInputStream(input);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CipherOutputStream cos = new CipherOutputStream(baos, cipher);
Utils.copy(is, cos);
is.close();
cos.close();
byte[] bMainClass = mainclass.getBytes("UTF-8");
byte[] config = new byte[key.length + iv.length + 1 + bMainClass.length];
System.arraycopy(key, 0, config, 0, key.length);
System.arraycopy(iv, 0, config, 16, iv.length);
config[32] = (byte) (encall ? 1 : 0);
System.arraycopy(bMainClass, 0, config, 33, bMainClass.length);
ZipEntry entry = new ZipEntry(ENCRYPTED_ARCHIVE);
out.putNextEntry(entry);
entry.setExtra(config);
out.write(baos.toByteArray());
out.closeEntry();
out.close();
}
}