android so 安全性相关代码整理

通过so获取android 系统id:

 
JNIEXPORT jstring Java_com_xxxxx_init(JNIEnv* env, jobject thiz, jobject jCtxObj){
		
	jclass jCtxClz= (*env)->FindClass(env,"android/content/Context");

	jclass jclz = (*env)->GetObjectClass(env,jCtxObj);
	jmethodID  mid_getContentResolver = (*env)->GetMethodID(env,jclz,"getContentResolver","()Landroid/content/ContentResolver;");
	jobject contentresolver = (*env)->CallObjectMethod(env,jCtxObj,mid_getContentResolver);
	
	jclass jsetsystem= (*env)->FindClass(env,"android/provider/Settings$System");
	jfieldID fid_android_id = (*env)->GetStaticFieldID(env,jsetsystem,"ANDROID_ID","Ljava/lang/String;");
	jstring  jstr_android_id = (jstring)(*env)->GetStaticObjectField(env,jsetsystem,fid_android_id);


	//invoke-static {v1, v2}, Landroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
	jsetsystem = (*env)->FindClass(env,"android/provider/Settings$Secure");
	jmethodID mid_getstring = (*env)->GetStaticMethodID(env,jsetsystem,"getString","(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
	jstring jstr_id = (jstring)(*env)->CallStaticObjectMethod(env,jsetsystem,mid_getstring,contentresolver,jstr_android_id);
	
	if(jstr_id!=NULL)
	{
		const unsigned char* tmp = (*env)->GetStringUTFChars(env,jstr_id, NULL);
		if(tmp)
		{		
			systemid = (unsigned char*) malloc(strlen(tmp)+1);
			 
			strcpy(systemid,tmp);	
			(*env)->ReleaseStringUTFChars(env,jstr_id, tmp);
			LOGI("systemid %s",systemid); 	
                }
	}
}

通过so获取 WifiMAC:

char* getMacAddress(JNIEnv *env, jobject wifiInfoObj){
	//LOGI("getMacAddress.... ");
	if(wifiInfoObj == NULL){
		return NULL;
	}
	jclass jclz = (*env)->GetObjectClass(env,wifiInfoObj);
	jmethodID mid = (*env)->GetMethodID(env,jclz,"getMacAddress","()Ljava/lang/String;");
	jstring jstr_mac = (jstring)(*env)->CallObjectMethod(env,wifiInfoObj,mid);
	if(jstr_mac == NULL){
		(*env)->DeleteLocalRef(env,jclz);
		return NULL;
	}

	const char* tmp = (*env)->GetStringUTFChars(env,jstr_mac, NULL);
	char* mac = (char*) malloc(strlen(tmp)+1);
	memcpy(mac,tmp,strlen(tmp)+1);
	(*env)->ReleaseStringUTFChars(env,jstr_mac, tmp);
	(*env)->DeleteLocalRef(env,jclz);
	return mac;
}

jobject getWifiManagerObj(JNIEnv *env, jobject thiz, jobject jCtxObj )
{
	//LOGI("gotWifiMangerObj ");
	//获取 Context.WIFI_SERVICE 的值
	//jstring  jstr_wifi_serveice = env->NewStringUTF("wifi");
	jclass jCtxClz= (*env)->FindClass(env,"android/content/Context");
	jfieldID fid_wifi_service = (*env)->GetStaticFieldID(env,jCtxClz,"WIFI_SERVICE","Ljava/lang/String;");
	jstring  jstr_wifi_serveice = (jstring)(*env)->GetStaticObjectField(env,jCtxClz,fid_wifi_service);

	jclass jclz = (*env)->GetObjectClass(env,jCtxObj);
	jmethodID  mid_getSystemService = (*env)->GetMethodID(env,jclz,"getSystemService","(Ljava/lang/String;)Ljava/lang/Object;");
	jobject wifiManager = (*env)->CallObjectMethod(env,jCtxObj,mid_getSystemService,jstr_wifi_serveice);

	//因为jclass 继承自 jobject,所以需要释放;
	//jfieldID、jmethodID是内存地址,这段内存也不是在我们代码中分配的,不需要我们来释放。
	(*env)->DeleteLocalRef(env,jCtxClz);
	(*env)->DeleteLocalRef(env,jclz);
	(*env)->DeleteLocalRef(env,jstr_wifi_serveice);

	return wifiManager;
}

jobject getWifiInfoObj(JNIEnv *env, jobject wifiMgrObj)
{
	//LOGI("getWifiInfoObj ");
	if(wifiMgrObj == NULL){
		return NULL;	
	}
	jclass jclz = (*env)->GetObjectClass(env,wifiMgrObj);
	jmethodID mid = (*env)->GetMethodID(env,jclz,"getConnectionInfo","()Landroid/net/wifi/WifiInfo;");
	jobject wifiInfo = (*env)->CallObjectMethod(env,wifiMgrObj,mid);

	(*env)->DeleteLocalRef(env,jclz);
	return wifiInfo;
}

//调用?
char * user_mac="\0";
JNIEXPORT jstring Java_com_xxxx_init(JNIEnv* env, jobject thiz, jobject jCtxObj)
{
		//strcpy(user_mac,tmp_mac);		 
		jobject wifiManagerObj = NULL ;
		jobject wifiInfoObj = NULL;
		//LOGI("getDeviceInfo......");
		//try
		{		
			wifiManagerObj = getWifiManagerObj(env,thiz,jCtxObj);
			if (wifiManagerObj!=NULL)
			{
				wifiInfoObj = getWifiInfoObj(env,wifiManagerObj);
				if (wifiManagerObj!=NULL)
				{
					char * wifimac = getMacAddress(env,wifiInfoObj);
					if(wifimac != NULL)
					{
						//LOGI("mac: %s",wifimac);
						//if(strcmp(tmp_mac,wifimac))
						{
							user_mac = (char*) malloc(strlen(wifimac)+1);
							strcpy(user_mac,wifimac);
							//LOGI("user_mac: %s",user_mac);
						}				
					}
				}
			}
		}
		(*env)->DeleteLocalRef(env,wifiInfoObj);
		(*env)->DeleteLocalRef(env,wifiManagerObj);
		 
    return (*env)->NewStringUTF(env, "OK");
}

so中通过libcurl发送http请求并返回结果:


typedef struct pageInfo_t{
  char *data;
  int  len;
} pageInfo_t;

static char * get_http_content(char * strurl);

static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData) 
{
  int len = size * nmemb;
  pageInfo_t *page = (pageInfo_t *)userData;

  if (buffer && page->data && (page->len + len < (16 * 10240)) ) 
  {
    memcpy(&page->data[page->len], buffer, len);
    page->len += len;
  }
  return len;
}

