網際論壇 - 軟體中文化交流區 - [技術文章] 淺談壓縮與脫殼
» 遊客:  註冊 | 登錄 | 會員 | 幫助
 

免費線上小說
動漫分類 : 最新上架熱門連載全本小說最新上架玄幻奇幻都市言情武俠仙俠軍事歷史網游競技科幻靈異 ... 更多小說

作者:
標題: [技術文章] 淺談壓縮與脫殼 上一主題 | 下一主題
  龍太子
  中級會員 
 


  積分 1363
  發文 58
  註冊 2005-8-31
  來自 摩瑪斯星球~赫達啦島
  狀態 離線
#1  [技術文章] 淺談壓縮與脫殼

作者:吳朝相

我寫這篇東西的主要目的是讓初到本站的新手們能對「殼」有個大概的認識,知道我每天說了些什麼。限於本人的知識,如果有 ERROR 之處,還請多原諒。如果你覺得還可以, 也歡迎轉貼,但請保留文章的完整性和作者的資料。當然如果你想把它發表,硬塞些稿費給 俺花花,我也不會拒絕的。;)              

  作為一個以「殼」為主的站台,如果連訪者連什麼是「殼」都不清楚的話,那我也太失敗了。很早以前就想寫編完全關於「殼」的文章,但苦於時間和文字水平的關係,都沒提筆。本著對站台負責的態度,現在經過一天的努力,「打」出這編嘗試由殼的歷史一直談到最新發展的本章來。

  首先我想大家應該先明白「殼」的概念。在自然界中,我想大家對殼這東西應該都不會陌生了,植物用它來保護種子,動物用它來保護身體等等。同樣,在一些計算機軟件裡也有一段專門負責保護軟件不被非法修改或反編譯的程序。它們一般都是先於程序運行,拿到控制權,然後完成它們保護軟件的任務。就像動植物的殼一般都是在身體外面一樣理所當然(但後來也出現了所謂的「殼中帶籽」的殼)。由於這段程序和自然界的殼在功能上有很多相同的地方,基於命名的規則,大家就把這樣的程序稱為「殼」了。就像計算機病毒和自然界的病毒一樣,其實都是命名上的方法罷了。

   最早提出「殼」這個概念的,據我所知,應該是當年推出脫殼軟件 RCOPY 3 的作者熊焰先生。在幾年前的 DOS 時代,「殼」一般都是指磁盤加密軟件的段加密程序,可能是那時侯的加密軟件還剛起步不久吧,所以大多數的加密軟件(加殼軟件)所生成的「成品」在「殼」和需要加密的程序之間總有一條比較明顯的「分界線」。有經驗的人可以在跟蹤軟件的運行以後找出這條分界線來,至於這樣有什麼用這個問題,就不用我多說了。但畢竟在當時,甚至現在這樣的人也不是很多,所以當 RCOPY3 這個可以很容易就找出「分界線」,並可以方便的去掉「殼」的軟件推出以後,立即就受到了很多人的注意。老實說,這個我當年在《電腦》雜誌看到廣告,在廣州電腦城看到標著999元的軟件,在當時來說,的確是有很多全新的構思,單內存生成 EXE 可執行文件這項,就應該是世界首創了。但它的思路在程序的表現上我認為還有很多可以改進的地方(雖然後來出現了可以加強其功力的 RO97),這個想法也在後來和作者的面談中得到了證實。在這以後,同類型的軟件想雨後春筍一般冒出來,記得住名字的就有: UNKEY、MSCOPY、UNALL .... 等等,但很多的軟件都把磁盤解密當成了主攻方向,忽略了其它方面,當然這也為以後的「密界剋星」「解密機器」等軟件打下了基礎,這另外的分支就不多祥談了,相信機齡大一點的朋友都應該看過當時的廣告了。

   解密(脫殼)技術的進步促進、推動了當時的加密(加殼)技術的發展。LOCK95和 BITLOK 等所謂的「殼中帶籽」加密程序紛紛出籠,真是各出奇謀,把小小的軟盤也折騰的夠辛苦的了。正在國內的加殼軟件和脫殼軟件較量得正火紅的時候,國外的「殼」類軟件早已經發展到像 LZEXE 之類的壓縮殼了。這類軟件說穿了其實就是一個標準的加殼軟件,它把 EXE 文件壓縮了以後,再在文件上加上一層在軟件被執行的時候自動把文件解壓縮的「殼」來達到壓縮 EXE 文件的目的。接著,這類軟件也越來越多, PKEXE、AINEXE、UCEXE 和後來被很多人認識的 WWPACK 都屬於這類軟件,但奇怪的是,當時我看不到一個國產的同類軟件。

   過了一段時間,可能是國外淘汰了磁盤加密轉向使用軟件序列號的加密方法吧,保護 EXE 文件不被動態跟蹤和靜態反編譯就顯得非常重要了。所以專門實現這樣功能的加殼程序便誕生了。 MESS 、CRACKSTOP、HACKSTOP、TRAP、UPS 等等都是比較有名氣的本類軟件代表,當然,還有到現在還是數一數二的,由台灣同胞所寫的 FSE 。其實以我的觀點來看,這樣的軟件才能算是正宗的加殼軟件。

  在以上這些加殼軟件的不斷升級較勁中,很多軟件都把比較「極端」技術用了上去,因為在這個時候 DOS 已經可以說是給眾高手們玩弄在股掌之間了,什麼保護模式、反 SICE 、逆指令等等。相對來說,在那段時間裡發表的很多國外脫殼程序,根本就不能對付這麼多的加殼大軍,什麼 UPC、TEU 等等都紛紛成為必防的對象,成績比較理想的就只有 CUP386 了,反觀國內,這段時間裡也沒了這方面的「矛盾鬥爭」。加殼軟件門揮軍直搗各處要崗重地,直到在我國遇到了 TR 這個銅牆鐵壁以後,才紛紛敗下陣來各謀對策,但這已經是一年多以後的事情了。我常想,如果 TR 能早兩年「出生」的話,成就肯定比現在大得多,甚至蓋過 SICE 也有可能。TR 發表的時候 WIN95 的流行已經成為事實,DOS 還有多少的空間,大家心裡都清楚。但話又說回來, TR 的確是個好軟件,比起當年的 RCOPY3 有過之而無不及,同時也證明了我們中國的 CRACK 實力(雖然有點過時)。這個時候,前面提到過的 FSE 憑著強勁的實力也漸漸的浮出了水面,獨領風騷。其時已經是 1997 年年底了,我也走完了學生「旅程」。工作後在CFIDO 的 CRACK 區認識了 Ding-Boy ,不久 CRACK 區關了,我從此迷上了 INTERNET,並於98年6月建起了一個專門介紹「殼」的站台: http://topage.126.com ,放上了我所收集的所有「殼」類軟件。在這段時間裡,各種「殼」類軟件也在不段的升級換代,但都沒什麼太大的進展,差不多就是 TR 和眾加殼軟件的版本數字之爭而已。
    1998年8月,一個名為 UNSEC (揭秘)的脫殼軟件發表了,它號稱可以脫掉98年8月以前發表的所有殼。我測試之後,覺得並沒傳聞中的那麼厲害,特別是兼容性更是令我不想再碰它。 Ding-Boy 給這個軟件的作者提了很多建議,但寄去的 EMIAL 有如泥牛入海,可能是一怒之下吧,不久 Ding-Boy 的 BW (衝擊波)就誕生了。這個使用內存一次定位生成 EXE 文件(後來放棄了)的脫殼軟件,在我的站台公開後,得到了很多朋友們的肯定。要知道,從RCOPY 3 開始,絕大部分的脫殼軟件都是要兩次運行目標程序來確定 EXE 的重定位數據的。BW 的這一特點雖然有兼容性的問題,但也樹立了自己的風格、特色。經過幾個月的改善, BW 升級到了 2.0 版本,這個版本的推出可以說是 BW 的轉折點,因為它已經是一個成熟、穩定脫殼軟件了,它可以對付當時(現在)大多數的殼,包括當時最新的 FSE 0.6 等。更重要的是這個版本把選擇殼的和軟件「分界線」這個最令新手頭疼的步驟簡化到不能再簡化的地步,使更多的朋友接受了它。另外,能加強 BW 功力的 CI 模式也是其它脫殼軟件沒有的東西。最近,BW 發表了最新的 2.5 BETA2 版本,增強了一些方面的功能,因它竟然可以脫掉號稱最厲害的磁盤加密工具 LOCKKING 2.0 的加密殼,因而進一步奠定了它在「脫殼界」的地位。說到最新,就不能不提 GTR、LTR、EDUMP、ADUMP、UPS、UPX、APACK 這幾個國外的好軟件了,它們每個都有自己的特色,可以說都是當今各類「殼」中的最新代表了。(這些軟件和詳細介紹請到我的主頁查閱)

  由於 WINDOWS 3.1 只是基於 DOS 下的一個圖形外殼,所以在這個平台下的「殼」類軟件很少,見過的就只有像 PACKWIN 等幾個有限的壓縮工具,終難成氣候。

   可能是 MICROSOFT 保留了 WIN95 的很多技術上的秘密吧,所以即便是 WIN95 已經推出了 3 年多的時間,也沒見過在其上面運行的「殼」類軟件。直到 98 年的中期,這樣的軟件才遲遲的出現,而這個時候 WIN98 也發表了有一段日子了。應該是有 DOS 下的經驗吧,這類的軟件不發表由自可,一發表就一大批地的衝了出來。先是加殼類的軟件如: BJFNT、PELOCKNT 等,它們的出現,使暴露了 3 年多的 WIN95 下的 PE 格式 EXE 文件得到了很好的保護。大家都應該知道現在很多 WIN95 下的軟件都是用註冊碼的方法來區分、確定合法與非法用戶的吧,有了這類加殼軟件,這種註冊方法的安全性提高了不少,如果大家也有自己編的 WIN95 程序,就一定要多留意一下本類軟件了。接著出現的就是壓縮軟件了,因為 WIN95 下運行的 EXE 文件「體積」一般都比較大,所以它的實用價值比起 DOS 下的壓縮軟件要大很多,這類的軟件也很多,早些時候的 VBOX、PEPACK、PETITE 和最近才發表的 ASPACK、UPX 都是其中的佼佼者。在 DOS 下很流行的壓縮軟件 WWPACK 的作者也推出了對應 WIN95 版本的 WWPACK32,由於性能並不是十分的突出,所以用的人也不太多。由於壓縮軟件其實也是間接給軟件加了殼,所以用它們來處理 EXE 也是很多軟件作者喜歡做的事情,最近新發表的很多軟件裡都可以看到這些加殼、加壓縮軟件的名字了。有加殼就一定會有脫殼的,在 WIN95 下當然也不例外,但由於編這類軟件比編加殼軟件要難得多,所以到目前為止,我認為就只有 PROCDUMP 這個軟件能稱為通用脫殼軟件了,它可以對付現在大多數的加殼、壓縮軟件所加的殼,的確是一個難得的精品。其它的脫殼軟件多是專門針對某某加殼軟件而編,雖然針對性強、效果好,但收集麻煩,而且這樣的脫殼軟件也不多。前些時候 TR 作者也順應潮流發表了 TR 的 WIN95 版本: TRW ,由現在的版本來看可以對付的殼還不多,有待改進。


  BW 的作者 Ding-Boy 最新發表了一個 WIN95 的 EXE 加殼軟件 DBPE 。雖然它還不太成熟,但它可以為軟件加上使用日期限制這個功能是其它加殼軟件所沒有的,或者以後的加殼軟件真的會是像他說的那樣可以:加殼和壓縮並重、並施;隨意加使用日期;加上註冊碼;加軟件狗(磁盤)保護;加硬件序列號判別;加...

