|
|
|
普通會員
|
工具:IDA6.6,不會發圖,只能用文字描述了。
研究過《遇見》登錄的同學可能都知道,只要修改過APK,在登錄時都會提示軟件盜版。 經研究登錄時safecode字段有問題,可能是驗證了簽名。在libiaroundnet.so中Java_net_iaround_utils_NativeLibUtil_aaa實現。 步驟1:下載 http://gdown.baidu.com/data/wisegame...yujian_570.apk 將yujian_570.apk改名爲yujian_570.zip,將lib目錄下的lib\armeabi\libiaroundnet.so提取出來拖入IDA中。 步驟2: 拖進來後發現SHA1Input,SHA1Output這樣帶有SHA1的函數,斷定SO中用到了SHA1加密算法。 步驟3: 查看Java_net_iaround_utils_NativeLibUtil_aaa函數按F5出來C的僞代碼,此時代碼還不易讀懂,不如像“v9 = (*(int (**)(void))(v8 + 124))()”,這樣的代碼。但是看到這個我們是不是應該想到C++裏面的內存的尋址?,成員變量的首地址=對象的首地址+成員變量在類中的偏移. 假如 Struct node { int,x,y; }; node a;如果A的首地址是0x00000000,那麼a.x的地址是0x00000000,a.y的地址是0x00000004; 由C僞代碼我們不難得出:v8是JNIEnv *類型,查看jni.h並計算我們不難發現v8 + 124是GetObjectClass函數指針,同理我們可以計算出其他類似的調用。 步驟4: 有了步驟三的基礎,我們可以想到一個簡便的方法就是導入jni.h,從而確定JNIEnv類的結構,藉助IDA直接識別函數。下載jni.h(蟲大大書上修改JNI.H的方法貌似不好使,我自己改了個):http://pan.baidu.com/s/1sj3EaTn,然後File->Load File->parse C header file... 選擇下載好的jni.h確定。然後在structures頁面裏按下insert鍵 ->add standard structure->滑到最下方選擇"JNIEnv_",然後確定。 步驟5: 返回僞代碼界面,鼠標點擊Java_net_iaround_utils_NativeLibUtil_aaa的第一個參數,右鍵->convert to struct*->選擇jnienv_*,這時,僞代碼中不明函數的調用已經出來。 剛剛的(*(int (**)(void))(v8 + 124))()已經變成 ((int (*)(void))v8->GetObjectClass)(); 這時只要仔細閱讀僞代碼就知道該函數做了啥,逆向的C代碼爲: 代碼:
JNIEXPORT jstring JNICALL Java_net_iaround_utils_NativeLibUtil_aaa (JNIEnv *env, jobject ob, jobject paramContext, jobject paramPackageInfo, jstring paramString1, jstring paramString2) { SHA1Context context; jstring ret=0; JNIEnv* p_env=env; char cifferbuf[128]={0}; char buf[64]={0}; jclass obClass=env->GetObjectClass(ob); char *pString="()Ljava/lang/String;"; jmethodID reusltID=p_env->GetMethodID(obClass,"getPackageName","()Ljava/lang/String;"); jobject retObject=p_env->CallObjectMethod(paramContext,reusltID); jboolean boolean=0; const char *str=p_env->GetStringUTFChars((jstring)retObject,&boolean); bool cmpResult=strcmp("net.iaround",str); if(cmpResult==0) { ret=p_env->NewStringUTF("123456"); } else { char destBuffer[128]={0}; const char* s1=p_env->GetStringUTFChars(paramString1,&boolean); const char *s2=p_env->GetStringUTFChars(paramString2,&boolean); __android_log_print(4, "logfromc", "%s",s1); __android_log_print(4, "logfromc", "%s",s2); int len1=strlen(s1); int len2=strlen(s2); memcpy(destBuffer,s1,len1); memcpy(destBuffer+len1,s2,len2); jclass packageInfo= p_env->GetObjectClass(paramPackageInfo); ret=(jstring)packageInfo; if(packageInfo) { jfieldID signatures=p_env->GetFieldID(packageInfo,"signatures","[Landroid/content/pm/Signature;"); ret=(jstring)signatures; if(signatures) { jobjectArray sigarray=(jobjectArray)p_env->GetObjectField(paramPackageInfo,signatures); if(sigarray) { jsize sigLength=p_env->GetArrayLength(sigarray); if(sigLength>0) { jobject ob=p_env->GetObjectArrayElement(sigarray,0); if(ob) { jclass jc=p_env->GetObjectClass(ob); if(jc) { jmethodID id=p_env->GetMethodID(jc,"toCharsString","()Ljava/lang/String;"); if(id) { jstring sigString =(jstring)p_env->CallObjectMethod(ob,id); const char* sigStr=p_env->GetStringUTFChars(sigString,&boolean); int passLen=strlen(destBuffer); memcpy(cifferbuf,sigStr+16,32); //__android_log_print(4, "logfromc", "%s",sigStr+16); //memcpy(cifferbuf,"a00302010202044e549d3a300d06092a",32); memcpy(cifferbuf+32,destBuffer,passLen); __android_log_print(4, "logfromc", "cifferString:%s",cifferbuf); SHA1Reset(&context); int cifferlen=strlen(cifferbuf); SHA1Input(&context,cifferbuf,cifferlen); //memset(&v51, 48, 0x29u); memset(buf,0,sizeof(buf)); if(SHA1Result(&context)) { sprintf(buf, "%08X%08X%08X%08X%08X", context.Message_Digest[0],context.Message_Digest[1], context.Message_Digest[2],context.Message_Digest[3],context.Message_Digest[4]); } else { __android_log_print(4, "logfromc", "ERROR-- could not compute message digest\n"); } ret=p_env->NewStringUTF(buf); } } } } } } } } return ret; } 一句話概括就是:將簽名中取出32位+paramString1+paramString2後用SHA1加密 如果中途出錯,直接返回“123456”。。。 這時可以得出該APK包是利用了簽名加密後到服務器驗證的。服務器計算出safecode和收到的safecode不一樣時,反饋軟件盜版。。 此貼只供學習,如做其它用途,後果自負。 |
||
|
最佳答案 - 作者: 楊劍超 |
在哪刪帖,我要刪帖!!!!!!!!!!!!!!!!!!!!! |
普通會員
|
在哪刪帖,我要刪帖!!!!!!!!!!!!!!!!!!!!!
|
||
|
普通會員
|
點一下編輯就行了 哈哈 被警告了吧
|
||
|
普通會員
|
|
||
|
普通會員
|
|
||
|
初級會員
|
寫的很不錯啊。、
|
||
|
普通會員
|
PS:我KX不夠,不能和你悄悄話 |
||
|
普通會員
|
MARK
|
||
|
初級會員
|
這麼好的技術文章,就不要刪除了
|
||
|
普通會員
|
學習了 感謝分享!!
|
||
|
初級會員
|
不錯哦 繼續加油
|
||
|
初級會員
|
贊一個 長知識了~
|
||
|
初級會員
|
這個也就是通過c++部分再回調java的
|
||
|
初級會員
|
貌似IDA6.6 自動導入了jni.h這個文件了
|
||
|
普通會員
|
|
||
|
添加到書籤 |
|
|
相似的主題 | ||||
主題 | 主題作者 | 論壇 | 回覆 | 最後發表 |
如果沒有遇見“你” | lijingli | 7)看雪十週年專版 | 26 | 2014-06-06 03:35:10 |
調試逆向 【求助】【求助】調試中 遇見一個函數zwqueryobject | fwoi | 『軟件調試逆向』 | 19 | 2008-11-07 09:27:13 |
【求助】脫殼中遇見的問題 | xinghong | 『求助問答』 | 1 | 2008-09-08 11:16:58 |
【原創破解驅動PC/SC遇見麻煩!! | www | 『求助問答』 | 0 | 2008-07-27 11:52:58 |
【求助】脫ASPack 2.12 -> Alexey Solodovnikov遇見的問題 | 糖醋魚 | 『求助問答』 | 3 | 2008-01-31 12:14:44 |