xs4all:Absolutely not. That's why we need to add more validation code that decides when to modify the year bits. asm495 did a great work by finding that the 5D loop (the loop that regenerate the code that compare the year to 2008) is called twice when using regsvr32. However, it's very much possible that Media Center uses that same loop for other code generation. To know it for sure, we will have to debug Media Center and find out when the loop is called.
With my Dll, is media center crashing as soon as it starts or only when trying to tune an H.264 channel?
There are 3 main loops I've discovered which call the same 3 sub-loops (using different data).
The 3 sub-loops do the following:
1. Copying 1000h worth of data from one location to another:
CPU Disasm
Address Hex dump Command Comments
6ECF45FE |> /8B3402 /MOV ESI,DWORD PTR DS:[EAX+EDX]
6ECF4601 |. |8930 |MOV DWORD PTR DS:[EAX],ESI
6ECF4603 |. |83C0 04 |ADD EAX,4
6ECF4606 |. |83E9 01 |SUB ECX,1
6ECF4609 |.^\75 F3 \JNE SHORT 6ECF45FE
2. Taking data from the original DLL and putting it through a complex set of conversions to end up with new code (on the 3rd time this loop is reached is when the date piece of code is created). This new code is created at some area in the 1000h of data created in 1.
CPU Disasm
Address Hex dump Command Comments
6ECF4944 |> /F645 D0 01 /TEST BYTE PTR SS:[EBP-30],01
6ECF4948 |. |8A07 |MOV AL,BYTE PTR DS:[EDI]
6ECF494A |. |0F84 92000000 |JE 6ECF49E2
6ECF4950 |. |8A4D E3 |MOV CL,BYTE PTR SS:[EBP-1D]
6ECF4953 |. |8AD9 |MOV BL,CL
6ECF4955 |. |32D8 |XOR BL,AL
6ECF4957 |. |80E3 01 |AND BL,01
6ECF495A |. |0FB6D1 |MOVZX EDX,CL
6ECF495D |. |0FB6C0 |MOVZX EAX,AL
6ECF4960 |. |74 1A |JE SHORT 6ECF497C
6ECF4962 |. |0FB64D E2 |MOVZX ECX,BYTE PTR SS:[EBP-1E]
6ECF4966 |. |8BF2 |MOV ESI,EDX
6ECF4968 |. |D1EE |SHR ESI,1
6ECF496A |. |D1E9 |SHR ECX,1
6ECF496C |. |33CE |XOR ECX,ESI
6ECF496E |. |8BF0 |MOV ESI,EAX
6ECF4970 |. |81F6 00010000 |XOR ESI,00000100
6ECF4976 |. |D1FE |SAR ESI,1
6ECF4978 |. |33CE |XOR ECX,ESI
6ECF497A |. |EB 06 |JMP SHORT 6ECF4982
6ECF497C |> |8BC8 |MOV ECX,EAX
6ECF497E |. |33CA |XOR ECX,EDX
6ECF4980 |. |D1E9 |SHR ECX,1
6ECF4982 |> |0FB677 FF |MOVZX ESI,BYTE PTR DS:[EDI-1]
6ECF4986 |. |33CE |XOR ECX,ESI
6ECF4988 |. |F6C1 01 |TEST CL,01
6ECF498B |. |74 35 |JE SHORT 6ECF49C2
6ECF498D |. |84DB |TEST BL,BL
6ECF498F |. |74 15 |JE SHORT 6ECF49A6
6ECF4991 |. |0FB64D E2 |MOVZX ECX,BYTE PTR SS:[EBP-1E]
6ECF4995 |. |D1E9 |SHR ECX,1
6ECF4997 |. |D1EA |SHR EDX,1
6ECF4999 |. |35 00010000 |XOR EAX,00000100
6ECF499E |. |33CA |XOR ECX,EDX
6ECF49A0 |. |D1F8 |SAR EAX,1
6ECF49A2 |. |33C8 |XOR ECX,EAX
6ECF49A4 |. |EB 06 |JMP SHORT 6ECF49AC
6ECF49A6 |> |33C2 |XOR EAX,EDX
6ECF49A8 |. |D1E8 |SHR EAX,1
6ECF49AA |. |8BC8 |MOV ECX,EAX
6ECF49AC |> |0FB645 E5 |MOVZX EAX,BYTE PTR SS:[EBP-1B]
6ECF49B0 |. |D1E8 |SHR EAX,1
6ECF49B2 |. |33CE |XOR ECX,ESI
6ECF49B4 |. |35 80000000 |XOR EAX,00000080
6ECF49B9 |. |D1F9 |SAR ECX,1
6ECF49BB |. |33C1 |XOR EAX,ECX
6ECF49BD |. |E9 B3000000 |JMP 6ECF4A75
6ECF49C2 |> |84DB |TEST BL,BL
6ECF49C4 |. |0F84 9F000000 |JE 6ECF4A69
6ECF49CA |. |0FB64D E2 |MOVZX ECX,BYTE PTR SS:[EBP-1E]
6ECF49CE |. |D1E9 |SHR ECX,1
6ECF49D0 |. |D1EA |SHR EDX,1
6ECF49D2 |. |35 00010000 |XOR EAX,00000100
6ECF49D7 |. |33CA |XOR ECX,EDX
6ECF49D9 |. |D1F8 |SAR EAX,1
6ECF49DB |. |33C8 |XOR ECX,EAX
6ECF49DD |. |E9 8D000000 |JMP 6ECF4A6F
6ECF49E2 |> |8A5D E1 |MOV BL,BYTE PTR SS:[EBP-1F]
6ECF49E5 |. |0FB655 E1 |MOVZX EDX,BYTE PTR SS:[EBP-1F]
6ECF49E9 |. |32D8 |XOR BL,AL
6ECF49EB |. |80E3 01 |AND BL,01
6ECF49EE |. |0FB6C0 |MOVZX EAX,AL
6ECF49F1 |. |74 1A |JE SHORT 6ECF4A0D
6ECF49F3 |. |0FB64D E0 |MOVZX ECX,BYTE PTR SS:[EBP-20]
6ECF49F7 |. |8BF2 |MOV ESI,EDX
6ECF49F9 |. |D1EE |SHR ESI,1
6ECF49FB |. |D1E9 |SHR ECX,1
6ECF49FD |. |33CE |XOR ECX,ESI
6ECF49FF |. |8BF0 |MOV ESI,EAX
6ECF4A01 |. |81F6 00010000 |XOR ESI,00000100
6ECF4A07 |. |D1FE |SAR ESI,1
6ECF4A09 |. |33CE |XOR ECX,ESI
6ECF4A0B |. |EB 06 |JMP SHORT 6ECF4A13
6ECF4A0D |> |8BC8 |MOV ECX,EAX
6ECF4A0F |. |33CA |XOR ECX,EDX
6ECF4A11 |. |D1E9 |SHR ECX,1
6ECF4A13 |> |0FB677 FF |MOVZX ESI,BYTE PTR DS:[EDI-1]
6ECF4A17 |. |33CE |XOR ECX,ESI
6ECF4A19 |. |F6C1 01 |TEST CL,01
6ECF4A1C |. |74 32 |JE SHORT 6ECF4A50
6ECF4A1E |. |84DB |TEST BL,BL
6ECF4A20 |. |74 15 |JE SHORT 6ECF4A37
6ECF4A22 |. |0FB64D E0 |MOVZX ECX,BYTE PTR SS:[EBP-20]
6ECF4A26 |. |D1E9 |SHR ECX,1
6ECF4A28 |. |D1EA |SHR EDX,1
6ECF4A2A |. |35 00010000 |XOR EAX,00000100
6ECF4A2F |. |33CA |XOR ECX,EDX
6ECF4A31 |. |D1F8 |SAR EAX,1
6ECF4A33 |. |33C8 |XOR ECX,EAX
6ECF4A35 |. |EB 06 |JMP SHORT 6ECF4A3D
6ECF4A37 |> |33C2 |XOR EAX,EDX
6ECF4A39 |. |D1E8 |SHR EAX,1
6ECF4A3B |. |8BC8 |MOV ECX,EAX
6ECF4A3D |> |0FB645 E4 |MOVZX EAX,BYTE PTR SS:[EBP-1C]
6ECF4A41 |. |D1E8 |SHR EAX,1
6ECF4A43 |. |33CE |XOR ECX,ESI
6ECF4A45 |. |35 80000000 |XOR EAX,00000080
6ECF4A4A |. |D1F9 |SAR ECX,1
6ECF4A4C |. |33C1 |XOR EAX,ECX
6ECF4A4E |. |EB 25 |JMP SHORT 6ECF4A75
6ECF4A50 |> |84DB |TEST BL,BL
6ECF4A52 |. |74 15 |JE SHORT 6ECF4A69
6ECF4A54 |. |0FB64D E0 |MOVZX ECX,BYTE PTR SS:[EBP-20]
6ECF4A58 |. |D1E9 |SHR ECX,1
6ECF4A5A |. |D1EA |SHR EDX,1
6ECF4A5C |. |35 00010000 |XOR EAX,00000100
6ECF4A61 |. |33CA |XOR ECX,EDX
6ECF4A63 |. |D1F8 |SAR EAX,1
6ECF4A65 |. |33C8 |XOR ECX,EAX
6ECF4A67 |. |EB 06 |JMP SHORT 6ECF4A6F
6ECF4A69 |> |33C2 |XOR EAX,EDX
6ECF4A6B |. |D1E8 |SHR EAX,1
6ECF4A6D |. |8BC8 |MOV ECX,EAX
6ECF4A6F |> |33CE |XOR ECX,ESI
6ECF4A71 |. |D1F9 |SAR ECX,1
6ECF4A73 |. |8BC1 |MOV EAX,ECX
6ECF4A75 |> |8B55 C0 |MOV EDX,DWORD PTR SS:[EBP-40]
6ECF4A78 |. |3045 EB |XOR BYTE PTR SS:[EBP-15],AL
6ECF4A7B |. |88043A |MOV BYTE PTR DS:[EDI+EDX],AL
6ECF4A7E |. |8B45 D0 |MOV EAX,DWORD PTR SS:[EBP-30]
6ECF4A81 |. |83E8 01 |SUB EAX,1
6ECF4A84 |. |83EF 01 |SUB EDI,1
6ECF4A87 |. |85C0 |TEST EAX,EAX
6ECF4A89 |. |8945 D0 |MOV DWORD PTR SS:[EBP-30],EAX
6ECF4A8C |.^\0F87 B2FEFFFF \JA 6ECF4944
3. Not really sure what this loop does as I've not investigated it because it did not seem to have anything to do with the date issue. Again this modifies the data created in 1.
CPU Disasm
Address Hex dump Command Comments
6ECF4B8C |> /8B04BD D860C8 /MOV EAX,DWORD PTR DS:[EDI*4+6EC860D8]
6ECF4B93 |. |8BF0 |MOV ESI,EAX
6ECF4B95 |. |81E6 FFFFFF0F |AND ESI,0FFFFFFF
6ECF4B9B |. |3B75 C0 |CMP ESI,DWORD PTR SS:[EBP-40]
6ECF4B9E |. |73 4A |JNB SHORT 6ECF4BEA
6ECF4BA0 |. |8BC8 |MOV ECX,EAX
6ECF4BA2 |. |03C0 |ADD EAX,EAX
6ECF4BA4 |. |03C0 |ADD EAX,EAX
6ECF4BA6 |. |C1F8 1E |SAR EAX,1E
6ECF4BA9 |. |C1F9 1E |SAR ECX,1E
6ECF4BAC |. |83E0 03 |AND EAX,00000003 ; Switch (cases 0..3, 4 exits)
6ECF4BAF |. |83E1 03 |AND ECX,00000003
6ECF4BB2 |. |33D2 |XOR EDX,EDX
6ECF4BB4 |. |83E8 01 |SUB EAX,1
6ECF4BB7 |. |74 14 |JE SHORT 6ECF4BCD
6ECF4BB9 |. |83E8 01 |SUB EAX,1
6ECF4BBC |. |74 0A |JE SHORT 6ECF4BC8
6ECF4BBE |. |83E8 01 |SUB EAX,1
6ECF4BC1 |. |75 10 |JNE SHORT 6ECF4BD3
6ECF4BC3 |. |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24] ; Case 3 of switch MSDTVVDEC.6ECF4BAC
6ECF4BC6 |. |EB 0B |JMP SHORT 6ECF4BD3
6ECF4BC8 |> |8B55 CC |MOV EDX,DWORD PTR SS:[EBP-34] ; Case 2 of switch MSDTVVDEC.6ECF4BAC
6ECF4BCB |. |EB 06 |JMP SHORT 6ECF4BD3
6ECF4BCD |> |8B55 DC |MOV EDX,DWORD PTR SS:[EBP-24] ; Case 1 of switch MSDTVVDEC.6ECF4BAC
6ECF4BD0 |. |2B55 CC |SUB EDX,DWORD PTR SS:[EBP-34]
6ECF4BD3 |> |83E9 02 |SUB ECX,2 ; Case 0 of switch MSDTVVDEC.6ECF4BAC
6ECF4BD6 |. |75 07 |JNE SHORT 6ECF4BDF
6ECF4BD8 |. |019433 0000C8 |ADD DWORD PTR DS:[ESI+EBX+6ECF4BDF |> |83C7 01 |ADD EDI,1
6ECF4BE2 |. |3B3D D460C86E |CMP EDI,DWORD PTR DS:[6EC860D4]
6ECF4BE8 |.^\72 A2 \JB SHORT 6ECF4B8C
I don't think the problem is with this at all though. I think there is something else going on when decoding needs to happen - maybe another date check there.