[ Last edited by yoyo007 on 2006-3-17 at 10:36 AM ]


2005-12-25 07:42 PM
查看資料  訪問主頁  發短消息   編輯文章  引用回覆
  龍太子
  中級會員 
 


  積分 1363
  發文 58
  註冊 2005-8-31
  來自 摩瑪斯星球~赫達啦島
  狀態 離線
#2  手動脫殼

手動脫殼

手動脫殼就是不借助自動脫殼工具,而是用動態調試工具SOFTICE或TRW2000來脫殼。這課談談一些入門方面的知識,如要瞭解更深的脫殼知識,請參考《脫殼高級篇》這課。

工具

*調試器:SoftICE 、TRW2000
*內存抓取工具:Procdump等;
*十六進制工具:Hiew、UltraEdit、Hex Workshop等;
*PE編輯工具: Procdump、PEditor等;


名詞概念

★PE文件:Microsoft設計了一種新的文件格式Portable Executable File Format(即PE格式),該格式應用於所有基於Win32的系統:Windows NT、Windows 2000、Win32s及Windows 95/98。

★基址(ImageBase ):是指裝入到內存中的EXE或DLL程序的開始地址,它是Win32中的一個重要概念。 在Windows NT中,缺省的值是10000h;對於DLLs,缺省值為400000h。在Windows 95中,10000h不能用來裝入32位的執行文件,因為該地址處於所有進程共享的線性地址區域,因此Microsoft將Win32可執行文件的缺省基地址改變為400000h。

