Android SO(動態(tài)庫)---安全防護

在日常的APP開發(fā)過程中我們都會遇到安全相關(guān)的問題,針對不同的安全需求會有不同的解決方案除破。那么我們今天來看看與Android動態(tài)庫相關(guān)的安全問題。

今天我們以AndroidSO工程為基礎(chǔ),通過實際的例子來解決一些常見的安全需求固灵。

動態(tài)庫被第三方APP非法使用

我們辛辛苦苦開發(fā)了一個動態(tài)庫缅帘,最終卻被非授權(quán)的第三方APP用了轴术,那么不是很尷尬嘛。

那么如何防止我們的動態(tài)庫被第三方非法使用呢股毫?客官往下看~

非授權(quán)使用的問題本質(zhì)上是因為我們的動態(tài)庫沒有做驗簽功能膳音,接下來就帶大家實現(xiàn)對SO調(diào)用的簽名驗證功能。

敏感字符串信息可見

native-lib-static.cpp的JNI函數(shù)代碼如下铃诬。

JNIEXPORT jstring JNICALL
Java_com_demon_so_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from static register jni function";
    return env->NewStringUTF(hello.c_str());
}

上面這個圖片是我通過IDA(逆向分析工具)打開static-dynamic-so工程生成的libnative-lib.so后截圖的信息祭陷。

so_string_visible

我們可以很容易看到字符串的信息。與我們代碼中的字符串一模一樣趣席,很完整被解析出來兵志。

是不是突然感覺很沒有安全感,這么隨意宣肚。想罕。。

我們這個字符串沒有什么價值霉涨,但是如果我們存放了敏感的字符串信息又如何是好呢按价?

簡單的解決辦法有如下兩種:

001 定義char數(shù)組

字符串信息以數(shù)組的方式初始化,比如以下寫法:

JNIEXPORT jstring JNICALL
Java_com_demon_so_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    char* hello = ((char[]){'H','e','l','l','o',' ','f','r','o','m',' ','s','t','a','t','i','c',' ','r','e','g','i','s','t','e','r',' ','j','n','i',' ','f','u','n','c','t','i','o','n'});
    return env->NewStringUTF(hello);
}

看到這么一長串的代碼是不是要瘋了笙瑟,我擦楼镐,一個完整的字符串居然被凌亂掉了。這么寫代碼要瘋掉了往枷。

辦法總是有的嘛......

用一個python腳本就可以解決問題了

content = "Hello from static register jni function"
length = len(content)
str = "((char[]){"
for i in range(length):
    str = str+'\''+content[i]+'\''
    if i !=(length-1):
        str=str+','
str = str+"})"
print str

最終輸出內(nèi)容如下:

((char[]){'H','e','l','l','o',' ','f','r','o','m',' ','s','t','a','t','i','c',' ','r','e','g','i','s','t','e','r',' ','j','n','i',' ','f','u','n','c','t','i','o','n'});

注意這種寫法只能用在函數(shù)內(nèi)部

002 敏感字符串信息加密

加密分為對稱加密非對稱加密框产,常見的對稱加密包括DES凄杯、AES等,非對稱加密包括RSA秉宿、背包算法等戒突。

非對稱加密的缺點是加密和解密花費時間長、速度慢描睦,只適合對少量數(shù)據(jù)進行加密膊存。

對稱加密算法的優(yōu)點是算法公開、計算量小忱叭、加密速度快膝舅、加密效率高。

在項目針對可以采用DES進行對稱加密即可窑多。

JNI函數(shù)信息可見

每一個動態(tài)庫都會包含符號表信息仍稀,通過objdump工具在命令行中可以查看到動態(tài)庫最終包含的符號表。

采用靜態(tài)方式注冊JNI函數(shù)會最終會包含在符號表中埂息,那么我們就可以從符號表中看到以Java_開頭的所有JNI函數(shù)技潘。那么別人就會通過JNI函數(shù)來最終分析APK中相應(yīng)Class對應(yīng)的動態(tài)庫文件,進而分析整個APK以及動態(tài)庫的調(diào)用邏輯千康。

