スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--.--.-- | スポンサー広告

IProgressDialog

しばらくシェルプログラムでも書いていこうかな~と思います。
時間があればですがorz

IProgressDialog インターフェイス
読んで字の如く何らからの'進行'を表現するためのダイアログを
提供するインターフェイスです。

なにかしら(プログラムが)面倒なシェルインターフェイス群の中では
比較的簡単な部類に入るでしょう。

サンプルソース


#include <windows.h>
#include <shlobj.h>

static const int BROCK_SIZE = 8096;
IProgressDialog* s_Progress;
DWORD s_MaxSize = 0;
bool s_CancelOn = false;

// WriteFileEx のコールバック
void WINAPI FileIOCompletionRoutine(DWORD Error,
DWORD Transferred,
LPOVERLAPPED Overlap)
{
// キャンセルが押されたかどうかの判定
if(s_Progress->HasUserCancelled())
{
s_CancelOn = true;
return;
}

wchar_t line[64] = L"";
wsprintf(line, L"%ld byte 中 %ld byte 作成...",
s_MaxSize, Overlap->Offset);
// キャプションの設定
s_Progress->SetLine(2, line, FALSE, NULL);
// プログレスバーの更新
s_Progress->SetProgress(Overlap->Offset, s_MaxSize);
}

// メイン
int wmain(int argc, wchar_t* argv[])
{
// いつもの
::CoInitialize(NULL);
// インスタンスの作成
::CoCreateInstance(CLSID_ProgressDialog,
NULL,
CLSCTX_INPROC_SERVER,
IID_IProgressDialog,
reinterpret_cast(&s_Progress));

if(*argv[1] == NULL || *argv[2] == NULL) return -1;
if(_wtoi(argv[1]) == 0L) return -1;

s_MaxSize = _wtoi(argv[1]) * 1024 * 1024;
int brock_number = s_MaxSize / BROCK_SIZE;
int last_size = s_MaxSize % BROCK_SIZE;

HANDLE file_handle = ::CreateFile(argv[2], GENERIC_WRITE,
0, NULL,
CREATE_ALWAYS,
FILE_FLAG_OVERLAPPED, NULL);

if(file_handle == INVALID_HANDLE_VALUE) return -1;

// タイトルの設定
s_Progress->SetTitle(L"ダミーファイル作成中...");
// AVI アニメーションの設定
// AVI ファイルをリソースに登録して使いましょう
s_Progress->SetAnimation(::GetWindowLong(m_hWnd, GWL_HINSTANCE),
"AVI リソース ID");
// ダイアログの表示
s_Progress->StartProgressDialog(NULL, NULL, PROGDLG_AUTOTIME, NULL);
// キャンセルメッセージ
s_Progress->SetCancelMsg(L"キャンセルされました。", NULL);
// タイマーのリセット
s_Progress->Timer(PDTIMER_RESET, NULL);

OVERLAPPED overlap;
char *dummy_data;
int offset = 0;
int write_size = BROCK_SIZE;
ZeroMemory(&overlap, sizeof(OVERLAPPED));

dummy_data = new char[write_size];
memset(dummy_data, 0x00, sizeof(char) * write_size);

for(int i = 0; i < brock_number + 1; i++)
{
if(i == brock_number && last_size > 0)
{
delete [] dummy_data;
write_size = last_size;
dummy_data = new char [write_size];
memset(dummy_data, 0x00, sizeof(char) * write_size);
}

overlap.Offset = offset;
// 使い方は間違っていないと思うんだけどなあ……
::WriteFileEx(file_handle, dummy_data, write_size,
&overlap, FileIOCompletionRoutine);
if(s_CancelOn) return 0;

::SleepEx(INFINITE, TRUE);
offset += write_size;
}

delete [] dummy_data;
// ダイアログの停止
s_Progress->StopProgressDialog();

::CloseHandle(file_handle);
::CoUninitialize();
return 0;
}