static char * get_http_content(char * strurl)
{
  
  pageInfo_t page;
  CURL *curl;
  CURLcode res;
  char * buffer;
  static char errorBuffer[CURL_ERROR_SIZE]; 
  
  if (strurl == NULL) 
  {
      return NULL; /* OutOfMemoryError already thrown */
  }

  LOGI("URL %s",strurl);
  
  page.data = (char *)malloc(16 * 10240);
  page.len = 0;
  if (page.data)
    memset(page.data, 32, 16 * 10240);

  //buffer = (char *)malloc(16 * 10240);
  //buffer[0]='\0';

  curl = curl_easy_init();
  if(curl) 
  {
    res = curl_easy_setopt(curl, CURLOPT_URL, strurl);
    //LOGI("CURLOPT_URL %d",res);
    
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
    //LOGI("CURLOPT_WRITEFUNCTION %d",res);
    
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);
	  //LOGI("CURLOPT_WRITEDATA %d",res); 
    
    res = curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip");            // Accept-Encoding
		//LOGI("CURLOPT_ENCODING %d",res); 

		res = curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); // error_buff used to save error info
		//LOGI("CURLOPT_ERRORBUFFER %d",res); 
	  
    res = curl_easy_perform(curl);
    //LOGI("curl_easy_perform %d",res);     
           
   	/* always cleanup */    
   	curl_easy_cleanup(curl);
       	
    if(res == 0) 
    {
      if (page.data) 
      {
        //page.data[page.len < 256 ? page.len : 256] = '\0';
        page.data[page.len] = '\0';
				//LOGI("URL Data Len = %d \n", page.len );
				//strcpy(buffer,page.data);
				//LOGI("buffer(%d): %s. done.\n", strlen(buffer), buffer);
				//free(page.data);
        //return buffer;
        return page.data;
      }
    }    
    //sprintf(buffer, "Result %d", res);
    //LOGI("Error %d,More:%s",res,errorBuffer);
    
   	//return buffer;
   	return "";
  }
  else 
  {
      return "Error of Init cURL";
  }   
} 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值