XP と 2000の CRYPT32.DLL の違いの解析

こちらは Windows 2000の Crypt32.dll

 SUB_L79B0C9F9:
          call    SUB_L79B11BF1
          call    SUB_L79AA8C97
          push    [esp+04h]
          test    eax,eax
          push    00000000h
          jz     L79B0CA1B
          push    SSZ79AA7134__PIPE_ntsvcs
          push    00000000h
          push    SSZ79AA7128_ncacn_np
          jmp    L79B0CA27
 L79B0CA1B:
          push    SSZ79AA7114__protected_storage
          push    00000000h
          push    SSZ79AA710C_ncalrpc
 L79B0CA27:
          push    00000000h
          call    [RPCRT4.dll!RpcStringBindingComposeA]
          test    eax,eax
          jnz    L79B0CA43
          push    [esp+08h]
          mov    eax,[esp+08h]
          push    [eax]
          call    [RPCRT4.dll!RpcBindingFromStringBindingA]
 L79B0CA43:
          retn    0008h

ProtectedStorage サービスを呼び出して成功した場合 サービス内の ncalrpc というサービスを呼び出しているっぽい。
失敗したら、 PIPE\ntsvcs から ncacn_np が呼ばれている。

 L76640CF1:
          push    edi
          push    L766483D0
          push    SWC76640DF8_CryptSvc
          call    SUB_L76642927
          lea    eax,[ebp-28h]
          push    eax
          push    edi
          push    SSZ76640DF0_keysvc
          push    edi
          push    SSZ76640DE8_ncalrpc
          push    edi
          call    [RPCRT4.dll!RpcStringBindingComposeA]
          cmp    eax,edi
          jnz    L76640D2D
          lea    eax,[ebp-24h]
          push    eax
          push    [ebp-28h]
          call    [RPCRT4.dll!RpcBindingFromStringBindingA]
          cmp    eax,edi
          jz     L76640D30
 L76640D2D:
          push    eax
          jmp    L76640DA7
 L76640D30:
          mov    [ebp-04h],edi
          lea    eax,[ebp-2Ch]
          push    eax
          lea    eax,[ebp-20h]
          push    eax
          push    [ebp+18h]
          push    esi
          push    [ebp+10h]
          push    [ebp+0Ch]
          push    [ebp+08h]
          push    [ebp-24h]
          call    SUB_L76640E21
          mov    esi,eax
          mov    [ebp-34h],esi
          or    dword ptr [ebp-04h],FFFFFFFFh
          jmp    L76640D7F

一方XPは自分をサービスとして起動
keysvc の中の ncalrpc を呼び出す

つまり、XPの crypt32.dllを使う場合サービスとして登録していないと一部の機能が利用できないということになる

ただし、 CryptUnprotectData などの関数では Windows 2000と互換方式で Protected Storage サービスを利用している(ただし、Protected Storage をサービスとして起動する機構がXPにはない)

この箇所が Windows 2000ではすべて、 I_CertProtectFunctionで呼ばれている

 SUB_L765CB881:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          push    edi
          mov    edi,[ebp+08h]
          push    edi
          push    00000000h
          push    SWC765CB8C8_protected_storage
          push    00000000h
          push    SWC765CB8B8_ncalrpc
          push    00000000h
          call    [RPCRT4.dll!RpcStringBindingComposeW]
          test    eax,eax
          jnz    L765CB8B0
          push    [ebp+0Ch]
          push    [edi]
          call    [RPCRT4.dll!RpcBindingFromStringBindingW]
 L765CB8B0:
          pop    edi
          pop    ebp
          retn    0008h

XP の互換処理の部分 ・ω・
これを置き換えたらもしかしたら動く?

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です