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 の互換処理の部分 ・ω・
これを置き換えたらもしかしたら動く?
Comments