硕士生
 
- 金币
- 629
- 好评
- 24
- 信誉
- 175
|
郝稔 发表于 2026-9-11 22:54
还有,解没解密成功不是我用算法跑一遍就行,我要看字节头的,他是gzip还是zip亦或者是普通js文件都是靠字 ...
int cocos_decrypt_jsc(const char* jsc_path, const char* js_path, const char* key) {
size_t enc_len = 0;
uint8_t* enc = file_read_all(jsc_path, &enc_len);
if (!enc) return -1;
size_t dec_len = 0;
uint8_t* dec = xxtea_decrypt(enc, enc_len, key, &dec_len);
free(enc);
if (!dec) return -1;
uint8_t* final_data = dec;
size_t final_len = dec_len;
uint8_t* gz_out = NULL;
char fmt = 'r'; /* 默认 raw */
/* gzip: 1f 8b */
if (dec_len >= 2 && dec[0] == 0x1F && dec[1] == 0x8B) {
size_t z_len = 0;
gz_out = uz_decompress(dec, dec_len, &z_len, 15 + 32);
if (gz_out) { final_data = gz_out; final_len = z_len; fmt = 'g'; }
}
/* zip: 50 4b 03 04 */
else if (dec_len >= 4 && dec[0] == 0x50 && dec[1] == 0x4B &&
dec[2] == 0x03 && dec[3] == 0x04) {
size_t z_len = 0;
gz_out = unzip_first(dec, dec_len, &z_len);
if (gz_out) { final_data = gz_out; final_len = z_len; fmt = 'z'; }
}
int ret = file_write_all(js_path, final_data, final_len);
free(dec);
if (gz_out) free(gz_out);
if (ret == 0) {
/* 成功则删掉原 jsc,同时写入 .fmt 格式记录 */
remove(jsc_path);
char fmt_path[1024];
size_t fl = strlen(js_path);
memcpy(fmt_path, js_path, fl);
memcpy(fmt_path + fl, ".fmt", 5);
file_write_all(fmt_path, (const uint8_t*)&fmt, 1);
}
return ret;
}
之前写的一个检测逻辑,拿去补上 |
|