You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
673 lines
23 KiB
673 lines
23 KiB
#ifdef ANDROID |
|
|
|
#include <malloc.h> |
|
|
|
#include <zlib.h> |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <inttypes.h> |
|
#include <time.h> |
|
#include <unistd.h> |
|
#include <fcntl.h> |
|
#include <stdbool.h> |
|
|
|
#include "third/minizip/mz.h" |
|
#include "third/minizip/mz_os.h" |
|
#include "third/minizip/mz_strm.h" |
|
#include "third/minizip/mz_strm_mem.h" |
|
#include "third/minizip/mz_strm_bzip.h" |
|
#include "third/minizip/mz_strm_zlib.h" |
|
#include "third/minizip/mz_zip.h" |
|
#include "third/minizip/mz_strm_split.h" |
|
#include "third/minizip/mz_strm_buf.h" |
|
|
|
static uint8_t rotl8 (uint8_t n, unsigned int c) |
|
{ |
|
const unsigned int mask = (CHAR_BIT*sizeof(n) - 1); |
|
|
|
c &= mask; |
|
return (n<<c) | (n>>( (-c)&mask )); |
|
} |
|
|
|
static uint8_t rotr8 (uint8_t n, unsigned int c) |
|
{ |
|
const unsigned int mask = (CHAR_BIT*sizeof(n) - 1); |
|
|
|
c &= mask; |
|
return (n>>c) | (n<<( (-c)&mask )); |
|
} |
|
|
|
uint8_t _data[] = {0x99, 0x81, 0xc1, 0x91, 0x99, 0x33, 0x99, 0x81, 0xc1, 0x91, 0x89, 0x33, 0xb9, 0xb, 0x81, 0x99, 0x91, 0x89, 0x91, 0x91, 0xa1, 0xb1, 0xa9, 0x89, 0x91, 0xb1, 0xa1, 0xb, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x13, 0xa9, 0x81, 0x99, 0x81, 0x99, 0xb9, 0x99, 0x89, 0x13, 0x99, 0x81, 0xc9, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb1, 0x89, 0x99, 0x91, 0xa9, 0xa9, 0xa9, 0x99, 0x99, 0x89, 0x89, 0x81, 0x99, 0x81, 0x2b, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb, 0x89, 0x99, 0xb9, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x99, 0x89, 0x89, 0xb1, 0x99, 0x81, 0x89, 0xa1, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0x99, 0x89, 0x99, 0x23, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x91, 0x81, 0xa1, 0xa1, 0xb1, 0xa9, 0xb1, 0x91, 0xb9, 0xa9, 0xb1, 0xb9, 0x99, 0x81, 0x91, 0x81, 0x89, 0xb9, 0x23, 0x99, 0x91, 0x99, 0x89, 0x99, 0x81, 0x99, 0x91, 0x99, 0x89, 0x99, 0x81, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0xa9, 0xb, 0x89, 0xc1, 0x33, 0x99, 0x91, 0x99, 0x81, 0x99, 0xa9, 0x99, 0x89, 0x99, 0x81, 0x99, 0x91, 0x99, 0x81, 0x99, 0x99, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0x99, 0x89, 0xa9, 0xb, 0x99, 0x81, 0x99, 0xb9, 0x99, 0x89, 0x13, 0x99, 0x81, 0xc9, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb1, 0x89, 0x99, 0x91, 0xa9, 0xa9, 0xa9, 0x99, 0x99, 0x89, 0x89, 0x81, 0x99, 0x81, 0x2b, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0xb, 0x89, 0x99, 0xb9, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x99, 0x89, 0x89, 0xb1, 0x99, 0x81, 0x89, 0xa1, 0xb1, 0x99, 0xa9, 0xa9, 0xa1, 0x99, 0x89, 0x99, 0x23, 0xa1, 0x89, 0xb1, 0x2b, 0xb1, 0xa1, 0xb9, 0x91, 0xb1, 0x33, 0xb1, 0xc9, 0xb1, 0xa1, 0x91, 0x81, 0xa1, 0xa1, 0xb1, 0xa9, 0xb1, 0x91, 0xb9, 0xa9, 0xb1, 0xb9, 0x99, 0x81, 0xc1, 0x91, 0x89, 0x91, 0x91, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x89, 0xa9, 0x81, 0x99, 0xc1, 0x91, 0x89, 0x33, 0x81, 0x99, 0x81, 0xc1, 0x91, 0x89, 0xb, 0x91, 0xc1, 0x91, 0x89, 0x89, 0x81, 0x1b, 0xa9, 0xb, 0x1b, 0xc9, 0x99, 0xa9, 0x99, 0xb1, 0x99, 0xa1, 0xb1, 0xc1, 0x99, 0xa1, 0xa1, 0xb9, 0x33, 0xb, 0xb, 0x89, 0xb1, 0x89, 0xb, 0x33, 0x2b, 0xa1, 0x2b, 0x2b, 0x13, 0x89, 0x99, 0x91, 0xb, 0x91, 0xc1, 0x13, 0xb, 0x91, 0xc9, 0xb9, 0x91, 0xb, 0xb, 0xa9, 0x23, 0xb9, 0x81, 0xc1, 0xc1, 0x91, 0x91, 0x13, 0x33, 0xb9, 0xb1, 0xb9, 0x23, 0xc1, 0xb1, 0xc9, 0x23, 0x33, 0x2b, 0x23, 0x1b, 0xc1, 0x81, 0x99, 0x99, 0xb1, 0xa9, 0x23, 0xc9, 0x23, 0x1b, 0x99, 0x2b, 0x33, 0x99, 0xc9, 0xb9, 0x33, 0xb, 0xb1, 0x81, 0x99, 0xa9, 0x23, 0x13, 0xb9, 0x33, 0x33, 0x1b, 0x23, 0xc1, 0xb1, 0x23, 0xb, 0xb1, 0x23, 0xb1, 0xa9, 0x23, 0xb, 0x89, 0xa9, 0xc9, 0x23, 0x99, 0x89, 0xa9, 0x81, 0x99, 0xb1, 0xc1, 0xb1, 0xa1, 0x13, 0x99, 0xb, 0xc9, 0x81, 0xc1, 0xb, 0x2b, 0x81, 0xa1, 0x89, 0xa1, 0x89, 0x33, 0x23, 0xb1, 0xb9, 0xa9, 0x23, 0xa9, 0xb, 0xb9, 0xa1, 0xc1, 0xb, 0x33, 0xc9, 0x99, 0xb1, 0x2b, 0x89, 0x91, 0x23, 0x23, 0x99, 0xa1, 0xc9, 0xa1, 0x23, 0x89, 0x33, 0x13, 0xb, 0xb1, 0x1b, 0xa1, 0xb, 0xa9, 0x23, 0xc9, 0xa9, 0xc1, 0xb9, 0xc9, 0xb, 0x89, 0xa1, 0x89, 0xc1, 0xc1, 0x1b, 0xa1, 0x81, 0x89, 0x23, 0xb1, 0x2b, 0x33, 0x1b, 0xc9, 0x89, 0x89, 0xb9, 0x13, 0x99, 0xa1, 0x2b, 0x33, 0x99, 0x13, 0x33, 0x23, 0x91, 0x91, 0x33, 0xb, 0x33, 0x1b, 0x33, 0xc1, 0x23, 0xc1, 0xb9, 0x13, 0xa1, 0xb9, 0x81, 0x99, 0xb9, 0x89, 0x13, 0xc1, 0x91, 0x81, 0x2b, 0x91, 0xb9, 0x91, 0xa1, 0x99, 0x89, 0x1b, 0x99, 0xb9, 0xa9, 0xb9, 0x1b, 0x99, 0x23, 0xb9, 0x33, 0xb1, 0x91, 0x91, 0x33, 0x2b, 0xa1, 0x89, 0x89, 0xc9, 0xa1, 0x33, 0x23, 0x2b, 0x99, 0xb, 0x99, 0xa1, 0xa9, 0xc1, 0x81, 0x23, 0x13, 0xa9, 0x13, 0xb9, 0x23, 0x1b, 0x2b, 0xa1, 0x33, 0x13, 0x91, 0x81, 0x13, 0x2b, 0xc9, 0xb1, 0x13, 0x33, 0x33, 0x99, 0xa9, 0x99, 0xb1, 0x91, 0xa9, 0xb, 0x33, 0xc1, 0xb1, 0x13, 0xa9, 0xb, 0x33, 0xb, 0xb1, 0xa1, 0x33, 0x33, 0x2b, 0xc9, 0xa1, 0x91, 0x91, 0xa9, 0x99, 0xa9, 0xb, 0x33, 0x1b, 0xc1, 0xa1, 0xa1, 0xc1, 0x91, 0x91, 0x13, 0xb, 0xc9, 0xb9, 0x13, 0xc9, 0x2b, 0xb1, 0xa9, 0xa1, 0xa9, 0xa1, 0x2b, 0x81, 0x23, 0x1b, 0x33, 0xb9, 0xc9, 0x1b, 0xc1, 0x13, 0xb, 0x81, 0xa1, 0xc1, 0xb9, 0xa9, 0x13, 0x1b, 0xb1, 0xb9, 0x89, 0x89, 0xb9, 0xb9, 0xc9, 0xa9, 0xc1, 0xb1, 0x99, 0xa1, 0x99, 0xc9, 0xa1, 0xb1, 0x1b, 0x2b, 0x33, 0xa9, 0x91, 0x23, 0x33, 0x1b, 0x13, 0xa9, 0x99, 0x91, 0x2b, 0xc9, 0xb, 0xa1, 0x91, 0xb1, 0xb, 0xa1, 0x91, 0xb9, 0xc9, 0xa1, 0x13, 0xb, 0xc9, 0x99, 0xc1, 0x33, 0x91, 0x23, 0xc9, 0x33, 0x13, 0xb1, 0x91, 0xb1, 0xc1, 0xa9, 0xb, 0x89, 0xc9, 0x33, 0x91, 0x99, 0x2b, 0x91, 0xb1, 0xc9, 0xb, 0x91, 0x91, 0x99, 0x23, 0x23, 0x33, 0x23, 0x81, 0xa9, 0xb9, 0xb, 0xa9, 0x33, 0xa1, 0x33, 0xc1, 0xa1, 0xa1, 0xc9, 0x23, 0xb9, 0xc9, 0xb, 0x91, 0xb, 0x33, 0xa1, 0xb, 0xc1, 0x33, 0x89, 0x1b, 0x99, 0x13, 0xb1, 0xb1, 0xb1, 0xc9, 0x89, 0xc9, 0x13, 0xb, 0x33, 0xc9, 0x99, 0x91, 0xb1, 0x1b, 0xa9, 0x99, 0x89, 0x99, 0x2b, 0xa1, 0xb, 0xb9, 0xc1, 0xa1, 0xb1, 0x13, 0xa9, 0x33, 0xc9, 0x1b, 0x33, 0xb9, 0xc9, 0x33, 0x33, 0x99, 0x99, 0x81, 0xc1, 0xb1, 0x13, 0xc1, 0xc9, 0x1b, 0x89, 0xb9, 0xc9, 0x89, 0x91, 0x99, 0x89, 0x81, 0x89, 0xb, 0x99, 0x91, 0x89, 0x99, 0x81, 0x89, 0x33, 0x99, 0x81, 0x89, 0x23, 0xb1, 0x99, 0xa9, 0xa9, 0x89, 0x23, 0x2b, 0xa1, 0x89, 0xb1, 0xa1, 0x89, 0xa1, 0xb1, 0x89, 0x91, 0xa9, 0x99, 0x99, 0xb1, 0x91, 0x13, 0xc9, 0x2b, 0xa1, 0x99, 0x91, 0xa9, 0xa9, 0xa1, 0x81, 0xa1, 0xc9, 0xc9, 0x89, 0xb, 0x91, 0xa9, 0x99, 0x91, 0xa9, 0x99, 0xa1, 0x99, 0x2b, 0x33, 0xb9, 0x1b, 0x23, 0x89, 0x99, 0xb1, 0xa9, 0x99, 0x81, 0x23, 0xb1, 0xc9, 0x91, 0xb, 0xc1, 0xb1, 0xa1, 0xc1, 0xc1, 0xb1, 0x33, 0xb9, 0x23, 0x89, 0x89, 0x13, 0xa9, 0x81, 0x99, 0xc1, 0x91, 0x89, 0x89, 0x81, 0xc9, 0x91, 0xb9, 0x13, 0xb1, 0x81, 0xc1, 0x1b, 0xb9, 0xa1, 0xb1, 0xc1, 0xc9, 0x33, 0x2b, 0x1b, 0xc9, 0xb, 0xa9, 0x1b, 0x99, 0x33, 0x1b, 0xa9, 0x33, 0x33, 0x81, 0x99, 0xb, 0xb9, 0x91, 0xa9, 0xc9, 0xc1, 0x1b, 0xb1, 0xb1, 0xc9, 0xb1, 0xc1, 0xa1, 0xb1, 0x13, 0xb1, 0x1b, 0xc1, 0x2b, 0x0}; |
|
|
|
#define TAG_INTEGER 0x02 |
|
#define TAG_BITSTRING 0x03 |
|
#define TAG_OCTETSTRING 0x04 |
|
#define TAG_NULL 0x05 |
|
#define TAG_OBJECTID 0x06 |
|
#define TAG_UTCTIME 0x17 |
|
#define TAG_GENERALIZEDTIME 0x18 |
|
#define TAG_SEQUENCE 0x30 |
|
#define TAG_SET 0x31 |
|
|
|
#define TAG_OPTIONAL 0xA0 |
|
|
|
#define NAME_LEN 63 |
|
|
|
typedef struct element { |
|
unsigned char tag; |
|
char name[NAME_LEN]; |
|
int begin; |
|
size_t len; |
|
int level; |
|
struct element *next; |
|
} element; |
|
|
|
static char *getProc() { |
|
const size_t BUFFER_SIZE = 256; |
|
char buffer[BUFFER_SIZE]; |
|
memset(buffer, 0, sizeof buffer); |
|
int fd = open("/p""\x72""oc""\x2f""se""\x6c""f/""\x63""md""\x6c""in""\x65", O_RDONLY); |
|
if (fd > 0) { |
|
ssize_t r = read(fd, buffer, BUFFER_SIZE - 1); |
|
close(fd); |
|
if (r > 0) { |
|
return strdup(buffer); |
|
} |
|
} |
|
return NULL; |
|
} |
|
|
|
static const char *get_f(const char *filename) { |
|
const char *dot = strrchr(filename, '.'); |
|
if (!dot || dot == filename) return ""; |
|
return dot + 1; |
|
} |
|
|
|
char *get_p() { |
|
|
|
char *package = getProc(); |
|
if (NULL == package) { |
|
return NULL; |
|
} |
|
|
|
FILE *fp = fopen("/p""\x72""oc""\x2f""se""\x6c""f/""\x6d""ap""\x73", "r"); |
|
if (NULL == fp) { |
|
free(package); |
|
return NULL; |
|
} |
|
const size_t BUFFER_SIZE = 256; |
|
char buffer[BUFFER_SIZE]; |
|
char path[BUFFER_SIZE]; |
|
memset(buffer, 0, sizeof buffer); |
|
memset(path, 0, sizeof buffer); |
|
|
|
bool find = false; |
|
while (fgets(buffer, BUFFER_SIZE, fp)) { |
|
if (sscanf(buffer, "%*llx-%*llx %*s %*s %*s %*s %s", path) == 1) { |
|
if (strstr(path, package)) { |
|
char *bname = basename(path); |
|
if (strcasecmp(get_f(bname), "ap""\x6b") == 0) { |
|
find = true; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
fclose(fp); |
|
free(package); |
|
if (find) { |
|
return strdup(path); |
|
} |
|
return NULL; |
|
} |
|
|
|
int string_starts_with(const char *str, const char *prefix){ |
|
size_t str_len = strlen(str); |
|
size_t prefix_len = strlen(prefix); |
|
return str_len < prefix_len ? 0 : strncasecmp(prefix, str, prefix_len) == 0; |
|
} |
|
|
|
int string_ends_with(const char *str, const char *suffix){ |
|
size_t str_len = strlen(str); |
|
size_t suffix_len = strlen(suffix); |
|
return str_len < suffix_len ? 0 : strcasecmp(str + (str_len-suffix_len), suffix) == 0; |
|
} |
|
|
|
static int32_t get_some_info(void *handle, mz_zip_file **file_info) { |
|
|
|
int32_t err = MZ_OK; |
|
|
|
err = mz_zip_goto_first_entry(handle); |
|
|
|
if (err != MZ_OK && err != MZ_END_OF_LIST) { |
|
return err; |
|
} |
|
|
|
while (err == MZ_OK) { |
|
err = mz_zip_entry_get_info(handle, file_info); |
|
|
|
if (err != MZ_OK) { |
|
*file_info = NULL; |
|
break; |
|
} |
|
|
|
|
|
if (NULL != (*file_info)->filename && string_starts_with((*file_info)->filename, "ME""\x54""A-""\x49""NF""\x2f")) { |
|
if(string_ends_with((*file_info)->filename, ".R""\x53""A") |
|
|| string_ends_with((*file_info)->filename, ".D""\x53""A") |
|
|| string_ends_with((*file_info)->filename, ".E""\x43")){ |
|
return MZ_OK; |
|
} |
|
} |
|
|
|
err = mz_zip_goto_next_entry(handle); |
|
|
|
if (err != MZ_OK && err != MZ_END_OF_LIST) { |
|
*file_info = NULL; |
|
return err; |
|
} |
|
} |
|
|
|
*file_info = NULL; |
|
|
|
if (err == MZ_END_OF_LIST) { |
|
return MZ_OK; |
|
} |
|
return err; |
|
} |
|
|
|
static void hmmmmmmmmm(const mz_zip_file *file_info) { |
|
uint32_t ratio = 0; |
|
struct tm tmu_date; |
|
const char *string_method = NULL; |
|
char crypt = ' '; |
|
|
|
ratio = 0; |
|
if (file_info->uncompressed_size > 0) |
|
ratio = (uint32_t)((file_info->compressed_size * 100) / file_info->uncompressed_size); |
|
|
|
|
|
if (file_info->flag & MZ_ZIP_FLAG_ENCRYPTED) |
|
crypt = '*'; |
|
|
|
switch (file_info->compression_method) |
|
{ |
|
case MZ_COMPRESS_METHOD_RAW: |
|
string_method = "Stored"; |
|
break; |
|
case MZ_COMPRESS_METHOD_DEFLATE: |
|
string_method = "Deflate"; |
|
break; |
|
case MZ_COMPRESS_METHOD_BZIP2: |
|
string_method = "BZip2"; |
|
break; |
|
case MZ_COMPRESS_METHOD_LZMA: |
|
string_method = "LZMA"; |
|
break; |
|
default: |
|
string_method = "Unknown"; |
|
} |
|
|
|
mz_zip_time_t_to_tm(file_info->modified_date, &tmu_date); |
|
} |
|
|
|
unsigned char *_get_det(const char *fullApkPath, size_t *len) { |
|
|
|
unsigned char *result = NULL; |
|
int32_t err = 0; |
|
int32_t read_file = 0; |
|
|
|
void *handle = NULL; |
|
void *file_stream = NULL; |
|
void *split_stream = NULL; |
|
void *buf_stream = NULL; |
|
char *password = NULL; |
|
|
|
int64_t disk_size = 0; |
|
int16_t mode = MZ_OPEN_MODE_READ; |
|
int32_t err_close = 0; |
|
|
|
if (mz_os_file_exists(fullApkPath) != MZ_OK) { } |
|
mz_stream_os_create(&file_stream); |
|
mz_stream_buffered_create(&buf_stream); |
|
mz_stream_split_create(&split_stream); |
|
|
|
mz_stream_set_base(split_stream, file_stream); |
|
|
|
mz_stream_split_set_prop_int64(split_stream, MZ_STREAM_PROP_DISK_SIZE, disk_size); |
|
|
|
err = mz_stream_open(split_stream, fullApkPath, mode); |
|
mz_zip_file *file_info = NULL; |
|
if (err != MZ_OK) { |
|
} else { |
|
handle = mz_zip_open(split_stream, mode); |
|
|
|
if (handle == NULL) { |
|
err = MZ_FORMAT_ERROR; |
|
} else { |
|
err = get_some_info(handle, &file_info); |
|
if (err == MZ_OK && NULL != file_info) { |
|
hmmmmmmmmm(file_info); |
|
|
|
err = mz_zip_entry_read_open(handle, 0, password); |
|
if (err != MZ_OK) { |
|
} else { |
|
result = calloc(file_info->uncompressed_size, sizeof(unsigned char)); |
|
if (NULL != result) { |
|
read_file = mz_zip_entry_read(handle, result, |
|
(uint32_t) (file_info->uncompressed_size)); |
|
if (read_file < 0) { |
|
free(result); |
|
result = NULL; |
|
err = read_file; |
|
} else { |
|
*len = (size_t) read_file; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
err_close = mz_zip_close(handle); |
|
|
|
if (err_close != MZ_OK) { |
|
err = err_close; |
|
} |
|
|
|
mz_stream_close(split_stream); |
|
|
|
} |
|
mz_stream_split_delete(&split_stream); |
|
mz_stream_buffered_delete(&buf_stream); |
|
mz_stream_os_delete(&file_stream); |
|
|
|
return result; |
|
} |
|
|
|
static uint32_t m_pos = 0; |
|
static size_t m_length = 0; |
|
static struct element *head = NULL; |
|
static struct element *tail = NULL; |
|
|
|
static uint32_t _len_num(unsigned char lenbyte) { |
|
uint32_t num = 1; |
|
if (lenbyte & 0x80) { |
|
num += lenbyte & 0x7f; |
|
} |
|
return num; |
|
} |
|
|
|
static uint32_t _get_len(unsigned char *_braq, unsigned char lenbyte, int offset) { |
|
int32_t len = 0, num; |
|
unsigned char tmp; |
|
if (lenbyte & 0x80) { |
|
num = lenbyte & 0x7f; |
|
if (num < 0 || num > 4) { |
|
return 0; |
|
} |
|
while (num) { |
|
len <<= 8; |
|
tmp = _braq[offset++]; |
|
len += (tmp & 0xff); |
|
num--; |
|
} |
|
} else { |
|
len = lenbyte & 0xff; |
|
} |
|
|
|
return (uint32_t) len; |
|
} |
|
|
|
int32_t _c_el(unsigned char *_braq, unsigned char tag, char *name, int level) { |
|
unsigned char get_tag = _braq[m_pos++]; |
|
if (get_tag != tag) { |
|
m_pos--; |
|
return -1; |
|
} |
|
unsigned char lenbyte = _braq[m_pos]; |
|
int len = _get_len(_braq, lenbyte, m_pos + 1); |
|
m_pos += _len_num(lenbyte); |
|
|
|
element *node = (element *) calloc(1, sizeof(element)); |
|
node->tag = get_tag; |
|
strcpy(node->name, name); |
|
node->begin = m_pos; |
|
node->len = len; |
|
node->level = level; |
|
node->next = NULL; |
|
|
|
if (head == NULL) { |
|
head = tail = node; |
|
} else { |
|
tail->next = node; |
|
tail = node; |
|
} |
|
return len; |
|
} |
|
|
|
bool parse_c(unsigned char *_braq, int level) { |
|
char *names[] = { |
|
"tb""\x73""Ce""\x72""ti""\x66""ic""\x61""te","ve""\x72""si""\x6f""n","se""\x72""ia""\x6c""Nu""\x6d""be""\x72", |
|
"si""\x67""na""\x74""ur""\x65","is""\x73""ue""\x72", "va""\x6c""id""\x69""ty", "su""\x62""je""\x63""t", |
|
"su""\x62""je""\x63""tP""\x75""bl""\x69""cK""\x65""yI""\x6e""fo", "is""\x73""ue""\x72""Un""\x69""qu""\x65""ID""\x2d""[o""\x70""ti""\x6f""na""\x6c""]", |
|
"su""\x62""je""\x63""tU""\x6e""iq""\x75""eI""\x44""-[""\x6f""pt""\x69""on""\x61""l]", |
|
"ex""\x74""en""\x73""io""\x6e""s-""\x5b""op""\x74""io""\x6e""al""\x5d", |
|
"si""\x67""na""\x74""ur""\x65""Al""\x67""or""\x69""th""\x6d", |
|
"si""\x67""na""\x74""ur""\x65""Va""\x6c""ue"}; |
|
int len = 0; |
|
unsigned char tag; |
|
|
|
len = _c_el(_braq, TAG_SEQUENCE, names[0], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
|
|
tag = _braq[m_pos]; |
|
if (((tag & 0xc0) == 0x80) && ((tag & 0x1f) == 0)) { |
|
m_pos += 1; |
|
m_pos += _len_num(_braq[m_pos]); |
|
len = _c_el(_braq, TAG_INTEGER, names[1], level + 1); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
} |
|
|
|
int i; |
|
for (i = 2; i < 11; i++) { |
|
switch (i) { |
|
case 2: |
|
tag = TAG_INTEGER; |
|
break; |
|
case 8: |
|
tag = 0xA1; |
|
break; |
|
case 9: |
|
tag = 0xA2; |
|
break; |
|
case 10: |
|
tag = 0xA3; |
|
break; |
|
default: |
|
tag = TAG_SEQUENCE; |
|
} |
|
len = _c_el(_braq, tag, names[i], level + 1); |
|
if (i < 8 && len == -1) { |
|
return false; |
|
} |
|
if (len != -1) |
|
m_pos += len; |
|
} |
|
|
|
len = _c_el(_braq, TAG_SEQUENCE, names[11], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
|
|
len = _c_el(_braq, TAG_BITSTRING, names[12], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
return true; |
|
} |
|
|
|
bool _s_info(unsigned char *_braq, int level) { |
|
char *names[] = { |
|
"ve""\x72""si""\x6f""n", |
|
"is""\x73""ue""\x72""An""\x64""Se""\x72""ia""\x6c""Nu""\x6d""be""\x72", |
|
"di""\x67""es""\x74""Al""\x67""or""\x69""th""\x6d""Id", |
|
"au""\x74""he""\x6e""ti""\x63""at""\x65""dA""\x74""tr""\x69""bu""\x74""es""\x2d""[o""\x70""ti""\x6f""na""\x6c""]", |
|
"di""\x67""es""\x74""En""\x63""ry""\x70""ti""\x6f""nA""\x6c""go""\x72""it""\x68""mI""\x64", |
|
"en""\x63""ry""\x70""te""\x64""Di""\x67""es""\x74", |
|
"un""\x61""ut""\x68""en""\x74""ic""\x61""te""\x64""At""\x74""ri""\x62""ut""\x65""s-""\x5b""op""\x74""io""\x6e""al""\x5d"}; |
|
|
|
int len,i; |
|
unsigned char tag; |
|
for (i = 0; i < sizeof(names) / sizeof(names[0]); i++) { |
|
switch (i) { |
|
case 0: |
|
tag = TAG_INTEGER; |
|
break; |
|
case 3: |
|
tag = 0xA0; |
|
break; |
|
case 5: |
|
tag = TAG_OCTETSTRING; |
|
break; |
|
case 6: |
|
tag = 0xA1; |
|
break; |
|
default: |
|
tag = TAG_SEQUENCE; |
|
|
|
} |
|
len = _c_el(_braq, tag, names[i], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
if (i == 3 || i == 6) |
|
continue; |
|
return false; |
|
} |
|
m_pos += len; |
|
} |
|
return m_pos == m_length ? true : false; |
|
} |
|
|
|
bool parse_cnt(unsigned char *_braq, int level) { |
|
|
|
char *names[] = {"ve""\x72""si""\x6f""n", |
|
"Di""\x67""es""\x74""Al""\x67""or""\x69""th""\x6d""s", |
|
"co""\x6e""te""\x6e""tI""\x6e""fo", |
|
"ce""\x72""ti""\x66""ic""\x61""te""\x73""-[""\x6f""pt""\x69""on""\x61""l]", |
|
"cr""\x6c""s-""\x5b""op""\x74""io""\x6e""al""\x5d", |
|
"si""\x67""ne""\x72""In""\x66""os", |
|
"si""\x67""ne""\x72""In""\x66""o"}; |
|
|
|
unsigned char tag; |
|
int len = 0; |
|
|
|
len = _c_el(_braq, TAG_INTEGER, names[0], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
|
|
len = _c_el(_braq, TAG_SET, names[1], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
|
|
len = _c_el(_braq, TAG_SEQUENCE, names[2], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
|
|
tag = _braq[m_pos]; |
|
if (tag == TAG_OPTIONAL) { |
|
m_pos++; |
|
m_pos += _len_num(_braq[m_pos]); |
|
len = _c_el(_braq, TAG_SEQUENCE, names[3], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
bool ret = parse_c(_braq, level + 1); |
|
if (ret == false) { |
|
return ret; |
|
} |
|
} |
|
|
|
tag = _braq[m_pos]; |
|
if (tag == 0xA1) { |
|
m_pos++; |
|
m_pos += _len_num(_braq[m_pos]); |
|
len = _c_el(_braq, TAG_SEQUENCE, names[4], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
m_pos += len; |
|
} |
|
|
|
tag = _braq[m_pos]; |
|
if (tag != TAG_SET) { |
|
return false; |
|
} |
|
len = _c_el(_braq, TAG_SET, names[5], level); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
|
|
len = _c_el(_braq, TAG_SEQUENCE, names[6], level + 1); |
|
if (len == -1 || m_pos + len > m_length) { |
|
return false; |
|
} |
|
return _s_info(_braq, level + 2); |
|
} |
|
|
|
static element *_get_el(const char *name, element *begin) { |
|
if (begin == NULL) |
|
begin = head; |
|
element *p = begin; |
|
while (p != NULL) { |
|
if (strncmp(p->name, name, strlen(name)) == 0) { |
|
return p; |
|
} |
|
|
|
p = p->next; |
|
} |
|
return p; |
|
} |
|
|
|
static bool __parse(unsigned char *_braq, size_t length) { |
|
unsigned char tag, lenbyte; |
|
int len = 0; |
|
int level = 0; |
|
m_pos = 0; |
|
m_length = length; |
|
|
|
tag = _braq[m_pos++]; |
|
if (tag != TAG_SEQUENCE) { |
|
return false; |
|
} |
|
lenbyte = _braq[m_pos]; |
|
len = _get_len(_braq, lenbyte, m_pos + 1); |
|
m_pos += _len_num(lenbyte); |
|
if (m_pos + len > m_length) |
|
return false; |
|
|
|
len = _c_el(_braq, TAG_OBJECTID, "co""\x6e""te""\x6e""tT""\x79""pe", level); |
|
if (len == -1) { |
|
return false; |
|
} |
|
m_pos += len; |
|
|
|
tag = _braq[m_pos++]; |
|
lenbyte = _braq[m_pos]; |
|
m_pos += _len_num(lenbyte); |
|
|
|
len = _c_el(_braq, TAG_SEQUENCE, "co""\x6e""te""\x6e""t-""\x5b""op""\x74""io""\x6e""al""\x5d", level); |
|
if (len == -1) { |
|
return false; |
|
} |
|
return parse_cnt(_braq, level + 1); |
|
} |
|
|
|
static size_t _numforlen(size_t len) { |
|
size_t num = 0; |
|
size_t tmp = len; |
|
while (tmp) { |
|
num++; |
|
tmp >>= 8; |
|
} |
|
if ((num == 1 && len >= 0x80) || (num > 1)) |
|
num += 1; |
|
return num; |
|
} |
|
|
|
size_t pkcs7HelperGetTagOffset(element *p, unsigned char *_braq) { |
|
if (p == NULL) |
|
return 0; |
|
size_t offset = _numforlen(p->len); |
|
if (_braq[p->begin - offset - 1] == p->tag) |
|
return offset + 1; |
|
else |
|
return 0; |
|
} |
|
|
|
unsigned char *_get_si(unsigned char *_braq, size_t len_in, size_t *len_out) { |
|
if (!__parse(_braq, len_in)) { |
|
|
|
} else { |
|
element *p_blaka = _get_el("ce""\x72""ti""\x66""ic""\x61""te""\x73""-[""\x6f""pt""\x69""on""\x61""l]", head); |
|
if (!p_blaka) { |
|
return NULL; |
|
} |
|
size_t offset = pkcs7HelperGetTagOffset(p_blaka, _braq); |
|
if (offset == 0) { |
|
return NULL; |
|
} |
|
*len_out = p_blaka->len + offset; |
|
return _braq + p_blaka->begin - offset; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
void _m_free_m() { |
|
element *p = head; |
|
while (p != NULL) { |
|
head = p->next; |
|
free(p); |
|
p = head; |
|
} |
|
head = NULL; |
|
} |
|
|
|
int getAssets() |
|
{ |
|
char *path = get_p(); |
|
|
|
if (!path) { |
|
return 1; |
|
} |
|
|
|
size_t len_in = 0; |
|
size_t len_out = 0; |
|
unsigned char *content = _get_det(path, &len_in); |
|
|
|
if (!content) { |
|
free(path); |
|
return 1; |
|
} |
|
|
|
unsigned char *res = _get_si(content, len_in, &len_out); |
|
|
|
char buf[1024]; |
|
buf[0] = 0; |
|
|
|
int i; |
|
for( i = 0; i < len_out; i++ ) { |
|
snprintf(buf, sizeof buf, "%s%x", buf, res[i]); |
|
} |
|
|
|
char *s = _data; |
|
char *s2 = buf; |
|
while( *s ) |
|
{ |
|
char byte = rotl8(rotr8(rotr8(rotl8(rotr8(rotr8(rotr8(rotl8(*s, 8), 4), 4), 3), 1), 3), 2), 4); |
|
|
|
if( byte != *s2 ) |
|
return 0; |
|
|
|
s++; |
|
s2++; |
|
} |
|
|
|
return 1; |
|
} |
|
#else |
|
int getAssets() { return 1; } |
|
#endif
|
|
|