http://bbs.pediy.com/showthread.php?p=1365122

看雪安全論壇

 

 

 

 


返回   看雪安全論壇 移動平臺 『Android 安全』
忘記密碼?

發表新主題 回覆
關注  
主題工具  顯示模式 

楊劍超 的頭像

普通會員
普通會員

資 料:
註冊日期: Jan 2015
帖子: 111 楊劍超 品行端正
精華: 1
現金: 14 Kx
致謝數: 0
獲感謝文章數:2
獲會員感謝數:10
1 舊 2015-04-14, 14:21:18 默認 已解答: 【原創】逆向Android SO,以《遇見》App爲例
楊劍超 當前離線

工具: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不一樣時,反饋軟件盜版。。


此貼只供學習,如做其它用途,後果自負。 
 
回覆時引用此帖 返回頂端
共 7 位會員
感謝 楊劍超 發表的文章:
bengou (2015-04-17), leeven超人 (2015-11-23), Lnju (2015-04-18), sunwood (2015-06-11), weishi (2016-01-13), zhczf (2015-04-18), 雪衫 (2015-04-18)
最佳答案 - 作者: 楊劍超
在哪刪帖,我要刪帖!!!!!!!!!!!!!!!!!!!!!

楊劍超 的頭像

普通會員
普通會員

資 料:
註冊日期: Jan 2015
帖子: 111 楊劍超 品行端正
精華: 1
現金: 14 Kx
致謝數: 0
獲感謝文章數:2
獲會員感謝數:10
2 舊 2015-04-14, 19:59:42 默認
楊劍超 當前離線

在哪刪帖,我要刪帖!!!!!!!!!!!!!!!!!!!!! 
 
回覆時引用此帖 返回頂端

exile 的頭像

普通會員
普通會員

資 料:
註冊日期: Jun 2007
帖子: 1,203 exile 品行端正
精華: 1
現金: 2074 Kx
致謝數: 24
獲感謝文章數:36
獲會員感謝數:36
3 舊 2015-04-14, 20:41:05 默認
exile 當前離線

點一下編輯就行了 哈哈 被警告了吧 
 
回覆時引用此帖 返回頂端

楊劍超 的頭像

普通會員
普通會員

資 料:
註冊日期: Jan 2015
帖子: 111 楊劍超 品行端正
精華: 1
現金: 14 Kx
致謝數: 0
獲感謝文章數:2
獲會員感謝數:10
4 舊 2015-04-15, 11:56:29 默認
楊劍超 當前離線

引用:
最初由 exile發佈 查看帖子
點一下編輯就行了 哈哈 被警告了吧
那倒是沒有,感覺這個我技術太水了。。想技術好點以後再出來發貼 
 
回覆時引用此帖 返回頂端

exile 的頭像

普通會員
普通會員

資 料:
註冊日期: Jun 2007
帖子: 1,203 exile 品行端正
精華: 1
現金: 2074 Kx
致謝數: 24
獲感謝文章數:36
獲會員感謝數:36
5 舊 2015-04-15, 13:02:32 默認
exile 當前離線

引用:
最初由 楊劍超發佈 查看帖子
那倒是沒有,感覺這個我技術太水了。。想技術好點以後再出來發貼
我覺得你寫的挺好的 
 
回覆時引用此帖 返回頂端

初級會員
初級會員

資 料:
註冊日期: Nov 2005
帖子: 75 cnywco 品行端正
精華: 0
現金: 179 Kx
致謝數: 0
獲感謝文章數:0
獲會員感謝數:0
6 舊 2015-04-18, 09:21:49 默認
cnywco 當前離線

寫的很不錯啊。、 
 
回覆時引用此帖 返回頂端

楊劍超 的頭像

普通會員
普通會員

資 料:
註冊日期: Jan 2015
帖子: 111 楊劍超 品行端正
精華: 1
現金: 14 Kx
致謝數: 0
獲感謝文章數:2
獲會員感謝數:10
7 舊 2015-04-18, 09:47:30 默認
楊劍超 當前離線

引用:
最初由 cnywco發佈 查看帖子
寫的很不錯啊。、
你要導入JNI.h,識別JNIENV的數據結構,然後自己閱讀代碼,才能理解,上面是我根據我的理解重新寫的。

