史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 作業系統操作技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2004-02-09, 02:55 AM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 PeExplorer所用的一種BT的Delphi表單防漢化方法

【標題】一種BT的Delphi功能表防漢化方法
【目標】PeExplorer 1.94官方英文版,PeExplorer是一款強大的資源編輯器,我通常用其來脫殼UPX程序=_=0,下載連接:
    http://www.pe-explorer.com/download/...orer_setup.exe
    這個版本跟目前網上下載的有一點不一樣,直接怎麼不一樣我不清楚,反正這個Exe的產生時間是2003/10/21 00:40,晚了一天,
    個頭也比世紀上的原版鏡像大一些,是2.46M.
【工具】LordPE,OllyDbg,WinHex
【音樂】滄桑歎,大渡口,白河寒秋
【保護】用ResScope開啟RCDATA的各功能表資源項,呈現五顏六色無法識別的Hex編輯狀態^_*

憑我多年的YY經驗,一看就知道功能表被加密過了(眾:你火星來的吧?地球銀都知道了),怎麼加密的呢?
不管他,看看他怎麼解密的先.
要解密首先怎麼著也得訪問想解密的資源吧,那偶就在資源位址下記憶體存取斷點,不信斷不下來.起初我是找主功能表資源的VA位址,在那裡下了斷,發現是斷下來以後,螢幕上會擋著一塊帶顯示懶顯示的功能表,影響拷貝Olly裡的程式碼到WPS中,看樣子,資源是在功能表新增前解密的,那敢情好我就換了個靠門口的地方,我下在了splash功能表資源上,斷下時候是一條REP MOVS指令:
語法:
 
004027E0  /$  56                 PUSH ESI 
004027E1  |.  57                 PUSH EDI 
004027E2  |.  89C6               MOV ESI,EAX    ;EAX作為源位址參數傳入 
004027E4  |.  89D7               MOV EDI,EDX    ;EDX作為目標位址參數傳入 
004027E6  |.  89C8               MOV EAX,ECX    ;ECX作為長度參數傳入 
004027E8  |.  39F7               CMP EDI,ESI 
004027EA  |.  7F 13              JG SHORT pexplore.004027FF 
004027EC  |.  74 2F              JE SHORT pexplore.0040281D 
004027EE  |.  C1F9 02            SAR ECX,2 
004027F1  |.  78 2A              JS SHORT pexplore.0040281D 
004027F3  |.  F3:A5              REP MOVS DWORD PTR ES:[EDI],DWORD PTR D>   ;斷在這裡 
004027F5  |.  89C1               MOV ECX,EAX
看樣子這像是一個通用的資料複製子程序,在斷下的那裡,ESI,EDI分別指向源位址和目標位址,這個功能表是把006422D8 寫到001627E8這裡了.
現在因為資源段是不可寫的,程序將資源複製到了另一個地方,那他就肯定還要對複製到的地方做手腳,於是在EDI值上使用右鍵,Follow In Dump來到Dump視窗,將記憶體存取斷點下到了001627E8.
現在一直按F8叫他返回,最後一層是返回到這裡:
語法:
 
004117D7  |.  E8 0410FFFF        CALL pexplore.004027E0   ;* 
004117DC  |.  8B45 F0            MOV EAX,DWORD PTR SS:[EBP-10]
然後倒數第二層返回到這裡:
語法:
 
004112D0  |.  FF53 04            CALL DWORD PTR DS:[EBX+4]   ;* 
004112D3  |.  3B45 F4            CMP EAX,DWORD PTR SS:[EBP-C]
倒數第三層返回兩次(兩次返回指令是靠著的)
從0041130E RETN,返回到00411316 POP EBX,接下來又是RETN,返回到了這裡:
倒數第五層:
語法:
 
00411975  |.  E8 22F9FFFF        CALL pexplore.0041129C   ;* 
0041197A  |>  8BE5               MOV ESP,EBP 
0041197C  |.  5D                 POP EBP 
0041197D  \.  C3                 RETN
直到現在還是程序沒有去管那個複製到的地方,我有點忍不住了,呵呵,在上面的RETN返回一次,到了倒數第六層跋涉:
語法:
 
