VideoSplitter V2.31 脫殼去暗樁+完美爆破

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

標 題:VideoSplitter V2.31 脫殼去暗樁+完美爆破

發信人:David

時 間:2004年4月04日 11:54 

詳細資訊: 



【脫文標題】 VideoSplitter V2.31 脫殼去暗樁+完美爆破    

【脫文作者】 weiyi75[Dfcg] 
  
【作者郵箱】 weiyi75@sohu.com 
  
【作者主頁】 Dfcg官方大本營 
  
【使用工具】 Ollydbg1.10b,ImportREC1.42,Loadpe 
  
【破解平臺】 Win2000/XP 
  
【軟體名稱】 VideoSplitter V2.31 
  
【下載地址】 http://www.boilsoft.com/videosplitter  
  
【軟體簡介】 一個AVI/MPEG/ASF/WMV分機的分割,合併工具,也包括了AVI和MPEG的播放器在裡面,你可以很輕鬆的利用這個播放器把你喜歡的片斷擷取下來。  

【軟體大小】 705KB  
  
【加殼方式】 ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov 
  
【保護方式】 沒有使用Asprotcet的Rsa演算法保護,採用自行研究的加密演算法,啟動時校驗註冊碼,10天試用期限制,SDK防脫殼暗樁。 
  
【破解宣告】 我是一隻小菜鳥,偶得一點心得,願與大家分享: 
  
  
-------------------------------------------------------------------------------- 
  
  
【破解內容】 

第一部分,脫去Asprotect1.23外殼保護,補上Stolen Code,修復IAT。

首先Peid查殼,為ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov。透過二哥=weiyi75=David作品Asprotect1.23rc4之Dephi語言篇經驗,脫殼修復這個軟體易如反掌。 

複習一下,暫存器EBP=0012FFF0   //這是未加殼程式停在入口點EBP的值,其它Dephi語言或程式語言這裡的EBP值全部相同,這又說明什麼,當Asprotect執行到這裡或Stolen Code做手腳時EBP的值就為EBP=0012FFF0,我們來具體試試。 

Ollydbg載入程式,隱藏OD,OD異常設定忽略除記憶體異常外的全部異常。 

00401000 >  68 01604B00     push VideoSpl.004B6001        //加殼程式入口點,這裡先停一下,Asprotect殼一般都有防脫殼暗樁,我們初學者採用被動式脫殼法比較好,發現問題再想辦法解決。那麼就先脫殼,修復IAT,補上Stolen Code。
00401005    E8 01000000     call VideoSpl.0040100B
0040100A    C3              retn
0040100B    C3              retn
0040100C    9B              wait
0040100D    3E:AE           scas byte ptr es:[edi]
0040100F    81E9 06A552EF   sub ecx, EF52A506
00401015    2D 1FCABC58     sub eax, 58BCCA1F
0040101A    56              push esi
0040101B    BC 9F7BA982     mov esp, 82A97B9F
00401020    4F              dec edi
00401021    40              inc eax
00401022    D6              salc
00401023    4F              dec edi
00401024    6E              outs dxbyte ptr es:[edi]
00401025    F9              stc
00401026    95              xchg eaxebp
00401027    27              daa
00401028    47              inc edi
00401029    8371 C3 9A      xor dword ptr ds:[ecx-3D], FFFFFF9A
.........................................................................................

直接用OD指令碼外掛到達地球人都知道的位置。

012239EC    3100            xor dword ptr ds:[eax], eax
012239EE    64:8F05 0000000>pop dword ptr fs:[0]
012239F5    58              pop eax
012239F6    833D B07E2201 0>cmp dword ptr ds:[1227EB0], 0
012239FD    74 14           je short 01223A13
012239FF    6A 0C           push 0C
01223A01    B9 B07E2201     mov ecx, 1227EB0
01223A06    8D45 F8         lea eaxdword ptr ss:[ebp-8]
01223A09    BA 04000000     mov edx, 4
01223A0E    E8 2DD1FFFF     call 01220B40
01223A13    FF75 FC         push dword ptr ss:[ebp-4]
01223A16    FF75 F8         push dword ptr ss:[ebp-8]
01223A19    8B45 F4         mov eaxdword ptr ss:[ebp-C]
01223A1C    8338 00         cmp dword ptr ds:[eax], 0
01223A1F    74 02           je short 01223A23
01223A21    FF30            push dword ptr ds:[eax]
01223A23    FF75 F0         push dword ptr ss:[ebp-10]
01223A26    FF75 EC         push dword ptr ss:[ebp-14]
01223A29    C3              retn        //再這裡下斷點,Shift+F9中斷後清除斷點,F8步過。
..........................................................................................

