菜鳥脫 UltraFXP 0.9941 殼( SVKP )+ 破解

看雪資料發表於2015-11-15

這個軟體是在很久以前看fly大俠脫文時,fly大俠提到過的,當時我下載後一直沒動它,最近才拿出來研究,花了不少時間。這個軟體最近版本用了ACProtect加殼,如果要找SVKP殼的就找老一點的版本。雖然不是最新版,但還是要對作者說sorry。


UltraFXP 0.9941 脫殼( SVKP )+破解
 

【軟體簡介】:一國產ftp,fxp軟體。

【下載】:    用google或百度找。

【作者宣告】:初學Crack,冒犯及失誤之處請諸位大俠指正! 

【除錯環境】:WinXP、Ollydbg1.10b、PEiD、LordPE、ImportREC
 
  
用PEiD檢視殼為:SVKP 1.3x -> Pavol Cerven
 
1.找oep

隱藏ollydbg,忽略kernel32記憶體異常,其它的不忽略.下bp GetProcAddress+11,(注意:不能在函式第一
句下斷,很多殼都會檢測到的),f9執行,異常處shift+f9透過,直到中斷在GetProcAddress+11,然後到
memory map視窗在ultrafxp程式碼段下記憶體訪問斷點,f9執行,到下面程式碼:

0056EEAB      NOP
0056EEAC      NOP
0056EEAD      NOP
0056EEAE      CALL UltraFxp.004079B8           //中斷在這,偽oep
0056EEB3      MOV EBXDWORD PTR DS:[58802C]           ; UltraFxp.0058B318
0056EEB9      MOV EAXDWORD PTR DS:[588940]
0056EEBE      MOV EAXDWORD PTR DS:[EAX]
0056EEC0      CALL UltraFxp.0043C18C
0056EEC5      MOV EAXDWORD PTR DS:[588864]
0056EECA      MOV EDX, UltraFxp.0056F5E4               ; ASCII "Unregistered version!"
0056EECF      CALL UltraFxp.00403E2C
0056EED4      PUSHAD
0056EED5      PUSH EAX
0056EED6      PUSH ECX
0056EED7      PUSH EDX
0056EED8      PUSH EBX
0056EED9      PUSH EBP
0056EEDA      PUSH ESI
0056EEDB      PUSH EDI
0056EEDC      MOV EDX, 8E9AF9D6
0056EEE1      XOR EDX, 3159F8D7
0056EEE7      PUSH EDX
             
.............
             
0056EF3A      XOR ECX, 3113B900
0056EF40      XOR EDX, DFB7D6BE
0056EF46      PUSH ECX
0056EF47      PUSH EDX
0056EF48      MOV ECXESP
0056EF4A      XOR EDX, 56EFD6BE
0056EF50      ADD EDXECX
0056EF52      PUSH EDX
0056EF53      XOR ECX, 11B8A811
0056EF59      XOR EDX, 22222222
0056EF5F      RETN



0056EEAE是偽oep,根據eax=56eab0,esp=12fea8以及經驗補上stolen bytes,共14位元組:


0056EEA0      55                        PUSH EBP
0056EEA1      8BEC                   MOV EBPESP
0056EEA3      81C4 E8FEFFFF   ADD ESP, -118
0056EEA9      B8 B0EA5600      MOV EAX, 0056EAB0
             

用lordpe糾正大小後把它dump出來,並把oep改為0056EEA0。




2.修復IAT

經過查詢,找到加密後的IAT,從58C1B8到58ca40共88c個。可以用ImportREC的跟蹤層次來修復,有25
個是錯誤。下面我們來看看怎麼修改程式,能得到錯誤少一點的IAT。重新載入程式。在58C1B8處下個
記憶體寫入斷點,執行,異常處shift+f9透過,中斷幾次後到下面程式碼:


07346D00       MOV DWORD PTR DS:[EDI], EAX   //中斷在這,eax=075775DC(加密後的函式地址)
07346D02       JL SHORT 07346D07
07346D04       JMP SHORT 07346D09
07346D06       JMP EF96687F
07346D0B       ADD DWORD PTR DS:[EAX], EAX
07346D0D       ADD BYTE PTR DS:[EAX], AL


中斷後,看看堆疊窗,esp=12ff74,在esp+1c=12ff90處正是正確的函式地址(不要問為什麼,我也不知
道,是一高人的妙招),因此我們看能不能在07346D00之前把正確的函式地址放入eax,在程式碼窗往上
看:


07346CF6       5F                POP EDI
07346CF7       EB 02           JMP SHORT 07346CFB
07346CF9       CD 20           INT 20
07346CFB       58                POP EAX
07346CFC       EB 02           JMP SHORT 07346D00
07346CFE       0F                NOP                             //花指令,nop掉看看
07346CFF       E8                NOP                             //花指令,nop掉看看
07346D00       8907            MOV DWORD PTR DS:[EDI], EAX
            
            
我們可以改成這樣:
        
 073C6CF6      5F                    POP EDI
 073C6CF7      58                    POP EAX
 073C6CF8      8B4424 1C       MOV EAXDWORD PTR SS:[ESP+1C]
 073C6CFC      EB 02               JMP SHORT 073C6D00
      
           
 在0056EEA E處下個斷,f9執行到0056EEAE。ok,執行ImportREC,填入oep=0016EEA0,RVA=18C1B8, 
 size=88c,按get imports得到基本完整的IAT,但還有12個有問題:
           
 0  0 018C20C  ?  0000  075E33FC
 0  0 018C21C  ?  0000  075E2A23
 0  0 018C22C  ?  0000  075E2085
           