0040DCB1   .  E8 823C0000        CALL pexplore.00411938   ;* 
0040DCB6   .  8B45 E4            MOV EAX,DWORD PTR SS:[EBP-1C]
現在繼續F8,沒幾下,就會斷下來,因為是在我們F8程序中的CALL裡面斷下的,在斷點視窗看到如下未能如願消失的行:
0040DCE5|pexplore|One-shot|MOV EDX,DWORD PTR SS:[EBP-C]
雙按這行,一下子就告訴我們,是在如下CALL裡面發生的事件:
語法:
 
0040DCE0   .  E8 BFFEFFFF        CALL pexplore.0040DBA4   ;*這裡 
0040DCE5   .  8B55 F4            MOV EDX,DWORD PTR SS:[EBP-C]
好的,在斷下來的地方F9返回,果然Dump視窗出來的已經是功能表的樣子了,如你想看直接程序你就繼續F8,在回到斷下程式碼的上一層以後,可以看到那層中間每循環一次,Dump視窗就會解密一個字元,直到解密完畢.
因為以上使用複製和解密的語句都處在同一層,我們有理由相信,這一層很有好戲看,於是清除所有斷點,著重分析這層程式碼:
語法:
 
;分析點前面不遠處有一個FindResourceA,將其也看了下 
0040DC4E   .  E8 C97AFFFF        CALL <JMP.&kernel32.FindResourceA>      ; \FindResourceA 
0040DC53   .  8945 EC            MOV DWORD PTR SS:[EBP-14],EAX           ;這種堆倉形式的存放資料,是Delphi裡面的局部變數 
... 
... 
0040DC9F   .  55                 PUSH EBP                        ;我將分析起點放在這裡是因為看著PUSH EBP比較好看 
0040DCA0   .  68 11DD4000        PUSH pexplore.0040DD11 
0040DCA5   .  64:FF30            PUSH DWORD PTR FS:[EAX] 
0040DCA8   .  64:8920            MOV DWORD PTR FS:[EAX],ESP 
0040DCAB   .  8B55 E8            MOV EDX,DWORD PTR SS:[EBP-18] 
0040DCAE   .  8B45 E4            MOV EAX,DWORD PTR SS:[EBP-1C] 
0040DCB1   .  E8 823C0000        CALL pexplore.00411938 
0040DCB6   .  8B45 E4            MOV EAX,DWORD PTR SS:[EBP-1C] 
0040DCB9   .  8B40 04            MOV EAX,DWORD PTR DS:[EAX+4] 
0040DCBC   .  8945 E0            MOV DWORD PTR SS:[EBP-20],EAX 
0040DCBF   .  8B45 E4            MOV EAX,DWORD PTR SS:[EBP-1C] 
0040DCC2   .  E8 81350000        CALL pexplore.00411248 
0040DCC7   .  83E8 04            SUB EAX,4                        ;這裡為功能表資源複製到的位址,剛才被+4現在減回去 
0040DCCA   .  8945 DC            MOV DWORD PTR SS:[EBP-24],EAX 
0040DCCD   .  8B45 E0            MOV EAX,DWORD PTR SS:[EBP-20] 
0040DCD0   .  C700 54504630      MOV DWORD PTR DS:[EAX],30465054  ;將功能表頭四個字元寫為'TPF0' 
0040DCD6   .  8345 E0 04         ADD DWORD PTR SS:[EBP-20],4      ;挪動到這四個TPF0字元結尾處 
0040DCDA   .  8B55 DC            MOV EDX,DWORD PTR SS:[EBP-24]    ;參數1:解密長度 
0040DCDD   .  8B45 E0            MOV EAX,DWORD PTR SS:[EBP-20]    ;參數2:解密首位址 
0040DCE0   .  E8 BFFEFFFF        CALL pexplore.0040DBA4           ;使用解密子程序 
0040DCE5   .  8B55 F4            MOV EDX,DWORD PTR SS:[EBP-C] 
0040DCE8   .  8B12               MOV EDX,DWORD PTR DS:[EDX] 
0040DCEA   .  8B45 E4            MOV EAX,DWORD PTR SS:[EBP-1C] 
0040DCED   .  E8 76370000        CALL pexplore.00411468
該解密Call完成每個功能表的解密程序,起初我設想在每個功能表解密後,將解密後的功能表內容複製並覆蓋原資源項內容,但是這個程序的功能表較多,而且還需要手動點開每個功能表,所以我只還原了一個功能表,然後停工懶得搞了.
這樣過了幾個月.後來見到了一個解密漢化版,於是想起來這檔子事兒,拿出Olly,又手動還原了另一個功能表,感覺這種還原方式太原始,前天開始,去分析解密子程序,感覺偶分析算法功力不夠.
昨天夜裡做了一夜怪夢.早上發現有人在001發帖兒,說直接將資源坐地解密,就在資源段解回去.還沒看完,醒了一次.又做夢,被人追殺.
敢情是哪位比PeExplorer作者還BT的高人托夢給我的說!於是在程序複製為PeExplorer_B.exe,用LordPE在結尾加了一個段,RawSize為400,VSize為1000,在這個段上使用tuncate at end of section擴展整個文件,VA是00682000,編寫程式碼如下:
語法:
 