★RVA:相對虛擬地址(Relative Virual Address),是某個項相對於文件映像地址的偏移。例如:裝載程序將一個PE文件裝入到虛擬地址空間中,從10000h開始的內存中,如果PE中某個表在映像中的起始地址是10464h,那麼該表的RVA就是464h。虛擬地址(RVA)=偏移地址+基址(ImageBase )

★Entry Point:入口點,就是程序在完成了對原程序的還原後,開始跳轉到剛還原的程序執行,此時的地址就是入口點的值。

步驟

★確定殼的種類

一般拿到軟件後,可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種殼,然後再採取措施。

★入口點(Entry Point)確定

對初學者來說定位程序解殼後的入口點確定較難,但熟練後,入口點查找是很方便的。 決大多數 PE 加殼程序在被加密的程序中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。如:UPX 用了一次跨段的 JMP , ASPACK 用了兩次跨段的 JMP 。 這種判斷一般是跟蹤分析程序而找到入口點,如是用TRW2000也可試試命令:PNEWSEC,它可讓TRW2000中斷到入口點上。
PNEWSEC:運行直到進入一個 PE 程序內存的新的 section時產生斷點。(如不懂,以後到脫殼高級篇自會明白)

另外也可用D.boy的衝擊波2000,它能輕易的找到任何加密殼的入口點,

