Android Native Hook 檢測

通用Android Native Hook 檢測

前言

Hook技術運用很廣泛兴蒸,從應用安全角度來看邦邦,Hook也是動態(tài)分析、破解一款程序的有效手段砌左。為了提高自己應用被破解的門檻拉背,我們需要一些檢測(對抗)手段师崎,目前也有很多檢測方法,有些是針對特定工具來檢測椅棺,有些較為通用犁罩,這里我把我的一些想法分享給大家齐蔽,歡迎批評指正

目標

給定一個進程內的一個So模塊,判斷它是被inline hook或者GOT hook

GOT HOOK檢測

首先簡單的介紹一下GOT hook是怎么做的

ELF常見的重定位方式如下

ELF重定位類型

創(chuàng)建一個測試工程(arm)床估,來了解一下R_ARM_JUMP_SLOT含滴、R_ARM_GLOB_DAT和R_ARM_ABS32具體是怎么重定位的,工程部分代碼如下

測試代碼

編譯成共享文件(-shared -fPIC)之后丐巫,先看看匯編代碼谈况,6個BLX對應源碼中6個調用過程

匯編代碼

再看看.rel.dyn段和.rel.plt段內容(我為了方便查看,grep了一下輸出递胧,導致信息不完整)碑韵,其中前5項是在.rel.dyn段,最后一項(R_ARM_JUMP_SLOT)在.rel.plt段

readelf -r

第一列是需要進行重定位位置在文件的偏移缎脾,通過IDA祝闻,分別來看看各個位置在文件中的內容

1.R_ARM_GLOB_DAT - 0x1adb4、0x1adb8遗菠、0x1adbc (這些位置都在.got段)

文件中的R_ARM_GLOB_DAT?

2.R_ARM_ABS32 - 0x1b004联喘、0x1b008 (這些位置都在.data段)

文件中的R_ARM_ABS32?

3.R_ARM_JUMP_SLOT - 0x1ae5c (這也在.got段)

文件中的R_ARM_JUMP_SLOT

現在把這個共享文件加載(dlopen)到內存,再看看內存中這6個地址(加載基地址+文件偏移)的內容

1.R_ARM_GLOB_DAT - 0x1adb4辙纬、0x1adb8豁遭、0x1adbc

內存中的R_ARM_GLOB_DAT

2.R_ARM_ABS32 - 0x1b004、0x1b008

內存中的R_ARM_ABS32?

3.R_ARM_JUMP_SLOT - 0x1ae5c

內存中的R_ARM_JUMP_SLOT?

這個0xF28FB625(0xF28FB624+1)就是strlen在內存中的入口

strlen

直接來總結(文件偏移用小寫16進制贺拣,實際內存地址用大寫16進制)

1.R_ARM_GLOB_DAT堤框,重定位信息記錄在'.rel.dyn'段中,其offset指向了.got段中的項纵柿,在加載到內存后蜈抓,會將offset的內容修改為相應符號的實際內存地址

a.0x1adb4(strlen_ptr) 內容被修改成了 strlen 的實際內存地址(0xF28FB625)

b.0x1adb8(global_strlen1_ptr) 內容被修改成了 global_strlen1 的實際內存地址(0xD35DE004)

c.0x1adbc(global_strlen2_ptr) 內容被修改成了 global_strlen2 的實際內存地址(0xD35DE008)

2.R_ARM_ABS32 ,重定位信息記錄在'.rel.dyn'段中昂儒,其offset指向了.data段中的項沟使,在加載到內存后,會將offset的內容修改為相應符號地址

a.0x1b004(global_strlen1) 內容被修改成了 strlen 的實際內存地址(0xF28FB625)

b.0x1b008(global_strlen2) 內容被修改成了 strlen 的實際內存地址(0xF28FB625)

3.R_ARM_JUMP_SLOT ,重定位信息記錄在'.rel.plt'段中渊跋,其offset指向了.got段中的項腊嗡,在加載到內存后,會將offset的內容修改為相應符號地址

0x1ae5c (strlen_ptr_0) 內容被修改成了 strlen 的實際內存地址(0xF28FB625)

通過上面的圖文描述拾酝,大概了解全局指針調用外部函數和局部指針調用外部函數的調用過程燕少,這里在單獨說一下直接調用外部函數的調用過程,也就是唯一一個在'rel.plt'段中的R_ARM_JUMP_SLOT類型蒿囤,匯編中0x8c30和0x8c38這兩個BLX客们,實際上會跳轉到.plt段

.plt

然后在通過LDR指令將strlen_ptr_0指向的內容賦值給PC,最終實現函數調用

好了!5状臁:闵怠!=ǖ恕S濉!9俦摺7惺帧!W⒉尽F跫!L苍!K摇M婊病!=骶俊6鞲ぁ!=赫堋E纤!Q煊臁3憾帧!<陌凇A吕薄!I裟铡桑阶!

