1. 程式人生 > 其它 >android逆向奇技淫巧二十八:x音MD5使用分析

android逆向奇技淫巧二十八:x音MD5使用分析

1、MD5是業界非常成熟的hash演算法了,原理不再贅述,這裡介紹一下可以魔改的地方!

      

   (1)MD5預設輸出是128bit,怎麼改變這個長度了?MD5的結果是由4個32bit的ABCD組成的,原始取值如下:

unsigned int A = 0x67452301; 
unsigned int B = 0xEFCDAB89; 
unsigned int C = 0x98BADCFE; 
unsigned int D = 0x10325476;

  大家有沒有發現啥規律了?16進位制數從0開始分別是0123456789abcdef,直接按照4byte的長度擷取使用了(注意MD5用的是小端,順序剛好是反過來的),這不也是很明顯的特徵數麼?所以這裡完全可以換成其他沒規律的數字

;如果要想改變結果的長度,分別改變ABCD長度就行了;由此同樣要改變明文Mi的分組長度和Ki的長度

        (2)上圖只有Mi是明文,F和Ki出現的目的就是為了儘可能混淆或擴散明文和hash值,讓明文和hash值之間找不到任何規律!所以F函式和Ki也是可以魔改的!原F函式如下:

round 1: F(x,y,z) = (x & y) | (~x & z) //X為真就是Y;X為假就是Z
round 2: G(x,y,z) = (x & z) | (y & ~z) :
round 3: H(x,y,z) = x ^ y ^ z
round 4: I(x,y,z) = y ^ ( x | ~z)

     完全可以替換成其他的函式,也可以調換順序!同理,Ki原始值的計算方式是2^32 * |sin i |,而後取其整數部分, 原始的取值如下:

const unsigned int k[] = {
      0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
      0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
      0xf61e2562
, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};

  這麼多固定值的數,不是很容易被找到麼?所以這裡的三角函式sin完全可以換成cos、tg、ctg等其他函式。經過這些魔改後,特徵數完全改變,想要查詢就不那麼容易了!

  2、之前用findcrypt在x音的libmetasec.so中找到了base64的碼錶,進而找到了X-Tyhon、X-Ladon、X-Argus生成程式碼的附近,但是還有X-Gorgon了,看著很像MD5類的演算法,但是一直沒找到,今天換個新外掛試試:signsrch!居然找到了部分特徵數,結果如下:

        

  (1)先看第一個,使用的地方在偏移0x6A5D4這裡,來到程式碼這裡後直接F5看看,還真有新發現:

          

   這不就是MD5的ABCD四個數麼?繼續進入裡面的函式,在0x69D9C函式裡面開始大量計算hash值了, 這裡明顯用到K表: 

            

  注意,原始值是10進製表示的,按H後轉成16進位制,但是F5識別成了補碼,需要在數字上點選右鍵->invert sign才能看到正確的數字

        

   繼續往下扒,在0x6A4F4偏移處開始用0x80填充了,如下:

        

   3、至此,可以明確x音肯定用了MD5演算法,具體傳入了哪些引數了?這個只能動態除錯看看了! MD5的ABCD四個數都放棧上了,並且函式傳入的是一串疑似URL內容的字串!

         

   經過一系列騷操作後,棧上的ABCD變成這樣了:這個結果後續會被用於X-Gorgon的構造(當然肯定不是這麼簡單的)!

        

   同樣的程式碼位置,還處理過這類“密文”資料:

    

   處理完的結果還是放棧上原ABCD的位置:

        

   其他遇到過計算MD5的字串:

         

   這裡把cronet、quic協議的版本都拿來求hash值了:

    

   

 總結:

1、演算法模組特徵: 

  • 進行大量的迴圈運算
  • 依賴運算相關的彙編指令,諸如XOR、AND、OR、NOT等(70%)
  • 加解密中資訊熵的變化

2、MD5的ABCD、K表內部的資料都是明文儲存,很容易被找到,為啥對這些資料加密?為啥不通過某些公式計算出來,而是直接放明文了?我個人猜測:這類使用頻率非常高的hash演算法,如果把ABCD或K表加密,或用公式現場計算,效率肯定受影響,會降低使用者體驗的!其他某些地方加了OLLVM和VMP,已經導致client端計算效率降低了,如果再在這裡加固,效率怕是直接跌倒地板,使用者都跑光了,要安全有啥用了?