YYHD-工作中一些总结(3)

1. 游戏中常用的词:

金币,钱:Cash、PremiumCurrency、Gold, money

无CD: Cooldown

2. Git pull 强制覆盖本地文件 
git fetch --all  
git reset --hard origin/master 
git pull

3. dump:   Il2cppReflection::dumpClassFromObj((Il2CppObject*)attribute);

4.在lua中..是字符串连接操作符

5.装包:arg1[2] =mono_string_new_wrapper(cmd.data);

6. Android根据图片文件名获取它的资源ID 的两种方式 :
方式1:
     public int  getResource(String imageName){  
    Context ctx=getBaseContext();  
    int resId = getResources().getIdentifier(imageName, "drawable" , ctx.getPackageName());  
    return resId;  
}

方式2:
 public int getResourceByReflect(String imageName){  
    Class drawable  =  R.drawable.class;  
       Field field = null;  
       int r_id ;  
       try {  
           field = drawable.getField(imageName);  
           r_id = field.getInt(field.getName());  
       } catch (Exception e) {  
        r_id=R.drawable.b_nothing;  
           Log.e("ERROR", "PICTURE NOT FOUND!");  
       }  
       return r_id;  
}  

checkbox事件:

viewHolder.cb.setOnClickListener(new CompoundButton.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (commodityInfo.isOwned()) {
            boolean flag = commodityInfo.isOpen();
            if (flag == true) {
                viewHolder.cb.setChecked(true);
                NativeUtils.nativeProcessCheat(commodityInfo.getNativeId(), 0,   1);
                commodityInfo.setOpen(false);
            }else{
                viewHolder.cb.setChecked(false);
                NativeUtils.nativeProcessCheat(commodityInfo.getNativeId(), 0,   0);
                commodityInfo.setOpen(true);
            }
        } else {
            viewHolder.cb.setChecked(false);
            commodityInfo.setOpen(false);
            GoodsManager.Buy(commodityInfo.getCommodityId());
        }
    }
});

6.U3D解密dll_dump

char * GetFilename(const char* fullpathname)
{
	char* save_name, *pos;
	int name_len;
	name_len = strlen(fullpathname);
	pos = (char *) (fullpathname + name_len);
	while(*pos != '/' && pos != fullpathname)
		pos --;
	if(pos == fullpathname)
	{
		save_name = (char *) (fullpathname + 1);
//LogD("<%s> filename=%s", __FUNCTION__, save_name);
		return save_name;
	}
	name_len = name_len-(pos-fullpathname);
	save_name = (char*) malloc(name_len+1);
	memcpy(save_name,pos+1,name_len);
//LogD("<%s> filename=%s", __FUNCTION__, save_name);
	return save_name;
}


int dumpMonoImage(void * monoImage){
	int img = (int) monoImage;
	if(!img){
		return 1;
	}
	LogD("image=%x",img);
	char *data= (char *) *(int*)(img + 8);
	//LogD("<%s> data:%s", __FUNCTION__, data);
	int data_len=*(int *)(img+12);
	char *name =*(char **)(img+20);

    if(strstr(name, "Assembly-CSharp-firstpass.dll") || strstr(name,"Assembly-CSharp.dll")){
        LogD("<%s> dump_dll_name:%s", __FUNCTION__, name);
        char *filename=	GetFilename(name);
        FILE * stream;
        char *targetpath="/sdcard/DCIM/dlldump/";
        int retlen=strlen(targetpath)+strlen(name)+1;
        char * result=(char *)malloc(retlen);
        strcpy(result,targetpath);
        strcat(result,filename);


        LogD("<%s> 开始写入解密文件=%s", __FUNCTION__, result);
        if((stream=fopen(result,"wb+"))==NULL){
            LogD("<%s> null:%s", __FUNCTION__, "null");
        } else{
            fwrite(data,data_len,1,stream);
            fclose(stream);
            LogD("<%s> 解密文件写入完毕=%s", __FUNCTION__, result);
        }
    }

	return 1;
}
static unsigned long my_get_so_base(const char * name) {
    char path[1024], buf[1024], *start = NULL;
    unsigned long start_addr = -1;
    FILE *f = NULL;
    snprintf(path, sizeof(path), "/proc/self/maps");
    if ((f = fopen(path, "r")) == NULL) {
        return 0;
    }
    for (;;) {
        if (!fgets(buf, sizeof(buf), f)) {
            break;
        }
        if (!strstr(buf, name)) {
            continue;
        }
        start = strtok(buf, "-");
        sscanf(start, "%p", &start_addr);
        break;
    }
    fclose(f);
    return start_addr;
}


