• 标 题:VideoSplitter V2.31 脱壳去暗桩+完美爆破
  • 作 者:David
  • 时 间:2004年4月04日 11:54
  • 链 接:http://bbs.pediy.com

【脱文标题】 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

差多了。