ダミーファイルを作成するサンプルです。
SHFileOperation API を使えばいいだけじゃないの?
という突っ込みは無しの方向で('A`)

IProgressDialog の使い方は楽だったのですが
WriteFileEx で躓きましたorz
私はコールバックを指定したらファイル作成が終了するまで何度か
コールバックに処理が入ってくると思ったのですが
最初の一回のみで後はうんともすんとも言いません(´・ω・`)
誰かボスケテ……

次回は IShellIconOverlay をお届けする予定です。


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

2006.02.19 | Comments(0) | Trackback(0) | 未分類

Lotus Notes の脆弱性

KeyViewビューアーに5つのバッファオーバーフロー脆弱性と
1つのディレクトリトラバーサル脆弱性


Potential Buffer Overflow and Directory Traversal
Vulnerabilities in Lotus Notes File Viewers
http://www-1.ibm.com/support/docview.wss?rs=475&uid=swg21229918

※適当に英語を訳しているのでかなり間違っているかもしれませんが
 指摘等よろです。
 (特に3,6はかなり怪しい……)

<内容>


  1. ZIPアーカイブで圧縮ファイルの存在をチェックする際にバッファオーバーフローが発生する脆弱性
    ロングファイルネームのZipファイルを解凍する際に任意のコードを実行可能

  2. 長大な名前のファイルが含まれているUUEをファイルを扱う際にバッファオーバーフローが発生する脆弱性
    上記UUEファイルがビュワーで開かれた際に任意のコードが実行可能

  3. Notes User がアクセス可能なファイルを削除する際に
    ZIP、UUE、TAR圧縮ファイルをプレビューするとディレクトリトラバーサルが発生する脆弱性
    ※プレビューしているファイルのディレクトリを詐称されます
      
  4. 長い名前のファイルを含んだTARファイルからファイルを抽出する際
    スタックベースバッファオーバーフローが発生する脆弱性
    任意のコードを実行可能だが、長大なファイルアドレスからファイルを抽出する必要がある

  5. 電子メールのHTML添付ファイル参照に使われるHTMLスピードリーダー(htmsr.dll)に境界エラーが存在し、
    http、ftp、//で始まる長大なリンクを含んだメールを参照するとスタックベースバッファオーバーフローが発生する脆弱性
    任意のコードを実行可能だが、HTMLドキュメントに含まれる(長大な)リンクをポイントする必要がある

  6. 5と同じくHTMLスピードリーダー(htmsr.dll)に境界エラーが存在し、
    ローカルファイルを参照する長大なリンクが含まれているとスタックベースバッファオーバーフローが発生する脆弱性
    HITMLドキュメントを閲覧した時点で任意のコードを実行可能


<対象>
Windows Lotus Notes
6.0.5, 7.0, 6.0.1.1, 6.0.4, 6.0.1.2, 6.5, 6.5.3.1, 6.5.1, 6.0.1.3, 6.5.2, 6.5.2.1, 6.5.3, 6.0.2.1, 6.0.3, 6.0, 6.0.2.2, 6.0.1

<対策>
Update to version 6.5.5 or 7.0.1

IBMにかかれている(強引な)対策

  1. Notesプログラムディレクトリのkeyview.iniファイルを削除してください。
    どんなファイルのビューをクリックしても「ビューアー構成ファイルの場所を見つけることができない」というダイアログが表示されるでしょう

  2. 問題のファイル(uudrdr.dll、htmsr.dll、tarrdr.dll)を削除してください。
    HTMLドキュメント、tar/uudアーカイブを開こうとすると、「ビューアーディスプレイ・ウィンドウを初期化することができなかった」という
    ダイアログが表示されるでしょう
      
  3. keyview.iniファイルを開いて問題のあるファイルの個所をコメントアウト(*)してください。
    例)
    [KVARCVE]
    132=ziprdr.dll
    * 194=tarrdr.dll
    * 167=uudrdr.dll

    [KVDOCVE]
    2=afsr.dll
    -1=hexsr.dll
    117=mifsr.dll
    13=dcasr.dll
    32=dw4sr.dll
    23=exesr.dll
    153=afsr.dll
    207=mimesr.dll
    208=mimesr.dll
    *210=htmsr.dll
    *251=htmsr.dll

    HTMLドキュメント、tar/uudアーカイブを開こうとすると、「ビューアーディスプレイ・ウィンドウを初期化することができなかった」というダイアログが表示されるでしょう

……というか3はともかく1,2は対策としてありなのか(笑)
削除したとしても業務に支障をきたすことはまずないと思うけど
それはないだろう、と思った('A`)

テーマ:情報セキュリティー - ジャンル:コンピュータ

2006.02.11 | Comments(0) | Trackback(0) | セキュリティ

«  | HOME |  »

ブロとも申請フォーム

この人とブロともになる

カウンター


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。