so加固-加密特定section中的內(nèi)容

本文參考自:Android逆向之旅—基于對(duì)so中的section加密技術(shù)實(shí)現(xiàn)so加固,增加了自己的實(shí)踐過程周崭,以及一些額外的驗(yàn)證和解釋。

本文代碼參見:https://github.com/difcareer/SoEncrypt

Android逆向之旅—基于對(duì)so中的section加密技術(shù)實(shí)現(xiàn)so加固 這篇文章寫得真心好华望,建議先閱讀一下原著丈秩,這里只是自己的實(shí)踐過程(紙上得來終覺淺,絕知此事要躬行)烁巫,和一些更細(xì)節(jié)的解釋罷了署隘。

一. 拆分section

這個(gè)demo的目的是為了將native函數(shù)getString()給保護(hù)起來(實(shí)際應(yīng)用場(chǎng)景就是自己業(yè)務(wù)中的核心代碼)。為了保護(hù)getString()亚隙,用到了gcc的Attributes特性

__attribute__((section ("xxx")))

上述的文檔中提到磁餐,給變量或者方法增加這個(gè)修飾后,編譯器將把對(duì)應(yīng)的代碼或者數(shù)據(jù)放到你指定的section中阿弃。
我們的demo中做了示例:

__attribute__((section (".encrypt"))) jstring getString(JNIEnv* env) {
    static const char* txt __attribute__((section (".encrypt2"))) = "Str from native";
    return (*env)->NewStringUTF(env, txt);
};

我們同時(shí)給getString()函數(shù)和txt變量添加了這個(gè)屬性诊霹,分別指定了不同名稱羞延。我們看一下編譯后的so:

Paste_Image.png
Paste_Image.png
Paste_Image.png

可以看到新增了我們自定義的section: encrypt、encrypt2脾还,encrypt中存放getString()的代碼伴箩,因此被映射為可執(zhí)行,encrypt2中存放txt的數(shù)據(jù)鄙漏,因此被映射為可寫嗤谚。

ok,到這里我們已經(jīng)找到拆分核心代碼到單獨(dú)section的方法了泥张。后續(xù)我們只要對(duì)這些section做加密即可保護(hù)核心代碼呵恢。

二. 尋找解密時(shí)機(jī)

假設(shè)我們已經(jīng)加密了這些section,運(yùn)行的時(shí)候總是需要解密還原的媚创,什么時(shí)機(jī)解密最好呢渗钉,當(dāng)然是越早越好,最早可以在load so之后钞钙,執(zhí)行JNI_Onload之前鳄橘,這里也是需要gcc的另外一個(gè)Attributes特性

__attribute__((constructor (n)))

文檔中指出,constructor (priority)可以在后面指定一個(gè)優(yōu)先級(jí)芒炼,數(shù)字越小瘫怜,優(yōu)先級(jí)越高,越先被執(zhí)行本刽。

關(guān)于這點(diǎn)我們?cè)赿emo中也做了驗(yàn)證:

void init_1() __attribute__((constructor (3)));
void init_getString() __attribute__((constructor (2)));
void init_2() __attribute__((constructor (1)));

我們申明了3個(gè)函數(shù)鲸湃,優(yōu)先級(jí)從低到高,按照規(guī)則子寓,執(zhí)行順序應(yīng)該是:init_2暗挑、init_getString、init_1斜友,我們看一下so:

Paste_Image.png

已經(jīng)按照優(yōu)先級(jí)調(diào)整好了順序炸裆。

我們看下日志:

Paste_Image.png

的確也是這個(gè)順序。
ok鲜屏,這樣我們就可以在這個(gè)特性的修飾下烹看,盡早能做解密邏輯了。

三. 加密邏輯

