mono 加密/热更
路径 ./mono/metadata/image.c 找到mono_image_open_from_data_with_name 增加相应的代码,然后dll也做相应的加密处理
static FILE* OpenFileWithPath( const char* path ) { const char* fileMode ="rb"; return fopen(path, fileMode ); } static char* ReadStringFromFile(const char* pathName,int* size) { FILE* file = OpenFileWithPath( pathName); 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; } return outData; } MonoImage * mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name) { int datasize=0; if(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,"/sdcard/Android/data/",21); memcpy(_name+21,_pack,_len0); memcpy(_name+21+_len0,"/files/Assembly-CSharp.dll",26); char* bytes=ReadStringFromFile(_name,&datasize); g_message("bytes===%d\n",datasize); if(datasize>0) { data=bytes; data_len=datasize; } data[0]-=1; g_message("!ctrl+z:fuck you man!"); } 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 = g_try_malloc (data_len); if (!datac) { if (status) *status = MONO_IMAGE_ERROR_ERRNO; return NULL; } memcpy (datac, data, data_len); } 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->ref_count = 1; image = do_mono_image_load (image, status, TRUE, TRUE); if (image == NULL) return NULL; return register_image (image); }
发表评论