2010年01月05日
HDCP解除について(1)
私はDELL 3008WFPというモニターを利用しているのですが
これは最大解像度時にHDCPが効かない、すなわち地デジが視聴できないという悲惨な仕様です。
3008WFPを買った時には地デジなんか見ないからいいやと思っていましたが、やはり慾は出てくるもので
なんとかしようと思ったしだいです。
普通ならばPT2を買うか新しいモニターを買うか2択ですが、それでは面白くないということで
市販の地デジチューナーを買って意地でも表示させてみましょう。
とりあえず新製品っぽいGV-MVP/HZ3を買ってきましたので、これで試してみます。
ちなみにチェックソフトの結果はこんな感じ
まず、HDCP対応なのかどうかをチェックする部分を特定します。
チェック方法は製品でも地デジチェッカー(mtvChecker_h3.exe)でも同じだと思われるので
プログラム規模が小さい地デジチェッカーを解析してみます。
使うツールはOllyDbg+OllyHelperのみ、必要な情報はググる方向で・・・
なにも考えずOllyでmtvChecker_h3.exeをrunするとDebugログが出ているようです。
これは良い解析の足がかりになります。
解析に使うmtvChecker_h3.exeはVer3.2.0.0です。
HDCP失敗時のログ

HDCP成功時のログ