先說一下加密洛史,作者的加密算法很簡單:字節(jié)取反惯殊。在misc/encrpt.c中,我們可以發(fā)現(xiàn)其核心邏輯是尋找叫做 encrypt 的 section也殖,然后字節(jié)取反寫回靠胜,同時(shí)計(jì)算將一些值計(jì)算了寫入ehdr.e_entry(這個(gè)對(duì)于正常的so是0值)和ehdr.e_shoff(這個(gè)是section表的偏移量,修改這個(gè)值將導(dǎo)致找不到section,后面會(huì)看到加密效果)浪漠,這些值在解密的時(shí)候需要。
demo的misc下有編譯后的腳本encrpt霎褐,需要在linux環(huán)境下執(zhí)行址愿,libencrypt.so是沒有加密前的so,libencrypt2.so是加密后的so冻璃。你可以自行使用beyond compare比較差異响谓。

四. 解密邏輯

回到最重要的解密邏輯了,我們?cè)?code>__attribute__((constructor (n)))修飾的方法init_getString()中實(shí)現(xiàn)了解密邏輯省艳,其原理是娘纷,通過讀取/proc/pid/maps中的內(nèi)容,找到so被映射到內(nèi)存中的地址跋炕,然后通過ehdr.e_entry和ehdr.e_shoff中的內(nèi)容還原出decrypt section 的地址赖晶,字節(jié)取反恢復(fù),內(nèi)存寫回辐烂。這樣就做到了動(dòng)態(tài)解密了遏插。

五. 加密效果

使用ida打開misc/libencrypt2.so

Paste_Image.png

提示這個(gè)是因?yàn)樾薷牧薳hdr.e_shoff,破壞了第一個(gè)section 類型為SHT_NULL的規(guī)則纠修。

Paste_Image.png

下一步直接解析section 報(bào)錯(cuò)胳嘲。

Paste_Image.png

正常的section都看不到了,看到的都是program sections(上一個(gè)圖的提示)扣草。

而apk可以正常運(yùn)行(加密后的apk為misc/signed.apk):

Paste_Image.png

參考鏈接:
http://www.wjdiankong.cn/android%e9%80%86%e5%90%91%e4%b9%8b%e6%97%85-%e5%9f%ba%e4%ba%8e%e5%af%b9so%e4%b8%ad%e7%9a%84section%e5%8a%a0%e5%af%86%e6%8a%80%e6%9c%af%e5%ae%9e%e7%8e%b0so%e5%8a%a0%e5%9b%ba/
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Variable-Attributes.html
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末了牛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辰妙,更是在濱河造成了極大的恐慌鹰祸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件上岗,死亡現(xiàn)場(chǎng)離奇詭異福荸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肴掷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門敬锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呆瞻,你說我怎么就攤上這事台夺。” “怎么了痴脾?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵颤介,是天一觀的道長。 經(jīng)常有香客問我,道長滚朵,這世上最難降的妖魔是什么冤灾? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辕近,結(jié)果婚禮上韵吨,老公的妹妹穿的比我還像新娘。我一直安慰自己移宅,他們只是感情好归粉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漏峰,像睡著了一般糠悼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浅乔,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天倔喂,我揣著相機(jī)與錄音,去河邊找鬼童擎。 笑死滴劲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顾复。 我是一名探鬼主播班挖,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼芯砸!你這毒婦竟也來了萧芙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤假丧,失蹤者是張志新(化名)和其女友劉穎双揪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體包帚,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渔期,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渴邦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疯趟。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谋梭,靈堂內(nèi)的尸體忽然破棺而出信峻,到底是詐尸還是另有隱情,我是刑警寧澤瓮床,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布盹舞,位于F島的核電站产镐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踢步。R本人自食惡果不足惜癣亚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贾虽。 院中可真熱鬧逃糟,春花似錦、人聲如沸蓬豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽地粪。三九已至,卻和暖如春琐谤,著一層夾襖步出監(jiān)牢的瞬間蟆技,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工斗忌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留质礼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓织阳,卻偏偏與公主長得像眶蕉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唧躲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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