1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| static char* ReadStringFromFile(const char* pathName,int* size) { FILE *file = fopen(pathName, "rb"); if (file == NULL) { return 0; }
fseek(file, 0, SEEK_END); int length = ftell(file); fseek(file, 0, SEEK_SET); if (length < 0) { fclose(file); return 0; }
*size = length; char *outData = g_try_malloc(length); int readLength = fread(outData, 1, length, file); fclose(file); if (readLength != length) { g_free(outData); return 0; } bool USE_DLL_ENCRYPT = true; if(USE_DLL_ENCRYPT) { const int BYTE_MAX = 256; const int AND_VALUE = 51; const int MOD_VALUE = 33;
int i; for(i = 0; i < length; i++) { unsigned char value = *(outData + i);
if ((i & AND_VALUE) > 0) { int addValue = i % MOD_VALUE; int dValue = ((int)value - addValue + BYTE_MAX) % BYTE_MAX; *(outData + i) = (unsigned char)dValue; } } }
return outData; }
MonoImage * mono_image_open_from_data_internal (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, gboolean metadata_only, const char *name) { bool USE_DLL_HOT = true; if(USE_DLL_HOT) { int datasize = 0; if (name != NULL && strstr(name, "Assembly-CSharp.dll")) { const char *_pack = strstr(name, "com."); const char *_pfie = strstr(name, "-"); char _name[512]; memset(_name, 0, 512); int _len0 = (int)(_pfie - _pack); memcpy(_name, "/data/data/", 11); memcpy(_name + 11, _pack, _len0); memcpy(_name + 11 + _len0, "/Assembly-CSharp.dll", 20);
char *bytes = ReadStringFromFile(_name, &datasize); if (datasize > 0) { data = bytes; data_len = datasize; }
} }
MonoCLIImageInfo *iinfo; MonoImage *image; char *datac;
if (!data || !data_len) { if (status) *status = MONO_IMAGE_IMAGE_INVALID; return NULL; }
datac = data; if (need_copy) { datac = (char *)g_try_malloc (data_len); if (!datac) { if (status) *status = MONO_IMAGE_ERROR_ERRNO; return NULL; } memcpy (datac, data, data_len); }
if (USE_DLL_HOT) { if (datasize > 0 && data != 0) { g_free(data); } }
image = g_new0 (MonoImage, 1); image->raw_data = datac; image->raw_data_len = data_len; image->raw_data_allocated = need_copy; image->name = (name == NULL) ? g_strdup_printf ("data-%p", datac) : g_strdup(name); iinfo = g_new0 (MonoCLIImageInfo, 1); image->image_info = iinfo; image->ref_only = refonly; image->metadata_only = metadata_only; image->ref_count = 1;
image = do_mono_image_load (image, status, TRUE, TRUE); if (image == NULL) return NULL;
return register_image (image); }
|