★dump取內存己還原文件

找到入口點後,在此處可以用 Procdump的FULL DUMP功能來抓取內存中整個文件,
如是用TRW2000也可用命令:

makepe命令含義:從內存中整理出一個指令名稱的PE格式的exe文件, 當前的 EIP 將成為新的程序入口,生成文件的 Import table 已經重新生成過了。生成的PE文件可運行任何平台和微機上。

pedump命令含義:將PE文件的內存映像直接映像到指定的文件裡。生成的文件只能在本機運行,不能在其它系統平台或微機運行。


★修正剛dump取的文件

如是用 Procdump的FULL DUMP功能脫殼的文件,要用 Procdump或PEditor等PE編輯工具修正入口點(Entry Point)。


2005-12-25 07:46 PM
查看資料  訪問主頁  發短消息   編輯文章  引用回覆
  七彩琉璃雨
  論壇貴賓 
  雲眉站掌門人


 
  積分 21404
  發文 1287
  註冊 2005-8-31
  來自 九重天外 臥雲居
  狀態 離線
#3  

多謝龍兄的分享~~
經過如此解說~~
七彩對中文化有更深的了解~~
受益匪淺~~感恩~~感謝~~




半神半聖亦半仙 全儒全道是全賢
                     腦中真書藏萬卷 掌握文武半邊天