01237838   /E9 08000000     jmp 01237845  //到這裡。
0123783D   |40              inc eax
0123783E  ^|79 BE           jns short 012377FE
01237840   |1F              pop ds
01237841   |6C              ins byte ptr es:[edi], dx
01237842   |35 CA3BE80D     xor eax, 0DE83BCA
01237847    0000            add byte ptr ds:[eax], al
01237849    00B1 961704ED   add byte ptr ds:[ecx+ED041796], dh
0123784F    22B3 70E96E0F   and dhbyte ptr ds:[ebx+F6EE970]
..........................................................................................

我這次沒有用記憶體映象斷點到OEP,下面的這個方法可以發現Stolen Code(如果有)+Oep二合一。 

仍然是命令列斷點 

tc ebp==12fff0       //當前EBP內容為12fff0就被中斷,略微看看就可以找到Stolen Code(如果有)或Oep 

01237AE8   /3E:EB 02        jmp short 01237AED  //一會就來到這裡,呵呵,C語言就開始有Stolen Code,往下全部用F7步過,轉標籤1      01237AEB   |CD20 2EEB01C7   vxdcall C701EB2E
01237AF1    F3:             prefix rep:
01237AF2    EB 02           jmp short 01237AF6
01237AF4    CD20 6A505589   vxdcall 8955506A
01237AFA    74 24           je short 01237B20
01237AFC    04 F3           add al, 0F3
01237AFE    EB 02           jmp short 01237B02
01237B00    CD20 8D642404   vxdcall 424648D
01237B06    2E:EB 02        jmp short 01237B0B
..........................................................................................

標籤1 

01237AED   /2E:EB 01        jmp short 01237AF1

01237AF1    F3:             prefix rep:

01237AF6    6A 50           push 50
01237AF8    55              push ebp
01237AF9    897424 04       mov dword ptr ss:[esp+4], esi
01237AFD    F3:             prefix rep:

01237B02    8D6424 04       lea espdword ptr ss:[esp+4]
01237B06    2E:EB 02        jmp short 01237B0B

01237B0B   /EB 01           jmp short 01237B0E

01237B0E    0FBCF1          bsf esiecx
01237B11    36:EB 01        jmp short 01237B15

01237B15    C1D6 C6         rcl esi, 0C6
01237B18    EB 01           jmp short 01237B1B

01237B1B    8DB7 F77A2301   lea esidword ptr ds:[edi+1237AF7]
01237B21    2BF7            sub esiedi
01237B23    FF56 32         call dword ptr ds:[esi+32]

01237B30    5E              pop esi                                  ; 01237B26
01237B31    2E:EB 02        jmp short 01237B36

01237B36    337424 28       xor esidword ptr ss:[esp+28]           ; kernel32.77E68EC8
01237B3A    5E              pop esi
01237B3B    F2:             prefix repne:

01237B3F    55              push ebp          //Stolen Code第一句 
01237B40    8BEC            mov ebpesp     //執行完它後,EBP=ESP=12FFC0,打破了從跟蹤到這裡EBP的值一直為12fff0的情況,同時也讓我們也可以知道入口程式碼就在附近。Stolen Code第二句。 
01237B42    6A FF           push -1        //Stolen Code第三
01237B44    68 402E4800     push 482E40   //Stolen Code第四句 
01237B49    68 B8E54400     push 44E5B8  //Stolen Code第五句 
01237B4E    64:A1 00000000  mov eaxdword ptr fs:[0]  //Stolen Code第六句 
01237B54    F2:             prefix repne:

01237B58    50              push eax        //Stolen Code第七句 
01237B59    64:8925 0000000>mov dword ptr fs:[0], esp   //Stolen Code第八句 
01237B60    83EC 58         sub esp, 58               //Stolen Code第九句 
01237B63    F2:             prefix repne:

01237B67    53              push ebx             //Stolen Code第十句 

01237B68    F2:             prefix repne:

01237B6C    56              push esi            //Stolen Code第十一句                        
01237B6D    F2:             prefix repne:

01237B71    57              push edi       //Stolen Code第十二句 
01237B72    8965 E8         mov dword ptr ss:[ebp-18], esp         //Stolen Code第十三句 

01237B75    3E:EB 02        jmp short 01237B7A

01237B7A    F2:             prefix repne:

01237B7E    68 04E44400     push 44E404
01237B83    68 467A2301     push 1237A46
01237B88    C3              retn

01237A46   /EB 01           jmp short 01237A49

01237A49    51              push ecx
01237A4A    57              push edi
01237A4B    9C              pushfd
01237A4C    FC              cld

01237A4D    BF 8A7A2301     mov edi, 1237A8A
01237A52    B9 5E140000     mov ecx, 145E
01237A57    F3:AA           rep stos byte ptr es:[edi]      //F7可以看著它迴圈執行Stolen Code,真是白痴,我們的Stolen Code已經到手了,它還在打掃戰場。
01237A59    9D              popfd
01237A5A    5F              pop edi
01237A5B    59              pop ecx
01237A5C    C3              retn  //返回到偽Oep

0044E3DE    0000            add byte ptr ds:[eax], al     //真Oep
0044E3E0    0000            add byte ptr ds:[eax], al
0044E3E2    0000            add byte ptr ds:[eax], al
0044E3E4    0000            add byte ptr ds:[eax], al
0044E3E6    0000            add byte ptr ds:[eax], al
0044E3E8    0000            add byte ptr ds:[eax], al
0044E3EA    0000            add byte ptr ds:[eax], al
0044E3EC    0000            add byte ptr ds:[eax], al
0044E3EE    0000            add byte ptr ds:[eax], al
0044E3F0    0000            add byte ptr ds:[eax], al
0044E3F2    0000            add byte ptr ds:[eax], al
0044E3F4    0000            add byte ptr ds:[eax], al
0044E3F6    0000            add byte ptr ds:[eax], al
0044E3F8    0000            add byte ptr ds:[eax], al
0044E3FA    0000            add byte ptr ds:[eax], al
0044E3FC    0000            add byte ptr ds:[eax], al
0044E3FE    0000            add byte ptr ds:[eax], al
0044E400    0000            add byte ptr ds:[eax], al
0044E402    0000            add byte ptr ds:[eax], al
0044E404    FF15 EC314700   call dword ptr ds:[4731EC]     //偽Oep 
0044E40A    33D2            xor edxedx
0044E40C    8AD4            mov dlah
0044E40E    8915 28F44900   mov dword ptr ds:[49F428], edx
0044E414    8BC8            mov ecxeax
0044E416    81E1 FF000000   and ecx, 0FF
0044E41C    890D 24F44900   mov dword ptr ds:[49F424], ecx
0044E422    C1E1 08         shl ecx, 8
0044E425    03CA            add ecxedx
0044E427    890D 20F44900   mov dword ptr ds:[49F420], ecx
0044E42D    C1E8 10         shr eax, 10
0044E430    A3 1CF44900     mov dword ptr ds:[49F41C], eax
0044E435    6A 01           push 1
0044E437    E8 882C0000     call VideoSpl.004510C4
..........................................................................................

整理一下Stolen Code 

....................................................... 
push ebp                        //Stolen Code 
mov ebpesp       
push -1         
push 4822F0     
push 44E000                        一共13句程式碼 
mov eaxdword ptr fs:[0]  
push eax 
mov dword ptr fs:[0], esp 
sub esp, 58 
push ebx 
push esi                          
push edi                            
mov dword ptr ss:[ebp-18], esp   //Stolen Code 
....................................................... 

