2017年2月18日土曜日

MiharuPCのクリップボード監視方法

MiharuPCは重要な書類からのコピペによる情報の漏洩を監視しています

以下その方法を説明します


重量な「ファイルA.xlsx」から「ファイルB.docx」にコピー&ペーストした場合、「ファイルB.docx」も監視対象とします





・どこからコピーしたか
Windowsのメッセージループで、クリップボードの更新イヴェントを受け取ります
MiharuPCの「CP1_CopyPeClipWatcher」クラスがこれを行います
 public class ClipBoardForm : Form
 {
        [DllImport("user32.dll")]
        private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
        [DllImport("user32.dll")]
        private static extern bool ChangeClipboardChain(IntPtr hwnd, IntPtr hWndNext);
        //[DllImport("WngLook.dll")]
        //public static extern int WndGet();

        const int WM_DRAWCLIPBOARD = 0x0308; // クリップボードの内容が変更
        const int WM_CHANGECBCHAIN = 0x030D; // チェインからの除去

    protected override void WndProc(ref Message m)
    {
              if (m.Msg == WM_DRAWCLIPBOARD) // クリップボードの内容が変更された
         {
             try
             {
                   CP1_CopyPeClipWatcher.LifeCheck();
                   SetClipBoardWatcher();
             }
             else if (m.Msg == WM_CHANGECBCHAIN)
             {  // クリップボード ビューアのチェインから除去
                   if (m.WParam == nextHandle)
               {
                 nextHandle = m.LParam;
             }

             base.WndProc(ref m);
        }




クリップボードの更新イベントから呼ばれたコールバックルーチンでは、アクティブなウインドウのタイトルを取得し、タイトルからどのファイルが開かれているか調べます



以下の方法も検討したのですが、複雑になるのでやめました

1.開いているファイルを使っているプロセスIDを求める
2.クリップボードを更新したウインドウのハンドルから、プロセスIDをもとめる
3.クリップボードに入っている値が、重要なファイルから来た物か判定する

これでクリップボードに取り込んだ事を検出できました


・張付けを検出する

.NETの「System.IO.FileSystemWatcher」クラスを使い、ファイルの更新を監視します
MiharuPCの「CP2TextPasteWatcher」クラスがこれを行います

「System.IO.FileSystemWatcher」クラスの使い方は、良い解説のホームページがたくさんありますので、このブログでの説明は省略します

更新と名前変更のイベントを監視します

    switch (e.ChangeType)
    {
    case System.IO.WatcherChangeTypes.Changed: 
    case System.IO.WatcherChangeTypes.Renamed: 

MsOfficeでは編集を行った場合

元ファイルからテンポラリーファイルを作る
        ↓
テンポラリーファイルを編集する
        ↓
テンポラリーファイルを元ファイル名にリネームする

となるので、編集時は更新ではなくリネームのイベントが飛んできます

更新されたファイル 内に、クリップボードへ取り込んだ文章が含まれていないか調べます。

クリップボードに取り込んだ文章が含まれている場合、重量なファイルからコピー&ペーストしたと判断します

取り込んだ文章とクリップボードとの比較は、文章を形態素に分解して行うことで、完全一致のみでなく盗用検出も行っています。

最初は、イベェントフックを使い、張付けを検出する方法を試みましたが、Vista以降仕様が変わった様でして。

1.処理時間に制限かある
2.管理者権限が必要
3.32ビットアプリと64ビットアプリ間のフックに制約がある

などで半年ほど苦労したのですが、結局諦めました(= =#)


MsOfficeから文章を取り出す方法については、次回で説明いたします。

   ← ホームページへのリンクです

0 件のコメント:

コメントを投稿