明白了具體的重定位過程,檢測GOT hook的核心思路也出來了勾邦,就是檢測'.rel.dyn'和'.rel.plt'中的重定位項的offset指向的(實際內存)地址的內容是不是它應該在的模塊

那么怎么獲取'.rel.dyn'和'.rel.plt'中的重定位項內容呢蚣录?

解析加載后的ELF文件的Dynamic Segment,其中DT_JMPREL眷篇、DT_PLTRELSZ對應'.rel.plt'信息萎河,DT_REL、DT_RELSZ對應'.rel.dyn'信息,你可能還需要DT_SYMTAB和DT_STRTAB來輔助解析符號名

那么怎么判斷是不是符號應該在的區(qū)域呢公壤?

一圖便知

獲取到了重定位項的實際內存地址之后换可,然后去/proc/self/maps里查找該地址所屬的區(qū)域是否映射來至NEEDED的文件或是你自身

注意:如果你本來就有hotfix的情況,這里可能就會出現誤報

最后代碼就不提供了厦幅,主要也就是ELF的linking view 和 execution view 的解析

INLINE HOOK檢測

在之前描述重定位的時候沾鳄,要求是開啟了-fPIC,位置無關代碼讓.text段的內容在ELF加載前后沒有發(fā)生變化确憨,那么檢測inline hook的一個思路就出來了译荞,對比內存中的.text段和文件中的.text的crc是否相等

大致流程

????1.解析/proc/self/maps

????2.匹配到你需要檢測的so文件,獲取其的加載基地址和文件路徑

????3.通過mmap將文件映射到內存休弃,然后把內容傳給ELF解析工具吞歼,獲取其.text段的偏移和大小

????4.通過偏移+加載基地址 和 偏移+mmap返回值 以及.text段大小來計算crc,并比對

那么如果沒有開啟位置無關怎么辦呢塔猾?

目前我很少在Android上看到沒有開啟的PIC/PIE的ELF文件篙骡,查閱了相關資料,沒有看到明確的要求丈甸,為了兼容沒開啟PIC/PIE的情況糯俗,這里還有一種方式來檢測

掃描inline hook的跳轉指令?

arm? 對應指令- LDR PC, [PC, #-4]? ?字節(jié)碼 - 0xE51FF004?

thumb32??對應指令-?LDR.W PC, [PC, #0]? ? 字節(jié)碼 - 0x00F0DFF8

當然這個功能也可以用來定位具體被hook地址

如果還有其他的檢測思路,歡迎評論私信

若有志同道合的小伙伴也歡迎私信加個微信^_^

查考鏈接:

1.https://source.android.com/security/enhancements/enhancements50

2.https://source.android.com/devices/tech/dalvik/configure?hl=en

3.https://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries#_Toc257815978

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末睦擂,一起剝皮案震驚了整個濱河市得湘,隨后出現的幾起案子,更是在濱河造成了極大的恐慌顿仇,老刑警劉巖淘正,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異臼闻,居然都是意外死亡鸿吆,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門述呐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伞剑,“玉大人,你說我怎么就攤上這事市埋±杵” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵缤谎,是天一觀的道長抒倚。 經常有香客問我,道長坷澡,這世上最難降的妖魔是什么托呕? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上项郊,老公的妹妹穿的比我還像新娘馅扣。我一直安慰自己,他們只是感情好着降,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布差油。 她就那樣靜靜地躺著,像睡著了一般任洞。 火紅的嫁衣襯著肌膚如雪蓄喇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天交掏,我揣著相機與錄音妆偏,去河邊找鬼。 笑死盅弛,一個胖子當著我的面吹牛钱骂,可吹牛的內容都是我干的。 我是一名探鬼主播挪鹏,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼见秽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狰住?” 一聲冷哼從身側響起张吉,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤齿梁,失蹤者是張志新(化名)和其女友劉穎催植,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體勺择,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡创南,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了省核。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稿辙。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖气忠,靈堂內的尸體忽然破棺而出邻储,到底是詐尸還是另有隱情,我是刑警寧澤旧噪,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布吨娜,位于F島的核電站,受9級特大地震影響淘钟,放射性物質發(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

推薦閱讀更多精彩內容

  • 1. 背景 在我們的日常工作中經常會遇到一些BUG敛滋,而且這些BUG發(fā)生在native層许布,也就是在我們的so共...
    2baf611355d8閱讀 17,102評論 3 41
  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,779評論 0 27
  • 概要 SO文件是Linux下共享庫文件绎晃,它的文件格式被稱為ELF文件格式蜜唾。由于Android操作系統的底層基于Li...
    羊角包閱讀 25,155評論 1 14
  • 點此查看上篇《AndroidLinker與SO加殼技術之上篇》 2.4 鏈接 鏈接過程由 soinfo_link_...
    御安全_李大師閱讀 2,332評論 0 2
  • 相傳世間有種酒叫“醉生夢死” 飲之忘卻萬般煩憂,斷卻三生情恨 可千萬年間無人見過庶艾,更無人飲過 直至東勝神洲靈明石猴...
    Modafinil閱讀 349評論 0 0