66
77// PACKAGE
88char * 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) {
81131JNIEXPORT 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" );
0 commit comments