0044E3DE    55              push ebp          //補好後複製程式碼到檔案中,直接用Loadpe脫殼。 
0044E3DF    8BEC            mov ebpesp
0044E3E1    6A FF           push -1
0044E3E3    68 402E4800     push VideoSpl.00482E40
0044E3E8    68 B8E54400     push VideoSpl.0044E5B8
0044E3ED    64:A1 00000000  mov eaxdword ptr fs:[0]
0044E3F3    50              push eax
0044E3F4    64:8925 0000000>mov dword ptr fs:[0], esp
0044E3FB    83EC 58         sub esp, 58
0044E3FE    53              push ebx
0044E3FF    56              push esi
0044E400    57              push edi
0044E401    8965 E8         mov dword ptr ss:[ebp-18], esp
0044E404    FF15 EC314700   call dword ptr ds:[4731EC]
0044E40A    33D2            xor edxedx
0044E40C    8AD4            mov dlah
0044E40E    8915 28F44900   mov dword ptr ds:[49F428], edx
0044E414    8BC8            mov ecxeax
0044E416    81E1 FF000000   and ecx, 0FF
0044E41C    890D 24F44900   mov dword ptr ds:[49F424], ecx
0044E422    C1E1 08         shl ecx, 8
0044E425    03CA            add ecxedx
0044E427    890D 20F44900   mov dword ptr ds:[49F420], ecx
0044E42D    C1E8 10         shr eax, 10
0044E430    A3 1CF44900     mov dword ptr ds:[49F41C], eax
0044E435    6A 01           push 1
0044E437    E8 882C0000     call VideoSpl.004510C4
....................................................... 

IAT修復 

執行ImportREC,OEP填入4E3DE,自動搜尋,獲得輸入資訊,先用跟蹤等級1修復,然後用Asprotect1.3外掛修復剩下的幾個指標,修復先脫殼的Dumped.exe。 

第二部分,去除暗樁

第二部分,去除暗樁

OD載入修復的檔案,F9執行。 

狀態列/提示記憶體寫錯誤。 

堆疊友好提示 

0012AFD8   0040DD53  返回到 dumped_.0040DD53 來自 01221C08        //錯誤來自0040DD53
0012AFDC   00474758  ASCII ".RMF"
0012AFE0   00000004
0012AFE4   00000000
0012AFE8   00496850  dumped_.00496850
....................................................... 

那麼Ctrl+G 去0040DD53 看看。 

0040DD4D  |.  FF15 8CD64800 call dword ptr ds:[48D68C]  //ds:[48D68C]指向殼中,跟蹤原程式發現其作用是簡單的防脫殼校驗。
0040DD53  |.  E8 13F10500   call dumped_.0046CE6B  //無可疑

Od載入原程式

0040DD4D  |.  FF15 8CD64800 call dword ptr ds:[48D68C]

01221C08    55              push ebp   //F7跟進
01221C09    8BEC            mov ebpesp
01221C0B    53              push ebx
01221C0C    56              push esi
01221C0D    8B5D 0C         mov ebxdword ptr ss:[ebp+C]
01221C10    8B75 08         mov esidword ptr ss:[ebp+8]
01221C13    8BC3            mov eaxebx
01221C15    E8 F208FFFF     call 0121250C
01221C1A    A3 A4632201     mov dword ptr ds:[12263A4], eax
01221C1F    8B15 A4632201   mov edxdword ptr ds:[12263A4]
01221C25    8BC6            mov eaxesi
01221C27    8BCB            mov ecxebx
01221C29    E8 EA09FFFF     call 01212618
01221C2E    891D 347E2201   mov dword ptr ds:[1227E34], ebx
01221C34    53              push ebx
01221C35    8BCE            mov ecxesi
01221C37    8B15 307E2201   mov edxdword ptr ds:[1227E30]
01221C3D    A1 2C7E2201     mov eaxdword ptr ds:[1227E2C]
01221C42    E8 F9EEFFFF     call 01220B40
01221C47    833D E47A2201 0>cmp dword ptr ds:[1227AE4], 0
01221C4E    75 05           jnz short 01221C55
01221C50    E8 4FFFFFFF     call 01221BA4
01221C55    5E              pop esi
01221C56    5B              pop ebx
01221C57    5D              pop ebp
01221C58    C2 0800         retn 8  //跟進,暈,好多程式碼啊,殼是不可能搬回的,它進殼中的過程我們沒必有知道,但它從殼中取出程式碼動態修改程式領空程式碼我們脫殼後是需要的,可是這個也不是解碼Call。 

