Windows 2000 で DsGetDcOpen を実行するときの注意

Windows 2000 で DsGetDcOpenW を実現するために 一旦データを格納してWideChar をMultiByte に展開から 関数を呼んで 格納したデータを解放したところ…。
続く DsGetDcNext で
Erro 0x103(ERROR_NO_MORE_ITEMS) や 0x57 (ERROR_INVALID_PARAMETER) が出て困った

NetApiBufferFree を呼ぶのをやめたところ…正常に動作するようになったのだけど、Windows 2000 の場合 渡したドメイン情報のアドレスを渡した後、データの中身 をそのまま保持する必要があるようだ(; ˘ω˘)

何という酷い実装だ。

実証コード書いてみた
    char pppp[256]="test.mof.or.jp";
    HANDLE p;
    xx=DsGetDcOpen(pppp,2,0,0,0,0x40,&p);
    memset(pppp,0,256);
    yy=DsGetDcNext(p,&co,&soc,ppx);
    printf("DsGetDcOpen:%d %x\n",xx,p);
    printf("DsGetDcNext:%d %d %d %d\n",yy,co,soc);
    DsGetDcClose(p);

実行結果
DsGetDcOpen:0  133080
DsGetDcNext:259 0 0 0
ちなみに memset を削除するとちゃんと動く。
Windows XP や Windows 10 だと memset があっても問題ない

試しに Windows XP の netapi32.dll をコピーして動作させたところ動くのが確認できた(; ˘ω˘)

おすすめ

5件のフィードバック

  1. 匿名 より:

    そのまま保持する必要があるだけじゃなくて、
    書き換わるとそっちにアクセスしちゃう脆弱性があったり……しない?

  2. 正直 より:

    どのようにしてdllファイルにアクセスして変更できますか?

  3. 正直 より:

    どのように脆弱性を見つけますか?

  4. 黒翼猫 より:

    >>3
    意味が良く分かりません。
    何がしたいのでしょうか?

  5. 正直 より:

    コードASMをコードC ++に変換したい

コメントを残す

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