程序的參數(shù)和/或指令進(jìn)行修改,得到第二應(yīng)用程序,所述第二應(yīng)用程序能夠在所述移動(dòng)平臺(tái)上正常運(yùn)行,且當(dāng)使用逆向工具解析所述第二應(yīng)用程序時(shí),所述第二應(yīng)用程序能夠?qū)е滤瞿嫦蚬ぞ邎?bào)錯(cuò)退出;
[0099]具體的,所述服務(wù)器對(duì)所述第一應(yīng)用程序的參數(shù)和/或指令進(jìn)行修改,包括:
[0100]所述服務(wù)器將所述第一應(yīng)用程序中的第一參數(shù)修改為非法參數(shù),所述第一參數(shù)是所述第一應(yīng)用程序在運(yùn)行時(shí)不調(diào)用的參數(shù);或者,
[0101]所述服務(wù)器將所述第一應(yīng)用程序中的第一指令修改為非法指令,所述第一指令是所述第一應(yīng)用程序在運(yùn)行時(shí)不調(diào)用的指令;或者,
[0102]所述服務(wù)器在所述第一應(yīng)用程序中加入第二參數(shù),所述第二參數(shù)為非法參數(shù),且所述第二參數(shù)是所述第一應(yīng)用程序在運(yùn)行時(shí)不調(diào)用的參數(shù);或者,
[0103]所述服務(wù)器在所述第一應(yīng)用程序中加入第二指令,所述第二指令為非法指令,且所述第二指令是所述第一應(yīng)用程序在運(yùn)行時(shí)不調(diào)用的指令。
[0104]步驟303、所述服務(wù)器保存所述第二應(yīng)用程序的第一安全哈希算法SHAl校驗(yàn)值;
[0105]這里需要說(shuō)明的是,DEX文件頭中包含SHAl校驗(yàn)值,DEX文件生成后所述SHAl校驗(yàn)值保持不變,因此可以作為判斷DEX文件是否被修改的依據(jù)。
[0106]步驟304、所述服務(wù)器為所述第二應(yīng)用程序設(shè)置校驗(yàn)?zāi)K,包含有所述校驗(yàn)?zāi)K的應(yīng)用程序在運(yùn)行時(shí)能夠向所述服務(wù)器發(fā)送校驗(yàn)信息,所述校驗(yàn)信息包括所述應(yīng)用程序的第二 SHAl校驗(yàn)值。
[0107]在實(shí)際應(yīng)用中,所述服務(wù)器以加入JAR庫(kù)或SO庫(kù)的方式為所述第二應(yīng)用程序設(shè)置校驗(yàn)?zāi)K。
[0108]具體的,以添加JAR庫(kù)為例進(jìn)行說(shuō)明:
[0109]1、編寫(xiě)校驗(yàn)?zāi)K,生成JAR庫(kù);
[0110]2、編寫(xiě)Android應(yīng)用程序1,調(diào)用JAR庫(kù),生成應(yīng)用程序APK_A ;
[0111]3、將應(yīng)用程序APK_A反編譯為Smali_A ;
[0112]4、將待加固的APK反編譯為Smali_B ;
[0113]5、分析、提取Smali_A中調(diào)用JAR庫(kù)的部分,合并入Smali_B中,并進(jìn)行相應(yīng)的修改;
[0114]6、最后將Smali_B編譯為APK,就完成了校驗(yàn)?zāi)K的添加。
[0115]這里,可以理解的是,在實(shí)際應(yīng)用中對(duì)上述步驟303、304的順序不做限定。
[0116]步驟305、所述服務(wù)器將所述第二應(yīng)用程序發(fā)給所述客戶端。
[0117]步驟306、所述服務(wù)器將收到的所述第二 SHAl校驗(yàn)值與保存的所述第一 SHAl校驗(yàn)值進(jìn)行對(duì)比,當(dāng)所述第二 SHAl校驗(yàn)值與所述第一 SHAl校驗(yàn)值匹配時(shí),進(jìn)入步驟307,當(dāng)所述第二 SHAl校驗(yàn)值與所述第一 SHAl校驗(yàn)值不匹配時(shí),進(jìn)入步驟308。
[0118]步驟307、所述服務(wù)器判定發(fā)出所述校驗(yàn)信息的應(yīng)用程序是所述第二應(yīng)用程序,結(jié)束本次流程。
[0119]步驟308、所述服務(wù)器判定發(fā)出所述校驗(yàn)信息的應(yīng)用程序是基于所述第二應(yīng)用程序進(jìn)行逆向修改得到的,結(jié)束本次流程。
[0120]本實(shí)施例中,所述服務(wù)器為應(yīng)用程序設(shè)置校驗(yàn)?zāi)K,由此服務(wù)器可以根據(jù)SHAl校驗(yàn)值判斷發(fā)送校驗(yàn)信息的應(yīng)用程序是否被修改,從而能對(duì)軟件修改、二次打包等行為進(jìn)行追查、監(jiān)控。[0121 ] 在一實(shí)施例中,所述方法還包括:
[0122]所述服務(wù)器為所述第二應(yīng)用程序生成一組公鑰證書(shū)和私鑰證書(shū),給所述校驗(yàn)?zāi)K設(shè)置所述公鑰證書(shū),所述服務(wù)器自身保存所述私鑰證書(shū);
[0123]所述服務(wù)器為所述第二應(yīng)用程序分配身份標(biāo)識(shí)號(hào)碼ID,并給所述校驗(yàn)?zāi)K設(shè)置所述ID,所述ID與所述私鑰證書(shū)相對(duì)應(yīng);相應(yīng)的,所述校驗(yàn)信息還包括加密SHAl校驗(yàn)值和所述ID,所述加密SHAl校驗(yàn)值是所述校驗(yàn)?zāi)K使用所述公鑰證書(shū)對(duì)所述第二 SHAl校驗(yàn)值進(jìn)行加密生成的;
[0124]所述服務(wù)器根據(jù)收到的所述校驗(yàn)信息中的所述ID找到相對(duì)應(yīng)的私鑰證書(shū),并使用所述私鑰證書(shū)對(duì)所述加密SHAl校驗(yàn)值進(jìn)行解碼,得到第二 SHAl校驗(yàn)值。
[0125]本實(shí)施例中,對(duì)SHAl校驗(yàn)值進(jìn)行加密處理,以防數(shù)據(jù)在傳輸過(guò)程中被修改,從而保證最終判定結(jié)果的準(zhǔn)確性。
[0126]在一實(shí)施例中,所述方法還包括:
[0127]所述服務(wù)器給所述校驗(yàn)?zāi)K設(shè)置校驗(yàn)算法,所述服務(wù)器自身保存所述校驗(yàn)算法;相應(yīng)的,所述校驗(yàn)信息還包括第二哈希運(yùn)算消息認(rèn)證碼HMAC,所述第二 HMAC為所述校驗(yàn)?zāi)K使用所述校驗(yàn)算法對(duì)所述ID和所述加密SHAl校驗(yàn)值進(jìn)行校驗(yàn)得到的;
[0128]所述服務(wù)器使用所述校驗(yàn)算法對(duì)收到的所述校驗(yàn)信息中的所述ID和所述加密SHAl校驗(yàn)值進(jìn)行校驗(yàn)得到第一 HMAC ;
[0129]將所述第一 HMAC和所述第二 HMAC進(jìn)行對(duì)比,當(dāng)所述第一 HMAC和所述第二 HMAC一致時(shí),執(zhí)行根據(jù)所述ID找到相對(duì)應(yīng)的私鑰證書(shū)的步驟。
[0130]本實(shí)施例中,所述校驗(yàn)信息還包括第二 HMAC,這樣服務(wù)器可以通過(guò)所述第二 HMAC判斷客戶端發(fā)來(lái)的數(shù)據(jù)是否在傳輸過(guò)程中被修改,進(jìn)一步確保最終判定結(jié)果的準(zhǔn)確性。
[0131]在一實(shí)施例中,所述服務(wù)器還可以以加入JAR庫(kù)或SO庫(kù)的方式為所述第二應(yīng)用程序設(shè)置在線升級(jí)功能模塊,所述在線升級(jí)功能模塊通過(guò)加入、修改軟件字節(jié)碼的方式被所述第二應(yīng)用程序調(diào)用,所述在線升級(jí)功能模塊用于連接所述服務(wù)器,對(duì)所述JAR庫(kù)和/或SO庫(kù)進(jìn)行定期更新。
[0132]需要說(shuō)明的是,以上為了清楚說(shuō)明,采用了多個(gè)實(shí)施例對(duì)如何判定第二應(yīng)用程序是否被修改進(jìn)行了介紹。但本領(lǐng)域技術(shù)人員應(yīng)當(dāng)了解,在實(shí)際使用中,上述多個(gè)實(shí)施例中的方式可以根據(jù)實(shí)際需要靈活結(jié)合使用。例如,服務(wù)器在將所述第二應(yīng)用程序發(fā)給所述客戶端之后,所述服務(wù)器接收所述第二應(yīng)用程序發(fā)送的校驗(yàn)信息,其中,所述檢驗(yàn)信息包括:所述第二應(yīng)用程序的ID、加密SHAl校驗(yàn)值和HMAC ;其中,所述第二應(yīng)用程序的ID與所述服務(wù)器為所述第一應(yīng)用程序分配的ID相同;所述加密SHAl校驗(yàn)值為使用所述服務(wù)器預(yù)置入所述第一應(yīng)用程序中的公鑰,對(duì)所述第一應(yīng)用程序的SHAl校驗(yàn)值進(jìn)行加密后生成的校驗(yàn)值;所述HMAC為對(duì)所述第二應(yīng)用程序的ID和所述加密SHAl校驗(yàn)值進(jìn)行校驗(yàn)后生成的結(jié)果;所述服務(wù)器根據(jù)所述校驗(yàn)信息,判斷所述第二應(yīng)用程序是否被修改。
[0133]優(yōu)選地,所述服務(wù)器根據(jù)所述校驗(yàn)信息,判斷所述第二應(yīng)用程序是否被修改,包括:所述服務(wù)器使用所述校驗(yàn)信息中的HMAC判斷所述檢驗(yàn)信息是否正確;在確定正確后,根據(jù)所述校驗(yàn)信息中的所述ID獲取與所述第一應(yīng)用程序中的公鑰相對(duì)應(yīng)的私鑰,使用所述私鑰對(duì)所述加密SHAl校驗(yàn)值進(jìn)行解密,獲得解密后的SHAl校驗(yàn)值;當(dāng)確定解密后的所述SHAl校驗(yàn)值與所述服務(wù)器中存儲(chǔ)的所述第一應(yīng)用程序的SHAl校驗(yàn)值不匹配時(shí),確定所述第二應(yīng)用程序被修改。
[0134]以下以一實(shí)例對(duì)上述過(guò)程進(jìn)行說(shuō)明,本實(shí)例以android系統(tǒng)下的DEX文件為例。
[0135]DEX文件頭中包含SHAl校驗(yàn)字段,標(biāo)識(shí)DEX文件的HASH值,DEX文件生成后該檢驗(yàn)值即SHAl校驗(yàn)值保持不變,因此可以作為判斷DEX文件是否修改過(guò)的依據(jù)。第二應(yīng)用程序運(yùn)行時(shí)可以取出DEX文件頭中的SHAl校驗(yàn)字段,將SHAl校驗(yàn)值用公鑰證書(shū)進(jìn)行加密生成Ckeyl (SHA1校驗(yàn)碼),對(duì)ID、Ckeyl (SHA1校驗(yàn)碼)進(jìn)行校驗(yàn)(記作HMAC),將三元組(ID、CkeyUSHAl校驗(yàn)碼)、HMAC)發(fā)送至服務(wù)端進(jìn)行比對(duì)。其中,服務(wù)器在對(duì)第一應(yīng)用程序即本實(shí)例的DEX文件進(jìn)行軟件加固處理生成第二應(yīng)用程序的過(guò)程中,服務(wù)器首先為接收到的未加固過(guò)的DEX文件分配唯一 ID號(hào)(該ID號(hào)在加固后的第二應(yīng)用程序中繼續(xù)沿用),并生成一組公、私鑰證書(shū),將公鑰證書(shū)預(yù)置進(jìn)加固后的第二應(yīng)用程序(即加固后的DEX文件),服務(wù)器保存私鑰證書(shū)。當(dāng)服務(wù)器完成軟件加固任務(wù)后,提取出加固后的DEX文件頭的SHAl校驗(yàn)字段值,將(ID、SHAl校驗(yàn)碼)二元組及軟件的相關(guān)信息存儲(chǔ)于服務(wù)器的數(shù)據(jù)庫(kù),作為比對(duì)依據(jù)。再將加固后的DEX文件發(fā)送給客戶端。
[0136]相對(duì)應(yīng)地,當(dāng)服務(wù)器收到客戶端發(fā)送的上述校驗(yàn)比對(duì)三元組后,首先根據(jù)HMAC校驗(yàn)三元組,確定正確后根據(jù)ID找到對(duì)應(yīng)的私鑰證書(shū),用私鑰解密Ckeyl (SHA1校驗(yàn)碼),提取出三元組中的SHAl校驗(yàn)碼,與服務(wù)器已存儲(chǔ)的SHAl校驗(yàn)碼比對(duì),內(nèi)容不匹配時(shí)即可判斷軟件已被重打包。此時(shí),當(dāng)加固后的DEX文件在客戶端運(yùn)行時(shí),還可以將二元組(ID、SHAl校驗(yàn)碼)信息發(fā)送至服務(wù)器,服務(wù)器與存儲(chǔ)的對(duì)應(yīng)數(shù)據(jù)進(jìn)行比較,當(dāng)發(fā)現(xiàn)不匹配時(shí)即可判斷軟件已被修改。
[0137]通過(guò)本實(shí)例,不但實(shí)現(xiàn)了應(yīng)用程序加固后可防止逆向工具分析,有較好的安全性;而且對(duì)原應(yīng)用程序增加了比對(duì)校驗(yàn)功能,幫助用戶掌握、追查軟件修改、重打包等行為;此夕卜,加固后的應(yīng)用程序運(yùn)行時(shí)不要求服務(wù)器必須參與,加固方案可適用于多個(gè)Android版本的系統(tǒng),兼容性、適應(yīng)性好。
[0138]本發(fā)明提供的一種服務(wù)器的實(shí)施例,如圖4所示,所述服務(wù)器包括:
[0139]接收單元401,用于接收客戶端發(fā)來(lái)的第一應(yīng)用程序;
[0140]其中,所述第一應(yīng)用程序可以適用于移動(dòng)平臺(tái)。但不限于此,在實(shí)際應(yīng)用中,任意其它的適當(dāng)平臺(tái)也同樣適用,例如,均使用Android系統(tǒng)作為操作系統(tǒng)的平臺(tái)。
[0141]處理單元402,用于對(duì)所述第一應(yīng)用程序的參數(shù)和/或指令進(jìn)行修改,得到第二應(yīng)用程序,所述第二應(yīng)用程序能夠正常運(yùn)行,且當(dāng)使用逆向工具解析所述第二應(yīng)用程序時(shí),所述第二應(yīng)用程序能夠?qū)е滤瞿嫦蚬ぞ邎?bào)錯(cuò)退出;
[0142]發(fā)送單元403,用于將所述第二應(yīng)用程序發(fā)給所述客戶端。
[0143]本實(shí)施例中對(duì)第一應(yīng)用程序的參數(shù)