2005-12-25 08:59 PM
查看資料  發短消息   編輯文章  引用回覆
  龍太子
  中級會員 
 


  積分 1363
  發文 58
  註冊 2005-8-31
  來自 摩瑪斯星球~赫達啦島
  狀態 離線
#4  接手動脫殼-2

目標程式: 用 UPX V1.01壓縮過的Notepad.exe


方法一、使用TRW2000來脫殼

★使用工具

TRW2000
FileInfo


★確定殼的種類

拿到這軟件後,可用工具FileInfo、gtw、TYP32等偵測文件類型的工具來看看是何種軟件壓縮的,在這我們以FileInfo 為例,把目標文件複製到FileInfo目錄下,在資源管理器下雙擊FileInfo,再按回車,你將看到報告出來:告訴你這是UPX1.01壓縮的軟件。

★入口點(Entry Point)確定

◇利用跟蹤分析來確定入口點

決大多數 PE 加殼程式在被加密的程式中加上一個或多個段。 所以看到一個跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP 。 就是你一步步跟蹤時會看到代碼有一突躍,一般再跟據領空文件名的變化,就能確定入口點了。執行TRW2000並裝載目標程式,然後LOAD,你將中斷在主程式入口處:此時合理按F10、F7及F12一直向前走,注意此時領空會是:NOTUPX!UPX1+2xxx.

在你跟蹤過程中會出現如下代碼:

該程式的具體情況如下:

XXX:XXXXXXXX 60 PUSHAD ;所有的寄存器進棧
XXX:XXXXXXXX BE2EFD4200 MOV ESI, XXXXXXXX ;將下一條指令送入進行解壓
XXX:XXXXXXXX 8DBED21FFDFF LEA EDI, [ESI+XXXXXXXX]

.......
....... <---- 按F10跟蹤 ;-P
XXX:XXXXXXXX FF96A8C90400 CALL [ESI+XXXXXXXX]
XXX:XXXXXXXX 61 POPAD ;所有寄存器出棧
XXX:XXXXXXXX E9A44AFBFF JMP 00401000 ;跳到程式真正入口點(OEP),文件完全解壓。


0137:40ddbe popa
0137:40ddf jmp 00401000 <-此行己完全解壓結束,將要跳到記事本程式入口點執行程式(注意此處的一個大的突躍)。
........................
0137:401000 push ebp <-完全解壓後的記事本程式第一行

因此入口點(Entry Point)找到為:401000

◇利用TRW2000特有命令PNEWSEC

TRW2000也是一款優秀的脫殼工具,有許多特有的命令對脫殼很有幫助,在此時用PNEWSEC命令也可方便找到入口點。
執行TRW2000並裝載目標程式,然後LOAD,你將中斷在主程式入口處,下令:PNEWSEC
等上一段時間,程式將中斷在入口點處。

◇用衝擊波2000

衝擊波2000是D.boy開發的一個專門查找加殼軟件入口點的工具,先執行衝擊波2000,點擊Track按鈕:開始進行跟蹤,然後執行要跟蹤的程式, 找到入口點後,會在Enter point 顯示。可是用這個記事本程式卻無效。

★dump取內存中己脫殼的文件

不管你用何種方法找到入口點,首先要來到入口點一行:

0137:401000 push ebp

執行命令makepe 路徑/文件名或pedump 路徑/文件名

就這樣脫殼成功。

註:TRW2000的makepe重建的PE文件可跨平台執行,pedump抓取的文件卻不可。

方法二、用SOFTICE來脫殼

★使用工具

TRW2000
FileInfo
ProcDump

★入口點(Entry Point)確定

◇利用跟蹤分析來確定入口點

方法同TRW2000。

★dump取內存中己脫殼的文件

0137:40ddf jmp 00401000
現在這一行,鍵入以下命令:
a eip (然後按回車)
jmp eip (然後按回車)
按下F5

