aspr1.3x註冊版加殼之客串教學
注:論述的加殼檔案請到漢化世紀或網上自己找吧,下面是脫殼回憶分析,光說文字夠多的了--要誇一下自己噢!失誤之處還請指正!
你是否覺得標題很另類,無非是說“教學”有點兒抽象,多盼有好的點選率,但我是很花心機和時間寫的(請給於鮮花、煙花、豆腐花、激情火花,讓我醉到花花世界中--夢寐以求啊)。那麼,這篇文章要說什麼呀?呵呵,是說我脫IconSearcher2.20,aspr1.3x註冊版的加殼,但是,由於在脫的過程到結束一直沒有留下什麼筆記或記錄,而且現在我的機子的XP出了問題,無法執行,只好玩98了。所以下面所說的僅是記憶中的東西,沒有很具體的程式碼放出來參考,看官自己有心理準備>>>要不你會四腳朝天。主要是採用“以殼解殼”的方法,進行脫殼。修復輸入表的事還是少不了跟蹤,現在有“程式碼注入”這個說新也不是太新的方式,可我就是還不會用,但願有位中國gentleman可以放個例項讓我們學習。“以殼解殼”的方法是先處理iat的恢復,最後將執行需要殼的部分搬到脫殼的檔案身上(除非沒有stolen,你也想想誰會這樣便宜你)。
因為不是標準教學,我也就不用教學“格式”寫這篇傻瓜文章。好了,回到我僅有的記憶中……,先了解一下加殼的IconSearcher,我先是比較感興趣的是它的註冊部分,我想以aspr1.24 RC4的方式進行偽註冊(第2次硬碟指紋出現後的記憶體斷點中斷),可是我所看到的跟以往的不一樣,中斷時我來到的主程式的code段,第一個指令好像是push ebp,然後call xxxx(code地址),接下來跑一大堆程式碼(後來知道是自校驗,稱它為a 校驗),來到or eax,eax和je 安全地帶,再接下來又跑程式碼,它要幹什麼,也是自校驗(稱它為b 校驗),不過這次它是計算它將要前往的程式碼是否被人放入bpx斷點或別的修改,如果你先放了int3斷點,那麼計算結果就會不同,同樣接下來的都是判斷je 安全地帶(被計算的目的地),也就是來到跟aspr1.24 RC4的方式進行偽註冊相似的程式碼(哈哈,你該會知道怎麼做。。。記住地址);接著,出現第3次硬碟指紋(日期登記),手段跟上面相同,若你過期還給你放過期標誌。再往後你可能會來到一個生死跳轉的異常,內有是否顯示nag和過期的判斷,往下會看到.regfile和.key的字樣,用來騙人的,註冊驗證早就過了。(這裡偽註冊不是個解決的辦法,同樣有nag,有驗證call eax,程式到了OEP就OK,這裡我們讓下面關鍵的pus ebx的ebx為0就好辦,具體自己找好了,或者進入call找cmp byte [esp],0和jne xxxx的指令,這裡的[esp]是個僅能去nag的註冊標誌)。
好了,我們來看看怎樣去修復iat,哈哈,又回到記憶中去,真是難以描述。我們應該知道,iat加密處理有4個分支,它們都是一邊解密一邊分類和一邊修理iat定向(而且如果你按殼給你的定向是無法完成修復,應該按殼放定向的位置自己重新定向),我們處於被動,暫時無法主動。那麼4個分支有什麼特點呢?看過fly脫飛速加殼的unpackme就會有些明白了(但有所不同)。現在,跟蹤發現,有些分支在放加密後返回到迴圈點時,[code]和api資訊還未釋放,是我們再生iat的好材料;而且iat處理不在一個異常裡完成,那麼,它到底在玩什麼呀(我以前發的指令碼已經變回半效作用,或不夠合理,只是不斷放硬碟斷點)!經過多次跟蹤,發現它歸根到底還是一個異常裡解密加密。是這樣的,aspr每到特定的分支的特別加密,就會發動異常,它要幹什麼,無非是檢測你有沒有輕薄它的body,你佔它便宜,它當然不放過你,還有的是令你以前下的斷點無效,像這樣(你要做的應該是恢復斷點或讓它住手,):
8380 B8000000 02 add dword ptr ds:[eax+B8],2 //context
51 push ecx
31C9 xor ecx,ecx //放0雞蛋
8948 04 mov dword ptr ds:[eax+4],ecx
8948 08 mov dword ptr ds:[eax+8],ecx
8948 0C mov dword ptr ds:[eax+C],ecx
8948 10 mov dword ptr ds:[eax+10],ecx
C740 18 55010000 mov dword ptr ds:[eax+18],155
……
所以你進入了iat處理的異常時,處理當中,突然跑出個異常,你就該知道它要check你了。那麼怎樣去區分異常呢?不是說aspr都有很多異常嗎?這時有個簡單的方法(tips),每當異常再次發生時,你可以看引發異常的指令是否還是xor [eax],eax,不知有沒有寫錯,但我相信你會明白,如果不是,那就是說iat加密處理完成或發生了一個錯誤。發生異常時,往下不遠處就是它工作的大本營,去那逗留準有大發現。
分支中以al=4的call [ebx+30]和al=2的mov byte [ebx],0E8有些麻煩,其它的不用說了吧,想重點講述這兩個,現在可沒力量和論據支援。那麼你首先要令安全地方下的斷點有效和自校驗失效,斷點方面好像已經說了(可能不完全);自校驗嘛,你可以到記憶體映象視窗觀察和你現在身居其中的動態記憶體塊附近有沒有長度為4000的記憶體塊,有就轉存到cpu視窗,從iamge開始處理偏移04E8處,那裡就是存放正確自校驗值的地方,在那下記憶體訪問斷點,斷下的話你就找到比較的地方,接下來你不用我說了吧!
修復可以參考我寫(其中有借用照顧sen的前輩指令碼)有指令碼,具體還要按實際情況對al=4的call [ebx+30]和al=2的mov byte [ebx],0E8進行變動修復,你也可以寫彙編程式碼或“注入程式碼”修復,豐儉由人。
al=4的call [ebx+30] 我認為用記憶體訪問斷點比較好(避開解密錯誤),中斷後,此時你觀察各暫存器的值,並查詢暫存器中那個是code地址,那個是api地址,一般馬上取消記憶體斷點,記錄它們對你做“修復工作”有用,接著ctrl+F9返回到retn處,迴圈。因為我對它裡面的反跟蹤還很糊塗--就這樣做才可搞定。
al=2的mov byte [ebx],0E8 主要是劃分FF25 jmp [ ]或FF15 call[],殼中搜下就找到,具體我暫時還沒發現有混合的,所有你可能比較好修復。我想了個殺瓜區分方法,當你在此指令上中斷後,先到轉存到ebx的地址觀察,如果它附近是有mov eax,eax的程式碼,那麼你要修復的是Jmp[],否則就是call[](猜測的)。
還有一個不記得是哪個分支了,在code記憶體斷點中斷後,留意殼放入[code]的地址,順便就轉存觀察一下,如果轉存的地方為空,就有古怪,一定要跟蹤裡面到底何時放地址,你在暫存器看到的api是假的,再跟蹤該殼空地址,就能找到它的“尾巴”了,十有89就是GetProcAddress,就2個什麼的,記憶中好象是這樣……。
iat修復完成後(我借用了adata這個區節--有1000的長度使用),我們跳往最後異常retn處,主程式是Dephil寫的,程式碼肯定抽得過癮,再來一下F7,你就來到搬過來變變變的oep,要找原始的oep也很好找,記下你現在的eip,然後到code段,選擇“查詢命令”,內填jmp x(x==eip)確定,哈哈,一下就搜出來了,把OEP改定為這。無論它每次執行怎麼變,你都會看到停在此處的一條Jmp m(m就是對eip偏移),你按確定,就能回到現時(殼最後異常retn處單步後)的eip位置了。
現在,你所要做的是把需要殼執行的部分搬到已經修復iat的dump檔案中。那麼,現在eip所在的記憶體塊當然要插到dump檔案裡,還有哪個呢?先不要動手,我們先按從eip所在的指令開始用Enter進行模擬執行,過一會兒,你會來到call xxxx (xxxx是超出本塊記憶體的地址),再Enter,到達的這個塊也要我們搬回去,好了,我們就先搬這2塊回去,經過一輪“修整”後,開另一個OD執行它,如果發現出錯,看看堆疊有沒有找到返回的痕跡,沒有的話你該到剛才找到call xxxx的地址開始跟蹤,直到地址發生超範圍的改變,你應該會知道接下來怎麼幹!搬殼就是這回事(注意:Dump檔案執行和功能使用沒有正常前,請不要關閉停在oep的OD,它是我們修復的參考,若你重來,Dump檔案就無效了,因為是殼是動態處理--即使是同一個記憶體塊,程式碼位置都改變了)。
到現在,脫殼的事就說完了。順便說一下IconSearcher2.20的破解吧,好像不說破解有點傻乎乎的,幹事幹一不幹二。還記得a 校驗嗎?現在修復後的Dump主程式,一執行就錯--異常。載入看看,原來還是a 校驗,程式還有多處使用這玩意--如about選單、開啟視窗等待,哈哈,多沒趣,於是寫個指令碼把它一次清理個光光(無非是 改掉/nop 指令或讓它跑到 JE安全處),並寫回註冊名後儲存,showwin,再執行,哈哈,東點西點,它也沒意見了,讓它身體發福了--3M多(原來是1M呀)。
長篇小說作者:askformore
writen by 9.26.2004
生命之美源於----渴望無限
驚喜之新源於----愛的發現