違いがわかりますでしょうか?
成功時と同じログが出るようにする方法を解析すれば行けそうなきがしますね。
でもってログを元にトレースしますと
1個目のチェックは
0040D2A4 |. 52 PUSH EDX ; /Arg5
0040D2A5 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
0040D2A9 |. 894C24 2C MOV DWORD PTR SS:[ESP+2C],ECX ; |
0040D2AD |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14] ; |
0040D2B1 |. 50 PUSH EAX ; |Arg4
0040D2B2 |. 894C24 34 MOV DWORD PTR SS:[ESP+34],ECX ; |
0040D2B6 |. 6A 04 PUSH 4 ; |Arg3 = 00000004
0040D2B8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; |
0040D2BC |. 51 PUSH ECX ; |Arg2
0040D2BD |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40] ; |
0040D2C1 |. 52 PUSH EDX ; |Arg1
0040D2C2 |. C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1 ; |
0040D2CA |. C74424 24 0000>MOV DWORD PTR SS:[ESP+24],0 ; |
0040D2D2 |. C74424 20 2000>MOV DWORD PTR SS:[ESP+20],20 ; |
0040D2DA |. E8 01F3FFFF CALL mtvCheck.0040C5E0 ; HDCPチェック1
0040D2DF |. 83C4 14 ADD ESP,14
0040D2E2 |. 85C0 TEST EAX,EAX
0040D2E4 |. 7C 51 JL SHORT mtvCheck.0040D337
0040D2E6 |. 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; [ESP+24]の値が1であるならHDCPが有効
0040D2EA |. 50 PUSH EAX
0040D2EB |. 68 B40F4400 PUSH mtvCheck.00440FB4
0040D2F0 |. E8 1BEDFFFF CALL mtvCheck.0040C010
0040D2F5 |. 8B4424 2C MOV EAX,DWORD PTR SS:[ESP+2C]
0040D2F9 |. 83C4 08 ADD ESP,8
0040D2FC |. 83E8 00 SUB EAX,0 ; Switch (cases 0..1)
0040D2FF |. 74 0A JE SHORT mtvCheck.0040D30B
0040D301 |. 48 DEC EAX
0040D302 |. 75 14 JNZ SHORT mtvCheck.0040D318
0040D304 |. 68 7C0D4400 PUSH mtvCheck.00440D7C ; ASCII "COPP_HDCP_Level1"; Case 1 of switch 0040D2FC
0040D309 |. EB 05 JMP SHORT mtvCheck.0040D310
0040D30B |> 68 680D4400 PUSH mtvCheck.00440D68 ; ASCII "COPP_HDCP_Level0"; Case 0 of switch 0040D2FC
0040D310 |> E8 FBECFFFF CALL mtvCheck.0040C010
2個目のチェックは
0040D194 |. 52 PUSH EDX ; /Arg5
0040D195 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
0040D199 |. 894C24 2C MOV DWORD PTR SS:[ESP+2C],ECX ; |
0040D19D |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14] ; |
0040D1A1 |. 50 PUSH EAX ; |Arg4
0040D1A2 |. 894C24 34 MOV DWORD PTR SS:[ESP+34],ECX ; |
0040D1A6 |. 6A 04 PUSH 4 ; |Arg3 = 00000004
0040D1A8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; |
0040D1AC |. 51 PUSH ECX ; |Arg2
0040D1AD |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40] ; |
0040D1B1 |. 52 PUSH EDX ; |Arg1
0040D1B2 |. C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1 ; |
0040D1BA |. C74424 24 0000>MOV DWORD PTR SS:[ESP+24],0 ; |
0040D1C2 |. C74424 20 2000>MOV DWORD PTR SS:[ESP+20],20 ; |
0040D1CA |. E8 11F4FFFF CALL mtvCheck.0040C5E0 ; HDCPチェック2
0040D1CF |. 83C4 14 ADD ESP,14
0040D1D2 |. 85C0 TEST EAX,EAX
0040D1D4 |. 7C 51 JL SHORT mtvCheck.0040D227
0040D1D6 |. 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; [ESP+24]の値が1であるならHDCPが有効
0040D1DA |. 50 PUSH EAX
0040D1DB |. 68 840F4400 PUSH mtvCheck.00440F84
0040D1E0 |. E8 2BEEFFFF CALL mtvCheck.0040C010
0040D1E5 |. 8B4424 2C MOV EAX,DWORD PTR SS:[ESP+2C]
0040D1E9 |. 83C4 08 ADD ESP,8
0040D1EC |. 83E8 00 SUB EAX,0 ; Switch (cases 0..1)
0040D1EF |. 74 0A JE SHORT mtvCheck.0040D1FB
0040D1F1 |. 48 DEC EAX
0040D1F2 |. 75 14 JNZ SHORT mtvCheck.0040D208
0040D1F4 |. 68 7C0D4400 PUSH mtvCheck.00440D7C ; ASCII "COPP_HDCP_Level1"; Case 1 of switch 0040D1EC
0040D1F9 |. EB 05 JMP SHORT mtvCheck.0040D200
0040D1FB |> 68 680D4400 PUSH mtvCheck.00440D68 ; ASCII "COPP_HDCP_Level0"; Case 0 of switch 0040D1EC
0040D200 |> E8 0BEEFFFF CALL mtvCheck.0040C010
となります。
チェックルーチンCALL mtvCheck.0040C5E0 の中身の解析は次回
チェック方法は製品でも地デジチェッカー(mtvChecker_h3.exe)でも同じだと思われるので
プログラム規模が小さい地デジチェッカーを解析してみます。
使うツールはOllyDbg+OllyHelperのみ、必要な情報はググる方向で・・・
なにも考えずOllyでmtvChecker_h3.exeをrunするとDebugログが出ているようです。
これは良い解析の足がかりになります。
解析に使うmtvChecker_h3.exeはVer3.2.0.0です。
HDCP失敗時のログ
HDCP成功時のログ
違いがわかりますでしょうか?
成功時と同じログが出るようにする方法を解析すれば行けそうなきがしますね。
でもってログを元にトレースしますと
1個目のチェックは
0040D2A4 |. 52 PUSH EDX ; /Arg5
0040D2A5 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
0040D2A9 |. 894C24 2C MOV DWORD PTR SS:[ESP+2C],ECX ; |
0040D2AD |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14] ; |
0040D2B1 |. 50 PUSH EAX ; |Arg4
0040D2B2 |. 894C24 34 MOV DWORD PTR SS:[ESP+34],ECX ; |
0040D2B6 |. 6A 04 PUSH 4 ; |Arg3 = 00000004
0040D2B8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; |
0040D2BC |. 51 PUSH ECX ; |Arg2
0040D2BD |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40] ; |
0040D2C1 |. 52 PUSH EDX ; |Arg1
0040D2C2 |. C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1 ; |
0040D2CA |. C74424 24 0000>MOV DWORD PTR SS:[ESP+24],0 ; |
0040D2D2 |. C74424 20 2000>MOV DWORD PTR SS:[ESP+20],20 ; |
0040D2DA |. E8 01F3FFFF CALL mtvCheck.0040C5E0 ; HDCPチェック1
0040D2DF |. 83C4 14 ADD ESP,14
0040D2E2 |. 85C0 TEST EAX,EAX
0040D2E4 |. 7C 51 JL SHORT mtvCheck.0040D337
0040D2E6 |. 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; [ESP+24]の値が1であるならHDCPが有効
0040D2EA |. 50 PUSH EAX
0040D2EB |. 68 B40F4400 PUSH mtvCheck.00440FB4
0040D2F0 |. E8 1BEDFFFF CALL mtvCheck.0040C010
0040D2F5 |. 8B4424 2C MOV EAX,DWORD PTR SS:[ESP+2C]
0040D2F9 |. 83C4 08 ADD ESP,8
0040D2FC |. 83E8 00 SUB EAX,0 ; Switch (cases 0..1)
0040D2FF |. 74 0A JE SHORT mtvCheck.0040D30B
0040D301 |. 48 DEC EAX
0040D302 |. 75 14 JNZ SHORT mtvCheck.0040D318
0040D304 |. 68 7C0D4400 PUSH mtvCheck.00440D7C ; ASCII "COPP_HDCP_Level1"; Case 1 of switch 0040D2FC
0040D309 |. EB 05 JMP SHORT mtvCheck.0040D310
0040D30B |> 68 680D4400 PUSH mtvCheck.00440D68 ; ASCII "COPP_HDCP_Level0"; Case 0 of switch 0040D2FC
0040D310 |> E8 FBECFFFF CALL mtvCheck.0040C010
2個目のチェックは
0040D194 |. 52 PUSH EDX ; /Arg5
0040D195 |. 894424 40 MOV DWORD PTR SS:[ESP+40],EAX ; |
0040D199 |. 894C24 2C MOV DWORD PTR SS:[ESP+2C],ECX ; |
0040D19D |. 8D4424 14 LEA EAX,DWORD PTR SS:[ESP+14] ; |
0040D1A1 |. 50 PUSH EAX ; |Arg4
0040D1A2 |. 894C24 34 MOV DWORD PTR SS:[ESP+34],ECX ; |
0040D1A6 |. 6A 04 PUSH 4 ; |Arg3 = 00000004
0040D1A8 |. 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14] ; |
0040D1AC |. 51 PUSH ECX ; |Arg2
0040D1AD |. 8D5424 40 LEA EDX,DWORD PTR SS:[ESP+40] ; |
0040D1B1 |. 52 PUSH EDX ; |Arg1
0040D1B2 |. C74424 1C 0100>MOV DWORD PTR SS:[ESP+1C],1 ; |
0040D1BA |. C74424 24 0000>MOV DWORD PTR SS:[ESP+24],0 ; |
0040D1C2 |. C74424 20 2000>MOV DWORD PTR SS:[ESP+20],20 ; |
0040D1CA |. E8 11F4FFFF CALL mtvCheck.0040C5E0 ; HDCPチェック2
0040D1CF |. 83C4 14 ADD ESP,14
0040D1D2 |. 85C0 TEST EAX,EAX
0040D1D4 |. 7C 51 JL SHORT mtvCheck.0040D227
0040D1D6 |. 8B4424 24 MOV EAX,DWORD PTR SS:[ESP+24] ; [ESP+24]の値が1であるならHDCPが有効
0040D1DA |. 50 PUSH EAX
0040D1DB |. 68 840F4400 PUSH mtvCheck.00440F84
0040D1E0 |. E8 2BEEFFFF CALL mtvCheck.0040C010
0040D1E5 |. 8B4424 2C MOV EAX,DWORD PTR SS:[ESP+2C]
0040D1E9 |. 83C4 08 ADD ESP,8
0040D1EC |. 83E8 00 SUB EAX,0 ; Switch (cases 0..1)
0040D1EF |. 74 0A JE SHORT mtvCheck.0040D1FB
0040D1F1 |. 48 DEC EAX
0040D1F2 |. 75 14 JNZ SHORT mtvCheck.0040D208
0040D1F4 |. 68 7C0D4400 PUSH mtvCheck.00440D7C ; ASCII "COPP_HDCP_Level1"; Case 1 of switch 0040D1EC
0040D1F9 |. EB 05 JMP SHORT mtvCheck.0040D200
0040D1FB |> 68 680D4400 PUSH mtvCheck.00440D68 ; ASCII "COPP_HDCP_Level0"; Case 0 of switch 0040D1EC
0040D200 |> E8 0BEEFFFF CALL mtvCheck.0040C010
となります。
チェックルーチンCALL mtvCheck.0040C5E0 の中身の解析は次回
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。