Windows 2000拡張カーネル v2.6d リリース

Windows 2000 Kernel32 改造計画【BM】

DropBox 3.12/3.14/3.16の調子がまだ悪いというので、調べてみたのですが

 L10003097:
          mov    esi,[KERNEL32.dll!LoadLibraryA]
          push    SSZ1000A10C_ntdll_dll
          call    esi
          mov    ebx,[KERNEL32.dll!GetProcAddress]
          mov    ebp,eax
          push    SSZ1000A118_RtlIpv4AddressToStringA
          push    ebp
          call    ebx
          push    SSZ1000A130_RtlIpv6AddressToStringA
          push    ebp
          mov    [esp+50h],eax
          call    ebx
          push    SSZ1000A148_iphlpapi_dll
          mov    [esp+48h],eax
          call    esi
          mov    edi,eax
          push    SSZ1000A158_GetExtendedTcpTable
          push    edi
          call    ebx
          push    SSZ1000A16C_GetExtendedUdpTable
          push    edi
          mov    [esp+34h],eax
          call    ebx
          mov    esi,[KERNEL32.dll!FreeLibrary]

psutil._psutil_windows.pyd って、古いOS用にRtlIpv4AddressToStringA などを遅延ロードして処理してるんですが、その後チェックせずに、NULLポインタをコールするようにしたため、クラッシュ→catchで処理。しかし想定してない場所でのtry/catchなので処理できず無限ループしてることが判明。

誰だよ、こんなひどいコード書いたの・ω・;

とりあえず、足りない関数実装して回避してみたけど。
なんだかなぁ・・・。

コメントより




// Import some functions.
{
HMODULE ntdll;
HMODULE iphlpapi;
ntdll = LoadLibrary(TEXT("ntdll.dll"));
rtlIpv4AddressToStringA = (_RtlIpv4AddressToStringA)GetProcAddress(
ntdll, "RtlIpv4AddressToStringA");
rtlIpv6AddressToStringA = (_RtlIpv6AddressToStringA)GetProcAddress(
ntdll, "RtlIpv6AddressToStringA");
/* TODO: Check these two function pointers */

iphlpapi = LoadLibrary(TEXT("iphlpapi.dll"));
getExtendedTcpTable = (_GetExtendedTcpTable)GetProcAddress(iphlpapi,
"GetExtendedTcpTable");
getExtendedUdpTable = (_GetExtendedUdpTable)GetProcAddress(iphlpapi,
"GetExtendedUdpTable");
FreeLibrary(ntdll);
FreeLibrary(iphlpapi);
}

どう見てもTODOですありがとうございます・ω・

おすすめ

2件のフィードバック

コメントを残す

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