0  0018C2E0  ?  0000  075E33FC

0  0018C3C8  ?  0000  075EB008
0  0018C3CC  ?  0000  075EAC83
0  0018C3F0  ?  0000  075E33FC
0  0018C424  ?  0000  075E3077

0  0018CA2C  ?  0000  075E85D2
0  0018CA30  ?  0000  075E8098
0  0018CA34  ?  0000  075E6FC4
0  0018CA38  ?  0000  075E6E2C


不管用什麼外掛都修復不了,沒辦法只好手工了。儲存好IAT,過載軟體,一個一個慢慢跟。


004079BB      CALL UltraFxp.004078B8  (JMP DWORD PTR DS:[58C2E0])


過了這個call,eax=400000,這應該是GetModuleHandleA。其他的我不詳細寫了,我得出的前面8個為:


1  0018C20C  kernel32.dll  016F  GetModuleHandleA
1  0018C21C  kernel32.dll  0103  GetCommandLineA
1  0018C22C  kernel32.dll  00B0  ExitProcess

1  0018C2E0  kernel32.dll  016F  GetModuleHandleA

1  0018C3C8  kernel32.dll  01D5  GetVersionExA
1  0018C3CC  kernel32.dll  01D4  GetVersion
1  0018C3F0  kernel32.dll  016F  GetModuleHandleA

1  0018C424  kernel32.dll  0135  GetCurrentProcess


其中0018C22C處的我跟到了VirtualFree,但後來執行退出時總有問題,改成ExitProcess就好了,不知
有沒有道理。


0018CA2C~0018CA38四個,一開始怎麼也跟不到系統函式中,一生氣乾脆把相應的呼叫nop掉了,嘿,
就行了。後來再靜下心來跟了一下,第一個函式是檢測有沒有偵錯程式,呼叫了IsDebuggerPresent函式
,可以用IsDebuggerPresent代替。第三個是用來複制註冊資訊的,其他兩個好像沒什麼用。因此相應
的呼叫改為:


004EE33F      CALL 004E4EDC       //nop掉
             
004EE352      CALL 004E4ECC      //nop掉
             
004EE361      PUSH EAX          //eax裡是註冊資訊地址,呼叫返回eax=1,表示已註冊,0是未註冊
004EE362      CALL 004E4EC4     //因此這兩句改成:mov eax,1
             
004EE392      CALL 004E4ED4      //nop掉
004EE397      RETN
           
           
好,IAT修改好了,修復dump.exe。執行dump_.exe,出錯。真麻煩啊,看看吧:         


0012FE24      LODS BYTE PTR DS:[ESI]
0012FE25      XOR ALDL
0012FE27      STOS BYTE PTR ES:[EDI]
0012FE28      LOOPD SHORT 0012FE24
0012FE2A      POP ECX
0012FE2B      POP ESI
0012FE2C      CALL DWORD PTR DS:[4EEAA4]   //出錯!解碼函式,指向殼內
0012FE32      ADD ESP, 54
0012FE38      POPAD
0012FE39      PUSH 1010101
0012FE3E      RETN


程式在堆疊中執行,開始我以為搞錯了,怎麼跑到堆疊中去了?後來發現這些程式碼都是動態生成的,是
類似前面0056EED4~0056EF5F的程式碼生成的,然後由這段程式碼再解碼正常的程式段。0012FE2C 處是解
碼函式,指向殼內,脫殼後當然會出錯了。這樣的地方有100多處。看來只好自己程式設計模擬殼來解碼了
。還好解碼函式很簡單。還有一處類似的解碼函式,CALL DWORD PTR DS:[4F18D5]。在程式末端加入以
下程式碼:

0056FFA0      TEST ALAL
0056FFA2      JE SHORT 0056FFC0
0056FFA4      MOV EDIESI
0056FFA6      MOV EBX, 52E4B8F8
0056FFAB      LODS BYTE PTR DS:[ESI]
0056FFAC      XOR EBXECX
0056FFAE      XOR ALBL
0056FFB0      ROL ALCL
0056FFB2      XOR ALBH
0056FFB4      STOS BYTE PTR ES:[EDI]
0056FFB5      LOOPD SHORT 0056FFAB
0056FFB7      RETN
0056FFB8      NOP
           
0056FFBF      NOP
0056FFC0      MOV EDIESI
0056FFC2      MOV EBX, 52E4B8F8
0056FFC7      LODS BYTE PTR DS:[ESI]
0056FFC8      XOR EBXECX
0056FFCA      XOR ALBH
0056FFCC      ROR ALCL
0056FFCE      XOR ALBL
0056FFD0      STOS BYTE PTR ES:[EDI]
0056FFD1      LOOPD SHORT 0056FFC7
0056FFD3      RETN
            
            
再把[4EEAA4]內容改為0056FFC0,[4F18D5]改為0056FFA0,儲存。執行,OK。

註冊資訊放在4ee3e0處,你愛怎麼改就怎麼改。


終於寫完了,好累。有些地方說起來簡單,但都是經過若干遍試出來的,希望對感興趣的人有點幫助。
錯誤之處,還請各位大俠指正。


pyzpyz

2004.2.25

相關文章