首先,關于Android 如何防止 so庫檔案被未知應用盜用這個話題并不是我擅長的,隻是在開發中遇到了這個問題,是以在這裡總結一下。
故事回到幾個月之前,當時公司和第三方音樂平台合作了一款内置于手表系統的音樂APP應用,合作過程中需要第三方提供so庫檔案來進行相關操作。當時提供so庫檔案的時候,第三方公司要求我們提供一個我們音樂APP應用的簽名檔案(這個簽名檔案稱呼為V1)中的MD5碼,然後再給我們提供了so庫檔案用于開發。
經過幾個月的開發,我們的音樂APP要正式釋出的時候,公司要求換一個應用簽名檔案,即之前的V1簽名不用了,改用新的應用簽名檔案(這個簽名檔案稱呼為V2)。
這個要求并不過分,是以我就立馬換了簽名檔案為V2。可是當我把換了應用簽名V2版本的APP運作的時候,直接crash了,crash log 列印為 so庫檔案找不到,應用無限crash然後無限自動重新開機,要淚奔了。
一開始以為是新版本的簽名檔案V2出問題了,但是其他同僚使用的也是V2簽名檔案,并沒有什麼異常。然後隻能将apk解壓,對so庫檔案進行分析。

使用Beyond Compare工具打開該so庫檔案,可以更加清晰的看到十六進制的檔案内容,如下圖所示
通過分析so庫檔案,發現加密後的so庫檔案中 有 “Signature”以及“MD5”的字樣,這個時候我腦海中突然回想起來幾個月之前第三方平台提供給我們so庫檔案的時候,要求我們提供我們的應用簽名檔案V1的MD5碼,是不是就是因為第三方平台提供的so庫檔案用MD5碼進行了簽名校驗呢???
速度聯系第三方平台,經過咨詢之後确定是第三方平台提供的so庫檔案用MD5碼進行了簽名校驗,然後我提供了V2簽名檔案的MD5給他們,之後第三方平台使用新的MD5碼對so檔案重新進行簽名之後重新發給我們。接着使用新的MD5碼簽名過的so檔案替換之前的老版本的so檔案之後,使用V2版本的應用簽名的APP正常運作了。
下圖是分别使用V1版本的MD5碼簽名的so庫檔案和使用V2版本的MD5碼簽名的so庫檔案 的對比圖
這裡具體介紹下原因:
因為公司對于小型app都是單人獨立開發,其他同僚開發的是其他的apk,僅僅是将V1版本簽名換成V2版本的簽名用于打包apk而已,并沒有使用V1或者V2簽名對so進行簽名等任何操作。 而我的apk用到的第三方音樂平台提供的so開發的音樂播放器,而這個so之前使用的是V1版本簽名檔案中的MD5碼等屬性做了加密,而V2版本簽名檔案的MD5碼和V1版本簽名中的MD5碼不同,是以導緻換簽名檔案之後,程式運作加載so的時候校驗程式合法性的時候crash了。
上面内容是我自己遇到so庫檔案使用簽名加密等防止未知應用盜用so庫所遇到的問題,由以上的操作可以發現,我們可以通過在so庫裡面驗證App的簽名的方式來防止未知應用盜用so檔案。
至于具體so庫檔案的源代碼 cpp 裡面是如何檢驗簽名如何加密的,可以參考下面的文章了解大概的流程。
下面是一段驗證APP前面的示例代碼,如下所示:
更多關于Android安全與逆向分析的知識可以參考一下幾個連結:
<a href="https://segmentfault.com/a/1190000005133219l" target="_blank">手把手教你逆向分析 Android 程式</a>
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!