針對AndroidSO工程中的static-dynamic-so工程享幽,我們可以分別設(shè)置CMakeLists.txtDYNAMIC_FLAG的取值。

DYNAMIC_FLAG是一個布爾值拾弃,為true的時候動態(tài)庫最終包含native-lib-dynamic.cpp,相反包含native-lib-static.cpp值桩。

native-lib-dynamic.cpp采用動態(tài)注冊JNI的方式,而native-lib-static.cpp采用靜態(tài)注冊JNI的方式豪椿。

執(zhí)行objdump -D libnative-lib.so | grep Java_*
可以查看以Java_開頭的符號表信息奔坟。

native-lib-static.cpp靜態(tài)注冊輸出結(jié)果如下:

4118:   52 00 00 ea     b   #328 <Java_com_demon_so_MainActivity_stringFromJNI+0x28>

native-lib-dynamic.cpp動態(tài)注冊JNI函數(shù)輸出結(jié)果如下:

_ZN7_JavaVM6GetEnvEPPvi:

對比上邊的輸出結(jié)果我們可以很容易看出動態(tài)注冊的JNI函數(shù)就無法看到我們定義的JNI函數(shù)了。

采用動態(tài)注冊的方式即可解決JNI函數(shù)可見的問題搭盾。

objdump的用法點擊直達

Reference:

  1. c/c++字符串混淆方案總結(jié)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咳秉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸯隅,更是在濱河造成了極大的恐慌澜建,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌以,死亡現(xiàn)場離奇詭異炕舵,居然都是意外死亡,警方通過查閱死者的電腦和手機跟畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門咽筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碍彭,你說我怎么就攤上這事晤硕。” “怎么了庇忌?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵舞箍,是天一觀的道長。 經(jīng)常有香客問我皆疹,道長疏橄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任略就,我火速辦了婚禮捎迫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘表牢。我一直安慰自己窄绒,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布崔兴。 她就那樣靜靜地躺著彰导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敲茄。 梳的紋絲不亂的頭發(fā)上位谋,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音堰燎,去河邊找鬼厚脉。 笑死绽族,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播殴蓬,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛔屹!你這毒婦竟也來了灌具?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤何什,失蹤者是張志新(化名)和其女友劉穎组哩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體处渣,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡伶贰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了罐栈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黍衙。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖荠诬,靈堂內(nèi)的尸體忽然破棺而出琅翻,到底是詐尸還是另有隱情位仁,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布方椎,位于F島的核電站聂抢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棠众。R本人自食惡果不足惜琳疏,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闸拿。 院中可真熱鬧空盼,春花似錦、人聲如沸新荤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛骨。三九已至但骨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間智袭,已是汗流浹背奔缠。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吼野,地道東北人校哎。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像瞳步,于是被迫代替她去往敵國和親闷哆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,519評論 25 707
  • 一单起,apk以進程的形式運行抱怔,進程的創(chuàng)建是由zygote。 參考文章《深入理解Dalvik虛擬機- Android應(yīng)...
    Kevin_Junbaozi閱讀 2,820評論 0 12
  • 老劉今年八十八嘀倒。 人老了屈留,就想兒女們常回家看看测蘑。 拄個棍兒灌危,老劉來到大兒子家,嘮叨開了:“老大碳胳,你看我都這把年紀了...
    半都閱讀 416評論 4 9
  • 早上走的匆忙勇蝙,到了公司才發(fā)現(xiàn),手機沒在包里挨约,第一感覺就是:丟了味混,被偷了产雹,完蛋了:(,打個電話翁锡,通了蔓挖,才想起是早上走...
    心中的那片海_閱讀 324評論 0 1
  • 【柒月影語】20170703學(xué)習(xí)力踐行Day43 今天放學(xué)路上,看到廣告牌上的字“美甲”竟然識認出來盗誊,“四川麻辣燙...
    暖小柒閱讀 158評論 0 0