2017年2月26日日曜日

Excelから文字を抽出する方法

情報の漏洩防止ソフトMiharuPCを作りました

クリップボードから、MsOffice内に重要な情報が張付けられていないか監視するために、MsOfficeから文字を抽出するこ事をやっています。

その方法を紹介します、まずはExcelから

MsOfficeのファイルは複数のXMLファイルをZIPで固めた物です。 拡張子を「xlsx」から「zip」に変えるだけで、解凍できます。


「新規 Microsoft Office Excel 2007 ブック.xlsx」から「新規 Microsoft Office Excel 2007 ブック.zip」に変換した例を記します。





ディレクトリ「xl」内にシートと対応するXMLファイルがあります






sheet1の内容です


数値データは「sheet1.xml」内に直接保持しているのですが、文字列に関しては文字列データの番号のみを保持しています


文字列は「sharedStrings.xml」内に保持しています


「sharedStrings.xml」の内容です


文字列の番号はsharedStrings.xmlに保持していない様ですが、<si>タグのうえから0番、1番・・・と続いている様です。


以下MiharuPCの説明です

Excelのファイルを解析する為の良いライブラリーが出回っていますが、MiharuPcは主記憶常駐なので処理を軽くするために「System.Xml」を使って手作業でやりました

MiharuPCの「MSOF_OffiseDocument」がMicrosoftOfficeドキュメントを扱うクラスです。
「MSOF_ExcelDocument」はその下のExcel解析用で 、「MSOF_SheetDocument」は 「sheet*.xml」のラッピングクラスで「MSOF_ExcelString」は「sharedStrings.xml」のラッピングクラスです。

MsOfficeのバージョンは2007 2013 2016で確認しました

ソースリストはMiharuPCのホームページからダウンロードできます


   ← ホームページはこちらです

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から文章を取り出す方法については、次回で説明いたします。

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

2017年2月5日日曜日

情報の持ち出しを監視するソフトウエアを作りました

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

機密情報の持ち出しを監視します

Windowsで動作するフリーソフトです、Windows7とWindows10 上の動きを監視します。

サーバはCGIで実装したので、Webサーバが有れば使えます。Windows10とUbuntuで確認しました。



重要なファイルからコピーして、貼り付けをしたり。

他のファイル名に名前を変えて保存したり。

それをUSBメモリーやSDカードに入れたり。

これらを検知して、監視サーバに通知します、サーバはWindows版とLinux版が有ります。

名前はMiharuPC(見張るPC)としました


これがホームページです→http://www.geocities.jp/bruesix707/index.htm


これが監視画面です、どの端末でどのユーザが、どんな操作をしたか監視します。






ファイルのIOだけでなく、クリップボードも監視しているので、コピー貼り付けも検知します







MsOfficeのテンポラリーファイルも監視しているので、重要なファイルを「名前を付けて保存」すると保存後のファイルも監視対象にします
今はExcelとWordが対象でOfficeの2007 2010 2013 2016で動作します。
PowerPointもサポートしたいのですが、息切れしていて、まだ未実装です。

 



メールへの添付や印刷なども監視したいのですが、今は未実装です

と言うか、方法が思いつかないです(= = !)。