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はちゃんとレジストリ退避してる!
落ちなくなりましたとさ・ω・;
修正予定は、5.0.2195.7160 で。
これの修正ってKernel32 改造計画の最新verに適応されるって形なのでしょうか?
できれば15sとかの安定旧verにもバグの修正は適応されると嬉しいのですが
安定版旧版は、Game Guard 対応版に統合しようかと考えてるんですが、
v15じゃないと困るのってどういうときでしたっけ・ω・
daemontool’s4.7以前ががコンソールコマンドを受け付けないとか
検索したらこれは、ntdll.dllからデバッグルーチンを抜いたのが原因だから、追加すれば良いってあったのですが追加のやり方分からない
後はゲームガード対応版でもプロテクトで動かないゲームがありますので←大分前なのでタイトル覚えていません
そんなわけで、こちらでは一番互換性高い15y2使っていたりします
拡張カーネルの新版お待ちしています。
順番的にv23hになるんでしょうか。