學會”融會貫通”簡易脫某So殼

學會”融會貫通”簡易脫某So殼

前言

“元旦佳節,難得有閒情逸致。品一杯香茗,看IDA中的彙編代碼。”
雖說是遲到的祝福,但這裏還是先祝各位朋友元旦快樂,願大家的技術蒸蒸日上,身體棒,棒,棒!在逆向這條荊棘密佈的道路上,難免遇到各種各樣的困難,有的甚至是看似不可逾越的鴻溝。但話又說回來,其實逆向這個領域,很多技術是相通的,思維方式更是相通的。
網上的資料並不少,教程和文章都很多,少的就是大家對一些新問題的思考,對一些知識的靈活運用和融會貫通。今天就用這樣的方式來脫一下某公司的so殼。論證一下融會貫通在逆向領域甚至說在“這個稀少方向”的重要性。

初探加殼so

一般來說,我們從java層入手,在跟蹤某一個關鍵函數或者一個關鍵變量的時候,會跟到一個native的函數裏,這個時候就需要進入深邃的so。或許很多人會害怕so加殼,覺得那麼遙不可及。我們來揭開加殼後so的神祕面紗,讓大家對so加殼不再畏懼。
打開IDA定位到關鍵函數後:
這裏寫圖片描述
如圖,指令都被抹掉了,關鍵的函數完完全全被“清空”。
其他函數也一併被清空:
這裏寫圖片描述

卸下加殼so的外衣

儘管IDA加載的so裏面的指令都被清空了,但是有一條不變的宗旨。那就是這些代碼在執行之前肯定要解密的,解密的時候那就肯定在內存中,既然在內存中,我們就可以把它拿出來。
在關鍵函數段首下好斷點:
這裏寫圖片描述

IDA附加程序,出現same則點擊same對話框。接下來需要讓程序斷在我們的斷點處,代碼已經解密出來了:
這裏寫圖片描述
接下來用Ctrl+S 來定位一下該so在內存中的位置,用以下IDC腳本dump出來即可:

auto fp, SoAddress;
fp = fopen("D:\\unpack.so", "wb");
for ( SoAddress=0x51F6546C; SoAddress< 0x51F6B7B8; SoAddress++ )
fputc(Byte(SoAddress), fp);

脫殼前後對比

左邊爲加殼後的指令,都被抹去
右邊爲脫殼後的指令,全部恢復

總結

希望通過對這篇文章閱讀,你已經對so不再恐懼了。有所思考的讀者,肯定會發現,這和脫dex很相似,是的,這就是脫dex的方法在脫so殼上的再利用。很多人遇到問題就百度,就google,百度和google沒有的話他就不知所措了,或者說是一直在等他人分享的工具,在這樣的心理下,形成了不容易使得他自身技術進步的一種思維方式。我還是想說,很多技術其實網上都有資料,稍微變形或者換了一個新東西很多人就懵了(最近還有人問支付寶內購的問題,論壇裏有大量的資料了),所以說,對知識學習的融會貫通的程度決定了我們能走多遠,另外一方面,我們缺的不是資料,缺的是思考,缺的是一個思維定式裏的突破。最後希望大家能把學的知識融會貫通,也再次祝大家2016年有新的收穫!
(^__^)
PS:附件附上脫殼前後so。
2016.1.2
By Ericky

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章