/* * process_ecma_array The onMetaData sub type named ECMA Array * data, the data will be parsed * * return the offset of the data */ int process_ecma_array(unsigned char *data) { int ecma_array_len = 0; int keyname_len = 0; unsigned char keyname[32]; unsigned char *p = data; int i = 0; ecma_array_len = get_key_len(p); p += 4; for (i = 0; i < ecma_array_len; i++) { keyname_len = get_string_len(p); p += 2; memset(keyname, 0, sizeof(keyname)); strncpy((char *)keyname, (const char *)p, keyname_len); fprintf(stdout, "keyname = [%s]\n", keyname); p += keyname_len; p += script_type_parse(p); } if (*p == 0 && *(p + 1) == 0 && *(p + 2) == 9) { p += 3; } return p - data; }
void break_repeating_key_xor(const unsigned char *in, size_t in_len, unsigned char *key, size_t key_max_len, unsigned int *key_len, unsigned char *out) { unsigned int i, j; unsigned int base_limit, limit, leftover; unsigned char *buf; *key_len = get_key_len(in, in_len, key_max_len); base_limit = in_len / *key_len; leftover = in_len % *key_len; buf = malloc(base_limit + !!leftover); if (!buf) exit(1); for (i = 0; i < *key_len; i++) { limit = base_limit + (leftover > i); for (j = 0; j < limit; j++) out[j] = in[j * *key_len + i]; key[i] = crack_single_byte_xor(out, limit, buf); } free(buf); repeating_key_xor(in, in_len, key, *key_len, out); }