巧用APP歷史版本對APP登錄signature分析
VSole2021-08-13 18:45:00
前言
之前在火線zone看到利用app歷史版本來進行app的逆向分析,可以降低一下分析難度,比較老版本的安全防護做的不是很到位。正好最近有一個app,嘗試利用一下老版本進行分析登錄簽名,沒想到效果非常好。
算法分析
對于最新版本的app進行了抓取流量包的操作,對于登錄包,發現校驗非常多,而且也沒有明顯的校驗文本。

并且該app加固比較全面,采用常規分析手法,需要先脫殼,然后過各種防護。比較麻煩,因此我就嘗試了一下利用他的歷史版本的方法。
該app最新版為2021年7月發布。我下載的歷史版本為2020年6月份版本,沒有加殼。首先也是對歷史版本的app進行抓包,發現登錄包參數十分簡單明了。

sign參數,和包名以及密碼類型(此處我采用的是驗證碼登錄),還有時間戳。
之后對app進行反編譯一下,看一下java層代碼。
搜索siganture后發現一處比較符合條件的地方。

跟進去看一下加密方式。

顯然這是HmacSHA1標準加密,其實在最新版也是采用這個,但是寫進了so層,這個以后再說。

那加密的參數也就是顯而易見。是由pGrantType+clientID+authorisation.source + timestamp拼接而成,而clientSecret就是密鑰。
此時測試一下查看結果是否正確。

結果正確。
在這之后,我對于新版也分析了一下。發現密鑰沒有改變,字符串拼接也沒有改變。。。

其中某個校驗采用的是so層標準hmacsha1加密,密鑰是
dd49a835-56e7-4a0f-95b5-efd51ea5397f

setImmediate(function() {Java.perform(function() {var targetClass='com.xxx.android.cloudid.CloudIDHelper';var methodName='encrypt';var gclass = Java.use(targetClass);gclass[methodName].overload('java.lang.String','java.lang.String','java.lang.String','java.lang.String','java.lang.String','java.lang.String','java.lang.String').implementation = function(arg0,arg1,arg2,arg3,arg4,arg5,arg6) {console.log('[Hook encrypt(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)]'+'\targ0 = '+arg0+'\targ1 = '+arg1+'\targ2 = '+arg2+'\targ3 = '+arg3+'\targ4 = '+arg4+'\targ5 = '+arg5+'\targ6 = '+arg6);var i=thismethodName;console.log('\treturn '+i);return i;}})})

總結
該app也算是一個比較大眾的app,從這里可以看出,他們在一步步的加固防御方式做的越來越出色,然而對于原本的關鍵數據還是沒有做一些處理。這也就給了一些可乘之機。這對開發者來說是一個需要注意的點,對于分析人員來說更是一個需要注意的分析點。
VSole
網絡安全專家