|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2004-02-09, 02:55 AM | #1 |
榮譽會員
|
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 現在因為資源段是不可寫的,程序將資源複製到了另一個地方,那他就肯定還要對複製到的地方做手腳,於是在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 語法:
0040DCB1 . E8 823C0000 CALL pexplore.00411938 ;* 0040DCB6 . 8B45 E4 MOV EAX,DWORD PTR SS:[EBP-1C] 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] 因為以上使用複製和解密的語句都處在同一層,我們有理由相信,這一層很有好戲看,於是清除所有斷點,著重分析這層程式碼: 語法:
;分析點前面不遠處有一個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 這樣過了幾個月.後來見到了一個解密漢化版,於是想起來這檔子事兒,拿出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 在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 ;使用解密子程序 儲存執行,程序正常出來了,爽,將他功能表的MS Sans Serif都換成Tahoma先,呵呵,這才是解這個BT軟體的樂趣所在呀~~ 至於破解時間限制什麼的,沒弄,也不想弄,我哪能整天找到那麼多UPX的殼來用他脫呢? 【總結】Delphi編譯器產生的程序結構清晰,程式碼優美,堆倉穩定不需調整,實乃挖孔打洞的首選程序之一,適合像我這樣的初菜練手!這次主要是找解密點, |
送花文章: 3,
|