Skip to content
This repository was archived by the owner on Dec 4, 2024. It is now read-only.

Commit 9c102a0

Browse files
committed
windows 动态密钥
1 parent 74744e1 commit 9c102a0

File tree

4 files changed

+99
-25
lines changed

4 files changed

+99
-25
lines changed

CHANGELOG.MD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ GUI 版本的使用和 CLI 版本基本一致,具体参考 README 文件
2222

2323
更新日志:
2424
- 基于`gcc``nasm`支持`linux x86_64 (amd64)`
25+
- 支持`Windows``Linux`任意密钥加密解密
2526
- 使用`execstack``so`库修改堆栈可执行属性
2627
- 汇编中部分寄存器忘记恢复状态导致某些`JVM`崩溃
2728
- 修改`README`部分应该使用`-agentpath`启动

native/start.c

Lines changed: 98 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,50 @@
66

77
// PACKAGE
88
char *PACKAGE_NAME;
9+
// KEY
10+
unsigned char *KEY;
11+
12+
unsigned char **split_string(const char *str, int *num_tokens, const char *sp) {
13+
unsigned char **tokens = NULL;
14+
char copy[100];
15+
char *token;
16+
int count = 0;
17+
strncpy(copy, str, sizeof(copy));
18+
copy[sizeof(copy) - 1] = '\0';
19+
token = strtok(copy, sp);
20+
while (token != NULL) {
21+
count++;
22+
token = strtok(NULL, sp);
23+
}
24+
tokens = (unsigned char **) malloc(count * sizeof(unsigned char *));
25+
if (tokens == NULL) {
26+
fprintf(stderr, "memory allocation failed\n");
27+
return NULL;
28+
}
29+
strncpy(copy, str, sizeof(copy));
30+
copy[sizeof(copy) - 1] = '\0';
31+
32+
token = strtok(copy, sp);
33+
count = 0;
34+
while (token != NULL) {
35+
tokens[count] = (unsigned char *) malloc(strlen(token) + 1);
36+
if (tokens[count] == NULL) {
37+
fprintf(stderr, "memory allocation failed\n");
38+
for (int i = 0; i < count; i++) {
39+
free(tokens[i]);
40+
}
41+
free(tokens);
42+
return NULL;
43+
}
44+
strcpy((char *) tokens[count], token);
45+
count++;
46+
token = strtok(NULL, sp);
47+
}
48+
*num_tokens = count;
49+
return tokens;
50+
}
951

