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には該当する部分がなさそう

おすすめ

コメントを残す

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