PowerPoint Viewer 2010 がランダムにクラッシュする理由の調査 その2
問題の構造体の場所を探す旅に出ることにしたよ・ω・
mov eax,fs:[00000018h] mov eax,[eax+00000F80h] mov edx,[ecx+08h] mov [eax],edx |
問題のコードは TEB のオフセット 0xf80を参照してる
#include "stdafx.h" #include <windows.h> typedef void *PPEB; typedef struct _TEB { PVOID Reserved1[12]; PPEB ProcessEnvironmentBlock; PVOID Reserved2[399]; BYTE Reserved3[1952]; PVOID TlsSlots[64]; BYTE Reserved4[8]; PVOID Reserved5[26]; PVOID ReservedForOle; PVOID Reserved6[4]; PVOID TlsExpansionSlots; } TEB, *PTEB; int _tmain(int argc, _TCHAR* argv[]) { TEB tb; printf("ProcessEnvironmentBlock: %x\n",(int)((int)&tb.ProcessEnvironmentBlock - (int)&tb)); printf("TlsSlots: %x\n",(int)((int)&tb.TlsSlots - (int)&tb)); printf("ReservedForOle: %x\n",(int)((int)&tb.ReservedForOle - (int)&tb)); printf("TlsExpansionSlots: %x\n",(int)((int)&tb.TlsExpansionSlots - (int)&tb)); return 0; } |
確認するコード
ProcessEnvironmentBlock: 30 TlsSlots: e10 ReservedForOle: f80 TlsExpansionSlots: f94 |
ReserveForOle という構造体があるらしい
調べてみると tagSOleTlsData という構造体が Windows 8以降にはあるらしいのだけどXPのは不明
0x04->0x04 ? // [USER32.dll!DestroyWindow] 0x1c->0x1c 0x24->0x24 // SUB_L7F506EF6/ SUB_L7CEF6AE9 0x54->0x48 // L7F5068CB/ L7CEF62A9 0x68->0x5c // SUB_L7F4C2719/SUB_L7CE9EF44 0x7c->0x70 // [USER32.dll!AllowSetForegroundWindow] 0x80->0x7c // L7F48B6A4/ L7CE7732D 0x90->0x8c? // [USER32.dll!DestroyWindow] 0x94->0x90? // [USER32.dll!DestroyWindow] 0x98->0x94 // L7F494DDD / L7CE87154 0x9c->0x98 // SUB_L7CE9F51E/ SUB_L7F4055F4 - [USER32.dll!DestroyWindow] 0xa0->0x9c // DDE_Channel -[USER32.dll!DestroyWindow] 0xa4->0xa0 // SUB_L7CE9F51E/ SUB_L7F4055F4 0xac->0xa8? //[USER32.dll!DestroyWindow] 0xb0->0xac //[USER32.dll!GetClipboardSequenceNumber] 0xb4->0xb0 //[USER32.dll!GetClipboardSequenceNumber] 0xb8->0xb4 //[USER32.dll!GetClipboardSequenceNumber] 0x0bc->0xb8 // CoSetState 0xc0->0xbc // CoEnableCallCancellation //cCallCancellation 0xc4->0xc0 // SUB_L7F401AA6/SUB_L7CE6936E 0xc8->0xc4 // SUB_L7F401AA6/SUB_L7CE6936E 0xcc->0xc8 // [USER32.dll!IsChild] 0xd0->0xcc // SUB_L7F4023A9/SUB_L7CEDD91 - [USER32.dll!DestroyWindow] 0xf8->0xf4 ? // SUB_L7F4857EA/ SUB_L7CE6CA78 0xfc -> none // CoPopServiceDomain 0x100-> none // CoUninitialize 0x104-> - // OleSpy? 0x108-> - // OleSpy? 0x10c-> none // CoGetInstanceFromIStorage 0x110->0x0f8 // L7F4D1A7C/ L7CEABE0D - [USER32.dll!DestroyWindow] 0x114->0x0fc // GetErrorInfo 0x118->0x100? // 0x11c->0x104? // [USER32.dll!DestroyWindow] 0x120->none // test byte ptr [eax+000000ACh],10h 0x124x - |
ざっくり書き出してみた。
どうやら offset 0x104 / 0x108 はWindows 2000には該当する部分がなさそう
Comments