mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。
这里更改的部分是stsz box,它存放了mp4文件中的各个sample的大小
Mp4文件格式参考:http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html
对于样本来说,关键结构如下:
更改完成后打开,程序崩溃。
===========================================================
VERIFIER STOP 00000004: pid 0xD70: extreme size request
01E40000 : Heap handle
EFFFFFFF : Size requested
00000000 :
00000000 :
===========================================================
(d70.e38): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=efffffff ecx=7c93eb05 edx=190bf504 esi=00000004 edi=01e40000
eip=7c921230 esp=190bf738 ebp=190bf74c iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
7c921230 cc int 3
0:028> kbn
# ChildEBP RetAddr Args to Child
00 190bf734 7c9751ad efffffff 01e40000 01e40000 ntdll!DbgBreakPoint
01 190bf74c 7c98a48c 00000004 7c98a764 01e40000 ntdll!RtlApplicationVerifierStop+0x160
02 190bf7c8 7c98d628 01e40000 01001002 efffffff ntdll!RtlpDebugPageHeapAllocate+0x43
03 190bf84c 7c969d18 01e40000 01001002 efffffff ntdll!RtlDebugAllocateHeap+0x2d
04 190bfa7c 7c93b298 01e40000 01001002 efffffff ntdll!RtlAllocateHeapSlowly+0x44
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\System32\verifier.dll -
05 190bfcb0 5ad5230b 01e40000 01001002 efffffff ntdll!RtlAllocateHeap+0xe64
*** ERROR: Module load completed but symbols could not be loaded for C:\PROGRA~1\Baofeng\STORMP~1\Core\Codecs\mfc100u.dll
WARNING: Stack unwind information not available. Following frames may be wrong.
06 190bfce4 786ab327 efffffff efffffff 190bfdc0 verifier+0x230b
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\PROGRA~1\Baofeng\STORMP~1\Core\Codecs\MP4Splitter.ax -
07 190bfcfc 0c77da1c efffffff efffffff 190bfdc0 mfc100u+0xbb327
08 00000000 00000000 00000000 00000000 00000000 MP4Splitter!DllRegisterServer+0x8aec
0:028> u MP4Splitter!DllRegisterServer+0x8aec L-10
MP4Splitter!DllRegisterServer+0x8adc:
0c77da0c 085e83 or byte ptr [esi-7Dh],bl
0c77da0f c8ff5bc2 enter 5BFFh,0C2h
0c77da13 0400 add al,0
0c77da15 57 push edi;
0c77da16 53 push ebx ;size参数
0c77da17 e8a6980100 call MP4Splitter!DllGetClassObject+0x9a62 (0c7972c2)
ebx为new操作所需的size。在sub_68ADA00中只对ebx进行了下限(是否大于0)检查,而没有进行上限检查导致后面ebx传递到new时发生异常。
默认new不会返回0,而是会抛出异常std::bad_alloc。所以在上面那段程序中,如果size过大,比如7fffffff,则会造成系统抛出异常,而程序没能捕获,造成拒绝服务。
如果适当增加size大小而不超过系统所允许的数值,则在播放过程中会增加内存消耗。
而且在free的过程中可能还是会出现问题的,没有再深入分析了。
没法上传附件,厂商可以自己构造一下验证。我在新版本中还是能够成功的。
修复方案:
程序没有对new失败抛出的exception进行catch。