10-
void internal(unsigned char *_data, int start) {
52+
void internal(unsigned char *_data, int start, unsigned char *key) {
1153
unsigned char first[4];
1254
for (int i = start; i < start + 4; i++) {
1355
first[i - start] = _data[i];
@@ -17,12 +59,20 @@ void internal(unsigned char *_data, int start) {
1759
second[i - start - 4] = _data[i];
1860
}
1961
uint32_t v[2] = {convert(first), convert(second)};
20-
// key: Y4Sec-Team-4ra1n
21-
// 59345365 632D5465 616D2D34 7261316E
62+
63+
printf("DECRYPT KEY: %s\n",key);
64+
unsigned char *key_part1 = key;
65+
unsigned char *key_part2 = key + 4;
66+
unsigned char *key_part3 = key + 8;
67+
unsigned char *key_part4 = key + 12;
68+
2269
uint32_t const k[4] = {
23-
(unsigned int) 0x65533459, (unsigned int) 0x65542d63,
24-
(unsigned int) 0X342d6d61, (unsigned int) 0x6e316172,
70+
(unsigned int) convert(key_part1),
71+
(unsigned int) convert(key_part2),
72+
(unsigned int) convert(key_part3),
73+
(unsigned int) convert(key_part4),
2574
};
75+
2676
tea_decrypt(v, k);
2777
unsigned char first_arr[4];
2878
unsigned char second_arr[4];
@@ -60,11 +110,11 @@ void JNICALL ClassDecryptHook(
60110
return;
61111
}
62112
// 1. {[10:14],[14:18]}
63-
internal(_data,10);
113+
internal(_data,10,KEY);
64114
// 2. {[18:22],[22:26]}
65-
internal(_data,18);
115+
internal(_data,18,KEY);
66116
// 3. {[26:30],[30:34]}
67-
internal(_data,26);
117+
internal(_data,26,KEY);
68118
// 4. asm encrypt
69119
decrypt((unsigned char *) _data, class_data_len);
70120
} else {
@@ -81,9 +131,6 @@ JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm) {
81131
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {
82132
printf("PARAMS: %s\n", options);
83133

84-
const char *key = "PACKAGE_NAME";
85-
char *value = NULL;
86-
87134
// REPLACE . -> /
88135
char modified_str[256];
89136
size_t modified_str_size = sizeof(modified_str);
@@ -97,28 +144,54 @@ JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {
97144
}
98145
}
99146

100-
// SPLIT A=B -> B
101-
char *context;
102-
char *token = strtok_s(modified_str, "=", &context);
103-
while (token != NULL) {
104-
if (strcmp(token, key) == 0) {
105-
value = strtok_s(NULL, "=", &context);
106-
break;
147+
unsigned char *v1 = NULL;
148+
unsigned char *v2 = NULL;
149+
int num_tokens;
150+
unsigned char **tokens = split_string(modified_str, &num_tokens, ",");
151+
if (tokens != NULL) {
152+
unsigned char *pack = tokens[0];
153+
unsigned char *key = tokens[1];
154+
155+
tokens = split_string((char *) pack, &num_tokens, "=");
156+
if (strcmp((char *) tokens[0], "PACKAGE_NAME") == 0) {
157+
v1 = tokens[1];
158+
printf("PACKAGE_NAME: %s\n", v1);
159+
printf("LENGTH: %llu\n", strlen((char *) v1));
160+
}else{
161+
printf("ERROR");
162+
return 0;
163+
}
164+
165+
tokens = split_string((char *) key, &num_tokens, "=");
166+
if (strcmp((char *) tokens[0], "KEY") == 0) {
167+
v2 = tokens[1];
168+
printf("KEY: %s\n", v2);
169+
printf("LENGTH: %llu\n", strlen((char *) v2));
170+
} else{
171+
printf("ERROR");
172+
return 0;
107173
}
108-
token = strtok_s(NULL, "=", &context);
109174
}
110175

111-
if (value == NULL) {
176+
if (v1 == NULL) {
112177
DE_LOG("NEED PACKAGE_NAME PARAMS\n");
113178
return 0;
114179
}
115180

116-
// SET PACKAGE_NAME
117-
PACKAGE_NAME = (char *) malloc(strlen(value) + 1);
118-
strcpy_s(PACKAGE_NAME, strlen(value) + 1, value);
181+
if (v2 == NULL) {
182+
DE_LOG("NEED KEY PARAMS\n");
183+
return 0;
184+
}
119185

120-
printf("PACKAGE: %s\n", PACKAGE_NAME);
121-
printf("PACKAGE-LENGTH: %llu\n", strlen(PACKAGE_NAME));
186+
// SET PACKAGE_NAME
187+
PACKAGE_NAME = (char *) malloc(strlen((char *)v1));
188+
strcpy(PACKAGE_NAME, (char *)v1);
189+
printf("SET GLOBAL PACKAGE: %s\n",PACKAGE_NAME);
190+
191+
// SET KEY
192+
KEY = (unsigned char *) malloc(16);
193+
strcpy((char *)KEY, (char *)v2);
194+
printf("SET GLOBAL KEY: %s\n",KEY);
122195

123196
jvmtiEnv *jvmti;
124197
DE_LOG("INIT JVMTI ENVIRONMENT");

src/main/resources/decrypter.dll

1.5 KB
Binary file not shown.

src/main/resources/encryptor.dll

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)