00682000    8B15 04226800        MOV EDX,DWORD PTR DS:[682204]    ;取出長度參數 
00682006    A1 00226800          MOV EAX,DWORD PTR DS:[682200]    ;取出位址參數 
0068200B    83F8 00              CMP EAX,0 
0068200E    74 21                JE SHORT pexplore.00682031       ;以位址0為結束條件 
00682010    C700 54504630        MOV DWORD PTR DS:[EAX],30465054  ;'TPF0' 
00682016    83C0 04              ADD EAX,4 
00682019    83EA 04              SUB EDX,4 
0068201C    E8 83BBD8FF          CALL pexplore.0040DBA4           ;將功能表就地解密 
00682021    8305 02206800 08     ADD DWORD PTR DS:[682002],8      ;處理下一組的長度,改寫682000那句指令的參數 
00682028    8305 07206800 08     ADD DWORD PTR DS:[682007],8      ;改寫682006那句 
0068202F  ^ EB CF                JMP SHORT pexplore.00682000      ;循環 
00682031    CC                   INT3 
00682032    C3                   RETN
此程式碼用OllyDbg寫下來然後拷貝到WinHex裡面貼上的.貼上時候去掉前面位址,和後面的多餘部分,選ASCII-HEX.
在682200開始,我依次存放了需要解密的$1E個功能表的位址,長度.
這段程序循環讀出每個需要解密的功能表參數並加以解密,當然,為了就地解密,資源段的內容增加了可寫內容,而新增的程式碼段,也要具有可寫內容因為他要自己寫自己的指令參數.
試試在OEP處跳到這裡執行,並不奏效,應該是解密子程序中間用到了一些啟始化過的局部變數/陣列.
於是原來的使用解密程序的地方下斷,斷下以後來到00682000執行(右鍵,New Orginal Here),呵呵,等到執行到INT3那句時候,在Dump視窗,看看那些功能表資源VA地方,整齊的功能表內容都白花花的出來了.
啦啦啦,抄起LordPE,dump Region,選上資源那段,存下來,他替我們取了個名兒:Region005C8000-00682000.dmp,然後把他弄到原來程序裡面,就算是大功告成了!
將原文件複製為另存新檔PeExplorer_T.exe,用WinHex開啟Region005C8000-00682000.dmp,全選+複製,再開啟PeExplorer_T.exe,定位到資源的RawOffset:001BCA00,在那裡Ctrl+B,粘下來.
儲存並執行,當然要提示Runtime Error at xxxxxxxx,呵呵,肯定是程序對解密過的功能表再次運算以後,鬼知道變成什麼了,不管啦,本來準備把動態新增功能表的部分完全去掉,後來還是只去掉了原程序裡面解密的一步,就是這裡:
語法:
 
0040DCE0   .  E8 BFFEFFFF        CALL pexplore.0040DBA4           ;使用解密子程序
這個呢Delphi裡面函數使用使用一般暫存器傳參數,所以堆倉不需要調整,因此把他改為了nop,nop,nop,nop,nop.
儲存執行,程序正常出來了,爽,將他功能表的MS Sans Serif都換成Tahoma先,呵呵,這才是解這個BT軟體的樂趣所在呀~~
至於破解時間限制什麼的,沒弄,也不想弄,我哪能整天找到那麼多UPX的殼來用他脫呢?

【總結】Delphi編譯器產生的程序結構清晰,程式碼優美,堆倉穩定不需調整,實乃挖孔打洞的首選程序之一,適合像我這樣的初菜練手!這次主要是找解密點,
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 03:58 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1