這樣將改變0137:40ddf行的代碼. 你會注意到在鍵入"jmp eip"並按下回車後,40ddf的指令現在是一個jmp.這將有效地使程式"暫停"(有點類似TRW2000的suspend命令). 按下F5使你回到window。

執行ProcDump,在Task的列表中的第一個list上點擊鼠標右鍵,然後選擇"Refresh list". 在Task列表中找到notepad.exe,在它的上面點擊鼠標右鍵. 然後,選中"Dump (Full)",給脫殼的程式起名存盤. 再在notepad.exe上點擊鼠標右鍵,然後選中"Kill Task".

註:用此方法抓取的文件不可跨平台執行。

★修正剛dump取的文件的入口點

脫殼的notepad.exe程式入口是00401000.
再次使用ProcDump的PE Editor功能, 打開已脫殼的notepad.exe.

在"Header Infos"一項, 你會看見程式Entry Point(入口值)是0000DC70,這當然是錯誤的. 如果你試著不改動這個入口值而執行脫殼後的notepad.exe,程式將無法執行.

在 Procdump可看到ImageBase =00400000,我們上面跟蹤找到的入口值的RVA是00401000,因為:虛擬地址(RVA)=偏移地址+基址(ImageBase ),因此

Entry Poin=00401000-00400000=1000,改變入口值為1000,點擊"OK".

現在, 執行脫殼後的notepad.exe吧,它應該正常執行了。


2005-12-27 12:10 AM
查看資料  訪問主頁  發短消息   編輯文章  引用回覆
  Smiler
  高級會員 
 


  積分 6335
  發文 988
  註冊 2005-9-7
  狀態 離線
#5  感謝分享

其實我覺得中文化比較麻煩就在脫殼的部份,感謝龍太子大大分享精彩文章!

2006-1-6 01:28 AM
查看資料  發送郵件  發短消息   編輯文章  引用回覆
  chia_daniel
  中級會員 
 



  積分 1230
  發文 113
  註冊 2005-10-25
  來自 台北
  狀態 離線
#6  

謝謝大大的分享,
有一點點的了解。


2006-2-28 08:30 PM
查看資料  發送郵件  發短消息   編輯文章  引用回覆
  Tsuki-月
  一般會員 
 


  積分 565
  發文 56
  註冊 2006-2-22
  狀態 離線
#7  

完全不了解手動脫殼的方法....

看來那個BOT是脫不了殼的了...


2006-2-28 10:01 PM
查看資料  發短消息   編輯文章  引用回覆
  cataratas
  基本會員 
 



  積分 173
  發文 9
  註冊 2006-3-12
  狀態 離線
#8  

對脫殼不是很了解。但對中文化很有興趣。
想學習


2006-3-27 09:55 AM
查看資料  發短消息   編輯文章  引用回覆
  JP-chenh
  進階會員 
 



  積分 2743
  發文 615
  註冊 2006-5-11
  狀態 離線
#9  

想學中文化的人怎不看看技術文章呢?
前輩們的心得給我們後輩省了多少摸索的時間?
感謝龍太子大大!
我還需要一些時間來消化這篇文章。


2006-11-13 04:34 PM
查看資料  發送郵件  發短消息   編輯文章  引用回覆
  PeterWu1
  資深會員 
  實相



  積分 3712
  發文 1116
  註冊 2005-9-19
  狀態 離線
#10  

謝謝龍太子大大經驗的分享!!

2007-1-20 12:39 AM
查看資料  發送郵件  發短消息   編輯文章  引用回覆
  igeyorvo
  一般會員 
 



  積分 566
  發文 141
  註冊 2006-4-8
  狀態 離線
#11  

看的我頭都昏
大大說的很清楚可是我看的很昏
上方所說的我几乎都沒玩過
所以有點理解~
我還是去多找一些相關資料看看吧
謝 大大的教學


2007-2-11 02:28 PM
查看資料  發送郵件  發短消息   編輯文章  引用回覆

可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題

論壇跳轉選單: