聲明
- My Eclipse 2015 程序版權為Genuitec, L.L.C所有.
- My Eclipse 2015 的注冊碼、激活碼等授權為Genuitec, L.L.C及其付費用戶所有.
- 本文只從逆向工程的興趣出發,研究軟件保護機制.
- 不會釋出完整源代碼和破解補丁.
- 會直接推測出授權信息的地方打碼處理
- 本文針對My Eclipse 2015 Stable 2.0或CL版本
背景
在上兩篇博文中,我們研究了逆向中的兩大手段:
- 靜態分析 參見:CLion注冊碼算法逆向分析實錄
- 動態調試 參見:【逆向怎么玩】 動態調試一款牛逼C++ IDE實錄
在本篇,將着重利用上述兩種手段,來參破My Eclipse 2015的注冊、激活算法及軟件保護機制。
先看成果,Bling授權至2099年:
激活通過:
熟悉軟件本身
因為之前並不熟悉My Eclipse,所以找了很久都找不到提示授權信息的界面在哪里,汗一個先!
逆向本身,是從無道到有道,其中的樂趣在於探索本身,而不是結果。
要逆向一個東西,得先熟悉它的布局、機理,否則逆向只能是空談。
- My Eclipse軟件太大,光安裝包就1.3G左右,而且國內是百度網盤下載,奇慢無比.
- My Eclipse插件巨多,要找出關鍵的包、lib和代碼片段,稍顯復雜和繁瑣.
- 因為軟件規格明顯比CLion高出一個級別,所以其中的困難可謂重重,至少在實現動態調試上需要特殊處理.
插件巨多:
當面對的是一頭大象,要戰勝它,就需要忍耐,你需要觀察它的一舉一動,然后才能出擊。
分析類加載信息
這里,用我們熟悉的verbose
大法,分析類加載信息,縮小目標。
同時,搜集到的類加載信息,在后續的jar包
分析中,也是頻繁要來看一看,找一找的。
關於main
:
關於license/licence
:
一旦發現或者猜想到一些門路,就要來這里看一看,然后分析jar
包中的關鍵類的四周信息,以充分掌握軟件的特性,避免做無用功。
創建靜態分析環境
分析啟動信息
對My Eclipse安裝目錄下的*.ini
進行修改,指定我們自己的java/jre/jvm
,以方便使用 jinfo 等工具.
查看vm options
和command line args
:
通過分析,從$ME_HOME/plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
入手,嘗試將程序啟動起來。
正如其名,真的是個launcher/loader
,雖然程序啟動起來了,但是要想在注冊授權信息/My Eclipse Subscription Info
之類的附近斷掉程序,並且顯示源碼,這一點還是遠遠不夠的。
打造代碼檢索環境
為了能夠充分掌握某個關鍵類、方法的調用路徑,以方便我們進行回溯或者探索重要信息,通常我們采用如下幾種方法:
- 反編譯源代碼,在關鍵點處充分修改,打印調用棧.
- 利用靜態AOP或者hook,插入我們的調試器.
- 將代碼當作文本處理,以利用
sed/grep/less
等工具,以及文件索引能力,方便大批量的進行關鍵代碼搜索. - 直接用調試器附加目標進程,要顯示源碼的話,往往需要我們加
-g
以產生調試信息,這一點在My Eclipse的保護機制下受到限制,但這也是我們需要突破的地方. - 利用IDE提供的
查找使用/正向依賴/反向依賴
分析技術. - 利用dump,將關鍵代碼段或者類信息從目標進程中dump出來並還原為源代碼.
總之,靈活結合上述幾種手段,目的是為了充分在My Eclipse這頭大象身上輾轉騰挪,取我所需.
解壓縮jar包,並將class反編譯為java文件
jar包是采用zip格式壓縮的,所以我們也可以利用unzip
來進行解壓縮.
為了取得更好的反編譯效果,我們這次不使用jd
來做,在博主安裝的Intellij IDEA
的lib下,有一個fern flower
的反編譯工具,這也是IDEA
的默認反編譯器,我們就用它了,有興趣的東西可以搜索下,貌似跟mine craft
有很大淵源。
反編譯,首先將需要反編譯的包搜集到一個文件中,比如genuitec.jar.txt
中,然后建立一個簡單的腳本進行批處理:
解壓縮類似,就不貼圖了,我們利用unzip
,你也可以利用jar/編程
等方式實現解壓縮,當然,如果你不嫌累,1000多個jar包,你也可以手工解壓縮^^.
unzip ${jar} -d ${out_dir}
建立索引
有條件的可以用solr/lucene
來做,這里我們利用IDE的索引能力就可以了,很簡單,將所有我們感興趣的java文件,丟進IDE:
然后,就可以這樣來方便地搜索我們需要的class/java文件了:
當然,也可以路徑搜索:
雖然因為各種依賴關系極其復雜,要全部修復十分困難,無法全面編譯並利用語義搜索等手段,但這一步,為我們充分地占有資料並檢索打下堅實基礎,配合前面所述的
verbose
信息,我們可以對關鍵代碼、類、路徑、符號進行搜索、跳轉,極大地提升我們的分析效率。
打造動態調試環境
在靜態階段,我們的分析能力是受到局限的,了解一個軟件的運行機制,比較好的辦法,就是調試它。
但是,我們面對的是My Eclipse這樣的大象,即使給你完整的源代碼,要分析清楚也是一件很困難的事,所以,我們要利用修復、截取等手段,縮小我們動態調試的范圍,降低難度。
上面所述,是建立在我們的靜態分析基礎之上,而靜態分析,需要做大量的工作,繁瑣、細碎,有時會極為惱火,讓你有rm -rf /
的沖動,這時候,就靜下來,你做的是逆向工作,是從沒有門路,創造門路,耐心和調節心情是必做的一件事,這個時候,聽聽無腦的神曲,盡快reset自己的煩躁,因為后面,還有許多未知的困難在等着你挑戰。
ok,這里在我們反編譯的java代碼中,挑一段感興趣的地方,小小修改一點,編譯為class文件,替換到對應的jar包中,然后利用前文所述的launcher
來跑一下看看吧!
我擦,這什么鬼東西?
后話:My Eclipse 2015 采用的完整性驗證技術,配合數字簽名,以達到檢測代碼被修改的目的。
真是令人惱火,看來沒有CLion
那么好搞,靜一靜,想想思路。
讓我們來推測一下這個提示框的調用棧:
java
-> main
-> initialize
-> ..
-> integrationCheck
-> alert("騷年,你動了我的代碼!")
好的,想必你已經懂我在說什么。
利用回溯法來分析完整性驗證機制,並看看它做了什么.
破除軟件完整性驗證保護
自己造輪子,精准搜索:finder
既然修改了代碼,出現了錯誤,動態調試從何談起?
作為工程師,你能夠改變世界的那一點,就在於你可以按照需要,來造輪子。
這個時候,我們有兩種辦法:
- 還是從靜態環境中,來搜索錯誤提示
- 自己造輪子,來搜索錯誤提示.
為什么需要自己造輪子呢?
- 靜態環境的搭建極其耗時
- 逆向目標復雜,靜態分析容易遺漏
- 方便后續的補丁操作
看看我們這個時候需要的輪子:
沒錯,我們需要在jar包中、zip包中、文件夾中、class文件中:
- 找到我們感興趣的文件格式
- 查找字節指紋
- 打印我們需要的各類信息
如下:
這個時候,我們的檢索能力如下:
- verbose信息.
- 靜態環境提供的路徑、符號、文件搜索.
- 提供文件指紋、字節特征碼搜索的finder.
- ServiceAbility Agent提供的運行時信息.
抹除完整性驗證代碼
在抹除前,My Eclipse的完整性驗證代碼之一如下:
抹除后,如下:
MyEclipse 2015 的完整性驗證,分散在多個jar包的多個類中,要不遺漏,一是需要耐心,二是依賴finder的字節指紋搜索,同時配合靜態環境的分析。
這里,思路很重要,剩下的就看你擅長不擅長干細活了^^.
自己造輪子,文件補丁師 : patcher
現在,我們需要用抹除驗證的代碼,替換原來的代碼,並刪除、增加一些東西,這里你可以手動去做,畢竟jar包就是zip格式,也可以自己做patch程序。
考慮自己做patch程序的主要目的:
- 不可能一次patch到位,需要多次進行補丁操作.寫程序來做,配置后即可自動化完成.(省時)
- 輸出必要的調試信息以方便診斷.(省心)
- 自動化crack過程.(省力)
如下:
調試信息:
讓程序飛起來
做完了上面的步驟,基本上,就可以為所欲為了。
現在,讓我們將程序跑起來,以確保我們的小范圍修改可以如期運行:
完整性驗證保護已突破,但是還有注冊保護,如上圖所示,看來,逆向之旅還遙遙無期呢?
那么,如何破解注冊保護呢?
下篇揭曉。
撰文不易,若覺得本文對你有益或者博你一笑,留個言,點個推薦吧 :]