Ctrl+F 在程式空間裡查詢命令:retn 8   隨便找一個吧: 

命令列 DD 48D68C


把48D68C處的 01221C08 改為:00403B74 

複製到程式裡,儲存覆蓋檔案。

Ctrl+F2 重新載入,F9執行。

程式介面出來了,嘗試分割檔案立即出錯。

狀態列/提示記憶體寫錯誤。 

堆疊友好提示

0012ADB8   0041116A  返回到 dumped_.0041116A 來自 01221BA4
0012ADBC   0012B8E8
0012ADC0   0012B8E8
0012ADC4   0040FF02  返回到 dumped_.0040FF02 來自 dumped_.00411160
0012ADC8   0012B8E8
0012ADCC   00474A68  dumped_.00474A68

那麼Ctrl+G 去0041116A 看看

00411164   .  FF15 84D64800 call dword ptr ds:[48D684]  //這裡搞的飛機,ds:[48D684]指向殼中,跟蹤原程式發現其作用是動態解碼。
0041116A   .  E9 76000000   jmp dumped_.004111E5

Btw:用Winxp脫殼時這裡堆疊出錯沒有提示。

01224350    3100            xor dword ptr ds:[eax], eax  //只有再硬碟指紋過後的pre-dip中分析了。
01224352    EB 01           jmp short 01224355
01224354    68 648F0500     push 58F64
01224359    0000            add byte ptr ds:[eax], al
0122435B    00EB            add blch
0122435D    02E8            add chal
0122435F    0158 80         add dword ptr ds:[eax-80], ebx
01224362    3D A07E2201     cmp eax, 1227EA0
01224367    007414 E8       add byte ptr ss:[esp+edx-18], dh
0122436B    2D D2FFFF84     sub eax, 84FFFFD2
01224370    C0740B E8 F0    sal byte ptr ds:[ebx+ecx-18], 0F0
01224375    DEFF            fdivp st(7), st
01224377    FF84C0 740289EC inc dword ptr ds:[eax+eax*8+EC890274]
0122437E    B2 01           mov dl, 1
01224380    A1 140C2201     mov eaxdword ptr ds:[1220C14]
01224385    E8 06C9FFFF     call 01220C90
..........................................................

0012FF3C   0012FF44  指標到下一個 SEH 記錄
0012FF40   01224307  SE 控制程式碼
0012FF44   0012FFE0  指標到下一個 SEH 記錄
0012FF48   01224C49  SE 控制程式碼
0012FF4C   0012FF90
0012FF50   01210000
0012FF54   011F0000
0012FF58   01224138
0012FF5C   0123A318  ASCII "ARInMgCAUXY="

0040D490    8B4424 04       mov eaxdword ptr ss:[esp+4]
0040D494    A3 84D64800     mov dword ptr ds:[48D684], eax  //pre-dip4,校驗註冊碼,與硬碟指紋計算後生成一個密匙,在部分殼裡,會解壓N段程式碼起到防止脫殼的功能。
0040D499    C2 0400         retn 4
0040D49C    90              nop
0040D49D    90              nop
0040D49E    90              nop
0040D49F    90              nop
0040D4A0    8B4424 04       mov eaxdword ptr ss:[esp+4]
0040D4A4    A3 88D64800     mov dword ptr ds:[48D688], eax
0040D4A9    C2 0400         retn 4
0040D4AC    90              nop
0040D4AD    90              nop
0040D4AE    90              nop
0040D4AF    90              nop
0040D4B0    8B4424 04       mov eaxdword ptr ss:[esp+4]
0040D4B4    A3 8CD64800     mov dword ptr ds:[48D68C], eax

