Windows 2000の User32にレジスタが破壊されるバグ

32-bit ASM Calculator 1.5 | Мои программы | Blog. Just Blog
この高機能電卓ソフトなんですが、Windows 2000で動かすとクラッシュするので調べてみました。
すると、何やら、レジスターの esi の値が SendMessageをよんだ後破壊されてるじゃないですか!

 77E0A43C                           SUB_L77E0A43C:
 77E0A43C  55                                push    ebp
 77E0A43D  8BEC                              mov    ebp,esp
 77E0A43F  68CDABBADC                        push    DCBAABCDh
 77E0A444  56                                push    esi
 77E0A445  FF7518                            push    [ebp+18h]
 77E0A448  FF7514                            push    [ebp+14h]
 77E0A44B  FF7510                            push    [ebp+10h]
 77E0A44E  FF750C                            push    [ebp+0Ch]
 77E0A451  FF5508                            call    [ebp+08h]
 77E0A454  817C2404CDABBADC                  cmp    dword ptr [esp+04h],DCBAABCDh
 77E0A45C  7411                              jz     L77E0A46F
 77E0A45E  813C24CDABBADC                    cmp    dword ptr [esp],DCBAABCDh
 77E0A465  7505                              jnz    L77E0A46C
 77E0A467  83EC04                            sub    esp,00000004h
 77E0A46A  EB03                              jmp    L77E0A46F
 77E0A46C                           L77E0A46C:
 77E0A46C  83C410                            add    esp,00000010h
 77E0A46F                           L77E0A46F:
 77E0A46F  83C408                            add    esp,00000008h
 77E0A472  5D                                pop    ebp
 77E0A473  C21400                            retn    0014h

該当の Windows 2000の user32.dll

 SUB_L77CF870C:
          push    ebp
          mov    ebp,esp
          push    esi
          push    edi
          push    ebx
          push    DCBAABCDh
          push    esi
          push    [ebp+18h]
          push    [ebp+14h]
          push    [ebp+10h]
          push    [ebp+0Ch]
          mov    eax,fs:[00000018h]
          or    byte ptr [eax+00000FB4h],01h
          call    [ebp+08h]
          mov    ecx,fs:[00000018h]
          and    byte ptr [ecx+00000FB4h],00h
          cmp    dword ptr [esp+04h],DCBAABCDh
          jnz    L77D203B0
 L77CF8750:
          add    esp,00000008h
          pop    ebx
          pop    edi
          pop    esi

          pop    ebp
          retn    0014h

Windows XPの user32.dll

Windows XPはちゃんとレジストリ退避してる!
cal
落ちなくなりましたとさ・ω・;
修正予定は、5.0.2195.7160 で。

おすすめ

4件のフィードバック

  1. 通りすがり より:

    これの修正ってKernel32 改造計画の最新verに適応されるって形なのでしょうか?
    できれば15sとかの安定旧verにもバグの修正は適応されると嬉しいのですが

  2. 黒翼猫 より:

    安定版旧版は、Game Guard 対応版に統合しようかと考えてるんですが、
    v15じゃないと困るのってどういうときでしたっけ・ω・

  3. 通りすがり より:

    daemontool’s4.7以前ががコンソールコマンドを受け付けないとか
    検索したらこれは、ntdll.dllからデバッグルーチンを抜いたのが原因だから、追加すれば良いってあったのですが追加のやり方分からない
    後はゲームガード対応版でもプロテクトで動かないゲームがありますので←大分前なのでタイトル覚えていません
    そんなわけで、こちらでは一番互換性高い15y2使っていたりします

  4. よいとも より:

    拡張カーネルの新版お待ちしています。
    順番的にv23hになるんでしょうか。

コメントを残す

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