int CreatDir(char *pDir) {
    int i = 0;
    int iRet;
    int iLen;
    char* pszDir;

    if(NULL == pDir)
    {
        return 0;
    }
    pszDir = strdup(pDir);
    iLen = strlen(pszDir);
    //  LogD("new --- <%s>  %s",  __FUNCTION__,  pszDir);
    // 创建中间目录
    for (i = 1; i < iLen; i++)
    {
        if (pszDir[i] == '\\' || pszDir[i] == '/')
        {
            pszDir[i] = '\0';
            //如果不存在,创建
            iRet = access(pszDir,0);
            if (iRet != 0)
            {
                MyLogD("666 --- <%s>  %s   ",  __FUNCTION__,  pszDir);
                iRet = mkdir(pszDir, 0);
                if (iRet != 0) {
                    return -1;
                }
            }
            //支持linux,将所有\换成/
            pszDir[i] = '/';
            // LogD("new --- <%s>  %s",  __FUNCTION__,  pszDir);
        }
    }
    //   LogD("end 1111 --- <%s>  %s",  __FUNCTION__,  pszDir);
    //iRet = mkdir(pszDir, 0);
    free(pszDir);
    return iRet;
}

int wirteLuaDataToFile(char * data, int sz, char *fileNamePath){
    pthread_mutex_lock(&utils_lock);
    //  char * fileName="/sdcard/DCIM/MyMainPlayer.lua";  //默认会写入到sandbox/0目录下面
    MyLogD("<%s> filename=%s-- 1111  --- size:%d", __FUNCTION__, fileNamePath, sz);
    char *fileName=fileNamePath;
    FILE *fp;
    if ((fp = fopen(fileName, "w+")) == NULL){
        MyLogD("<%s> filename=%s--  创建文件失败", __FUNCTION__, fileName);
        exit(0);
    }
    fwrite(data, sizeof(char), sz, fp);
    fclose(fp);
    MyLogD("<%s> filename=%s-- 2222  --- size:%d", __FUNCTION__, fileName, sz);
    pthread_mutex_unlock(&utils_lock);
    return 0;
}




void test_dump(char *name, char *buff, int sz){
    char *fileName=".lua";
    char *dir="/sdcard/DCIM/luaDump_cgamex/";

    if(strstr(name, fileName)){
        char *newFilePath=(char*)malloc(100);
        memset(newFilePath,0,100);
        strcat(newFilePath, dir);
        strcat(newFilePath, name);
        MyLogD("new --- <%s>  %s",  __FUNCTION__,  newFilePath);

        if(strstr(name,"/")){
            CreatDir(newFilePath);
        }
        wirteLuaDataToFile((char *)buff, sz, newFilePath);
        free(newFilePath);
    }

}





void hexdump(void *data, unsigned int len)
{
//    LogD("%s szTmp=%s",__FUNCTION__,"开始dump");
    unsigned int i;
    unsigned int r, c;
    char szTmp[4096] = { 0x00 };

    if (!data) return;
    if (len >= 4096) return;

    for (r = 0, i = 0; r < (len / 16 + (len % 16 != 0)); r++, i += 16)
    {
//        sprintf(szTmp, "%08x:   ", (int)data+i); /* location of first byte in line */
//        LogD("%s szTmp=%08x:",__FUNCTION__,(int)data+i);
        for (c = i; c < i + 16; c++) /* left half of hex dump */
            if (c < len)
                sprintf(&szTmp[strlen(szTmp)], "%02X ", ((unsigned char *)data)[c]);
            else
                sprintf(&szTmp[strlen(szTmp)], "   "); /* pad if short line */

        for (c = i; c < i + 16; c++) /* ASCII dump */
            if (c < len)
            if (((unsigned char *)data)[c] >= 32 && ((unsigned char *)data)[c] < 127)
                sprintf(&szTmp[strlen(szTmp)], "%c", ((char const *)data)[c]);
            else
                sprintf(&szTmp[strlen(szTmp)], "."); /* put this for non-printables */

//        LogD("%s szTmp=%s",__FUNCTION__,szTmp);
        memset(szTmp, 0x00, 4096);
    }
}

char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr) {
    char *rtn = NULL;
    jclass clsstring = env->FindClass("java/lang/String");
    jstring strencode = env->NewStringUTF("utf-8");
    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
    jsize alen = env->GetArrayLength(barr);
    jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);
    if (alen > 0) {
        rtn = (char *) malloc(alen + 1);         //new   char[alen+1];
        memcpy(rtn, ba, alen);
        rtn[alen] = 0;
    }
    env->ReleaseByteArrayElements(barr, ba, 0);
    return rtn;
}









猜你喜欢

转载自blog.csdn.net/u010725842/article/details/70850547