於是再脫殼程式,dd 48D684 下記憶體訪問斷點,分割時同樣斷在我們剛才錯誤的地方。
00411164    FF15 84D64800   call dword ptr ds:[48D684]  //原程式和脫殼程式錯誤地方。
0041116A    E9 76000000     jmp dumped_.004111E5
0041116F    C590 74E92A3B   lds edx, fword ptr ds:[eax+3B2AE974]
00411175    3E:46           inc esi
00411177    15 BD0C6586     adc eax, 86650CBD
0041117C    C7              ???                                      ; 未知命令
0041117D    6E              outs dxbyte ptr es:[edi]
0041117E    EB 01           jmp short dumped_.00411181
00411180    D5 C2           aad 0C2
00411182    D4 4A           aam 4A
00411184    D6              salc
00411185    45              inc ebp
00411186    18AA 3E4837A5   sbb byte ptr ds:[edx+A537483E], ch
0041118C    03DB            add ebxebx
0041118E    B8 68E13DED     mov eax, ED3DE168
00411193    DF29            fild qword ptr ds:[ecx]
00411195    ED              in eaxdx
00411196    FA              cli
00411197    A4              movs byte ptr es:[edi], byte ptr ds:[esi>
00411198    B2 DA           mov dl, 0DA
0041119A    8817            mov byte ptr ds:[edi], dl
0041119C    AB              stos dword ptr es:[edi]


01221BA4    833D A4632201 0>cmp dword ptr ds:[12263A4], 0  //跟進00411164
01221BAB    75 0D           jnz short 01221BBA
01221BAD    A1 407D2201     mov eaxdword ptr ds:[1227D40]
01221BB2    8B15 447D2201   mov edxdword ptr ds:[1227D44]
01221BB8    EB 0B           jmp short 01221BC5
01221BBA    A1 A4632201     mov eaxdword ptr ds:[12263A4]
01221BBF    8B15 347E2201   mov edxdword ptr ds:[1227E34]
01221BC5    85C0            test eaxeax
01221BC7    74 0B           je short 01221BD4
01221BC9    85D2            test edxedx
01221BCB    74 07           je short 01221BD4
01221BCD    52              push edx
01221BCE    50              push eax
01221BCF    E8 60FDFFFF     call 01221934
01221BD4    C3              retn   //具體什麼作用返回就知道是動態解碼用的。

00411164    FF15 84D64800   call dword ptr ds:[48D684]  
0041116A    E9 01000000     jmp VideoSpl.00411170    //解碼後跳轉的位置都不一樣,早就計劃好了的。
0041116F    FD              std
00411170    8D4424 04       lea eaxdword ptr ss:[esp+4]
00411174    50              push eax
00411175    6A 04           push 4
00411177    56              push esi
00411178    68 A0FC4000     push VideoSpl.0040FCA0
0041117D    6A 00           push 0
0041117F    6A 00           push 0
00411181    FF15 5C334700   call dword ptr ds:[47335C]
00411187    85C0            test eaxeax
00411189    8986 D0450000   mov dword ptr ds:[esi+45D0], eax
0041118F    74 4E           je short VideoSpl.004111DF
00411191    6A 01           push 1
00411193    8D8E 64290000   lea ecxdword ptr ds:[esi+2964]
00411199    C786 E0450000 0>mov dword ptr ds:[esi+45E0], 0
004111A3    E8 5E250500     call VideoSpl.00463706
004111A8    6A 00           push 0
004111AA    8D8E 582E0000   lea ecxdword ptr ds:[esi+2E58]
004111B0    E8 51250500     call VideoSpl.00463706
004111B5    8B8E 68330000   mov ecxdword ptr ds:[esi+3368]
004111BB    6A 00           push 0
004111BD    6A 00           push 0
004111BF    68 02040000     push 402
004111C4    51              push ecx
004111C5    FF15 28364700   call dword ptr ds:[473628]               ; USER32.SendMessageA
004111CB    8BCE            mov ecxesi
004111CD    E8 5EF9FFFF     call VideoSpl.00410B30
004111D2    8B96 D0450000   mov edxdword ptr ds:[esi+45D0]
004111D8    52              push edx
004111D9    FF15 60334700   call dword ptr ds:[473360]
004111DF    EB 04           jmp short VideoSpl.004111E5     
004111E1    F9              stc
004111E2    BA C5305E83     mov edx, 835E30C5
004111E7    C404FF          les eax, fword ptr ds:[edi+edi*8]
004111EA    25 88D64800     and eax, 48D688
004111EF    90              nop
004111F0    56              push esi
004111F1    8BF1            mov esiecx
004111F3    E8 45A50500     call VideoSpl.0046B73D
004111F8    F64424 08 01    test byte ptr ss:[esp+8], 1
004111FD    74 09           je short VideoSpl.00411208
004111FF    56              push esi
00411200    E8 A4ED0400     call VideoSpl.0045FFA9
00411205    83C4 04         add esp, 4
00411208    8BC6            mov eaxesi
0041120A    5E              pop esi
0041120B    C2 0400         retn 4      //為了不漏掉解碼程式碼也不多動腦筋,從0041116A到這個Call全部二程式複製。

二進位制貼上到脫殼程式的相應位置。

然後還是從程式裡找一個

0040102B   .  C3            retn



00411164    FF15 84D64800   call dword ptr ds:[48D684] 

模擬解碼。

命令列DD 48D684

修改01221BA4 為  0040102B 

複製所以修改到程式裡面,儲存為一個檔案,Ctrl+F2重新載入測試功能。

執行時仍然出錯,繼續找原因。

004111D9   .  FF15 60334700 call dword ptr ds:[<&kernel32.ResumeThre>; ResumeThread
004111DF   >  EB 04         jmp short dumped_.004111E5   
004111E1      F9            db F9
004111E2      BA            db BA
004111E3   .  C530          lds esi, fword ptr ds:[eax]
004111E5   >  5E            pop esi
004111E6   .  83C4 04       add esp, 4
004111E9   .- FF25 88D64800 jmp dword ptr ds:[48D688] //剛才複製的程式碼這裡指向殼中。

01221BD8    833D A4632201 0>cmp dword ptr ds:[12263A4], 0  //跟進
01221BDF    75 0D           jnz short 01221BEE
01221BE1    A1 407D2201     mov eaxdword ptr ds:[1227D40]
01221BE6    8B15 447D2201   mov edxdword ptr ds:[1227D44]
01221BEC    EB 0B           jmp short 01221BF9
01221BEE    A1 A4632201     mov eaxdword ptr ds:[12263A4]
01221BF3    8B15 347E2201   mov edxdword ptr ds:[1227E34]
01221BF9    85C0            test eaxeax
01221BFB    74 09           je short 01221C06
01221BFD    85D2            test edxedx
01221BFF    74 05           je short 01221C06
01221C01    E8 A6FDFFFF     call 012219AC
01221C06    C3              retn  //還是一個retn返回程式,簡單的驗證是否脫殼。

於是簡單應付它

004111E9    - FF25 88D64800 jmp dword ptr ds:[48D688]
004111EF      90            nop

改為

004111E9      C3            retn
004111EA      90            nop
004111EB      90            nop
004111EC      90            nop
004111ED      90            nop
004111EE      90            nop
004111EF      90            nop

儲存最後的修改,所以暗樁清除,成功分割檔案。

破解分析參考我的  AVI MPEG RM WMV Joiner4.11脫殼+破解,過程查不多。

0040DED8  |.  E8 53D5FFFF   call dumped_.0040B430
0040DEDD  |.  8B5424 30     mov edxdword ptr ss:[esp+30]
0040DEE1  |.  8B4C24 2C     mov ecxdword ptr ss:[esp+2C]
0040DEE5  |.  8B4424 28     mov eaxdword ptr ss:[esp+28]
0040DEE9  |.  33D1          xor edxecx
0040DEEB  |.  83C4 14       add esp, 14
0040DEEE  |.  3BC2          cmp eaxedx
0040DEF0  |.  75 0A         jnz short dumped_.0040DEFC            //爆破點,jz short 0040DEFC
0040DEF2  |.  C786 00460000>mov dword ptr ds:[esi+4600], 1       //全域性標誌位賦值。
0040DEFC  |>  39AE 00460000 cmp dword ptr ds:[esi+4600], ebp
0040DF02  |.  75 10         jnz short dumped_.0040DF14

這樣改法,執行分割時功能被Nop掉了,暈。

只好將

0040E8BC      8B86 00460000 mov eaxdword ptr ds:[esi+4600]

改為

0040E8BC   .  8986 00460000 mov dword ptr ds:[esi+4600], eax

RVA=0000E8BC處為
8B――  未註冊版
89――  註冊版

沒時間仔細看,這個程式的變態度比它的兩個兄長

ASF-AVI-RM-WMV Repair V1.41 

AVI MPEG RM WMV Joiner4.61

差多了。

相關文章