PS:我KX不夠,不能和你悄悄話 
 
回覆時引用此帖 返回頂端

普通會員
普通會員

資 料:
註冊日期: Sep 2008
帖子: 611 elianmeng 品行端正
精華: 1
現金: 994 Kx
致謝數: 0
獲感謝文章數:4
獲會員感謝數:5
8 舊 2015-04-18, 10:10:25 默認
elianmeng 當前離線

MARK 
 
回覆時引用此帖 返回頂端

初級會員
初級會員

資 料:
註冊日期: Feb 2007
帖子: 274 zhczf 品行端正
精華: 0
現金: 199 Kx
致謝數: 388
獲感謝文章數:0
獲會員感謝數:0
9 舊 2015-04-18, 10:49:08 默認
zhczf 當前離線

這麼好的技術文章,就不要刪除了 
 
回覆時引用此帖 返回頂端

Lnju 的頭像

普通會員
普通會員

資 料:
註冊日期: Dec 2014
帖子: 32 Lnju 品行端正
精華: 1
現金: 49 Kx
致謝數: 16
獲感謝文章數:1
獲會員感謝數:1
10 舊 2015-04-18, 17:19:22 默認
Lnju 當前離線

學習了  感謝分享!! 
 
回覆時引用此帖 返回頂端

初級會員
初級會員

資 料:
註冊日期: Dec 2010
帖子: 100 cqzhou 品行端正
精華: 0
現金: 10 Kx
致謝數: 3
獲感謝文章數:1
獲會員感謝數:1
11 舊 2015-04-18, 22:02:32 默認
cqzhou 當前離線

不錯哦 繼續加油 
 
回覆時引用此帖 返回頂端

vVv一 的頭像

初級會員
初級會員

資 料:
註冊日期: Aug 2014
帖子: 25 vVv一 品行端正
精華: 0
現金: 75 Kx
致謝數: 0
獲感謝文章數:0
獲會員感謝數:0
12 舊 2015-04-18, 22:10:42 默認
vVv一 當前離線

贊一個    長知識了~ 
 
回覆時引用此帖 返回頂端

初級會員
初級會員

資 料:
註冊日期: Jun 2008
帖子: 16 fanweiriu 品行端正
精華: 0
現金: 147 Kx
致謝數: 0
獲感謝文章數:0
獲會員感謝數:0
13 舊 2015-04-30, 09:28:19 默認
fanweiriu 當前離線

這個也就是通過c++部分再回調java的 
 
回覆時引用此帖 返回頂端

初級會員
初級會員

資 料:
註冊日期: May 2009
帖子: 24 chmlqw 品行端正
精華: 0
現金: 55 Kx
致謝數: 21
獲感謝文章數:0
獲會員感謝數:0
14 舊 2015-05-13, 16:51:15 默認
chmlqw 當前離線

貌似IDA6.6 自動導入了jni.h這個文件了 
 
回覆時引用此帖 返回頂端

楊劍超 的頭像

普通會員
普通會員

資 料:
註冊日期: Jan 2015
帖子: 111 楊劍超 品行端正
精華: 1
現金: 14 Kx
致謝數: 0
獲感謝文章數:2
獲會員感謝數:10
15 舊 2015-05-14, 17:18:45 默認
楊劍超 當前離線

引用:
最初由 chmlqw發佈 查看帖子
貌似IDA6.6 自動導入了jni.h這個文件了
這個我不知道,反正我的IDA沒有看不到相關的數據結構 
 
回覆時引用此帖 返回頂端
發表新主題 回覆

添加到書籤


發帖規則
不可以發表主題
不可以回覆帖子
不可以上傳附件
不可以編輯自己的帖子
論壇論壇啓用 vB 代碼
論壇啓用 表情圖標
論壇啓用 [IMG] 代碼

相似的主題
主題 主題作者 論壇 回覆 最後發表
如果沒有遇見“你” 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


所有時間均爲北京時間, 現在的時間是 16:30:10.


  ©2000-2016 看雪學院(PEdiy.com) |關於我們 | 京ICP備10040895號-17 | 知道創宇提供帶寬資源 | 微信公衆帳號:ikanxue   手機客戶端: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章