Excel VBA 質問スレッド №1966 (未解決)

モジュール名の取得

投稿者 : マクロまぐろ     投稿日時 : 2024/07/12(Fri) 19:47:39     OS : Windows 10     EXCEL : Excel 2016
はじめまして
ワークブックから[マクロ]ダイアログに表示されるようなマクロ名の一覧を取得したいと思っています。

Workbooks().VBProject.VBComponents().Name

という感じで読み出すことはできるのですが、
プロジェクトがロックされたブックを参照することはできません。

ただロックされたブックでも[マクロ]ダイアログにマクロ名は表示されるので、
これを参照するか、同様に名前だけでも取得する方法はないものでしょうか。

何をしたいかと言いますと、マクロウィルスに感染したファイルがあるため、
特定のモジュール名を持つファイルだけを選別したいと思っています。
ただロックされたファイル(パス不明)の中にも感染したものがあり、とても困っています。
何か良い方法をご存じの方がいらっしゃいましたら、どうぞよろしくお願いいたします。

スポンサーリンク
[返信 1] Re : モジュール名の取得
投稿者 : うさんくさい     投稿日時 : 2024/07/13(Sat) 19:49:22
質問が矛盾しているように感じたので

>マクロウィルスに感染したファイルがあるため

どうやってそれを知ったのですか?
ウイルスソフトで分かったのならば、それで調べれば感染ファイルはどれか教えてくれます
隔離とか削除とか
ウイルス検査した時には、昔自分で書いたマクロや資料も毎回引っかかるのでいちいち除外とかしてます

[返信 2] Re : モジュール名の取得
投稿者 : うさんくさい     投稿日時 : 2024/07/13(Sat) 20:06:31
まあ、今のESETの事しか分からないけど
昔のマカフィ―は有無を言わずに資料まで削除された

[返信 3] Re : モジュール名の取得
投稿者 : うさんくさい     投稿日時 : 2024/07/14(Sun) 04:04:23
あ、マクロはひっかからなかったかも
ひっかかのは使ったことないけどまだ持ってる、MP3をなんかするフリーウェアだった
マクロでマクロに手を加えようとするとウイルスチェックにひっかかる場合もある

[返信 4] Re : モジュール名の取得
投稿者 : マクロまぐろ     投稿日時 : 2024/07/14(Sun) 20:39:31
>うさんくさい様

私の書き方が不十分でしたが、弊社全体で使っているアンチウィルスソフトで検出できないマクロウィルスが拡がりつつあります
(全社で対応ソフトに変えるのは困難ですし、変えたとしても勝手に隔離や削除をされるとPCに詳しい人がいない部署では大混乱になります)。

なので駆除VBAや感染イベントを監視するVBAを作りました。
感染ファイルには特定のモジュールが付加されるのでサーチ用VBAも作れるのですが、保護ファイルが感染しているか確定できないので不完全な状態です。
判別できたとして対処はできないので矛盾しているとは言えますが、開いていいかダメかが現場で判断できるだけでも対処方法が変わります。

感染時に付与されるモジュール名がPrivate指定されておらず、前述のように[マクロ]ダイアログからは確認できるので、それがVBAから内部的に拾えればと思って質問させていただきました。

という訳で、技術的な可否についてのご回答をお待ちしている次第です。

[返信 5] Re : モジュール名の取得
投稿者 : anonymous     投稿日時 : 2024/07/15(Mon) 08:12:54
モジュールですか?プロシージャなくて?

プロジェクトがパスワード付きで保護されていれば、お望みの処理はできません。
パスワード解除が必要です。
こうしたところで得られる情報は限られています。
仮にそうした情報を持っていたとしても、掲示板に書ける内容ではありません。

一刻も早く、外部の専門家に委託するのがよいと思います。

[返信 6] Re : モジュール名の取得
投稿者 : tek     投稿日時 : 2024/07/15(Mon) 08:53:17
私ならわざとウィルスに感染させたファイルを作らせ、それを解凍後パターンを見つけ、
そのパターンがあるかで判断する形にするかなあと思ったのですが、

>弊社全体で使っているアンチウィルスソフトで検出できないマクロウィルス
それを作った(たぶんそれなりの対価を得ていると思われる)人または会社に相談すべきです。
未知のウィルスは自分のところに止めず、報告されるべきと考えます。

VBAProjectのバイナリーファイルはロックがかかっていても読めるようです。
https://qiita.com/kn1cht/items/e97f00fdcf2e7d456cfa

専門家ならxlsmファイルのままでのパターンを見つけ定義ファイルに追加するのは訳なくできるでしょう。

[返信 7] Re : モジュール名の取得
投稿者 : マクロまぐろ     投稿日時 : 2024/07/15(Mon) 09:56:07
> tek様

某海外製の大手のセキュリティソフトで、既に問い合わせはしております。
ウィルス自体も旧式のものなので簡単に対応してもらえると思ったのですが、技術的に難しいと回答が来ています(他のに変えたいです)。
バイナリでの解析は自分の守備範囲と掲示板の趣旨から外れるのでさすがに厳しいです。

[返信 8] Re : モジュール名の取得
投稿者 : マクロまぐろ     投稿日時 : 2024/07/15(Mon) 10:15:48
■[返信 5] anonymousさん(2024-07-15 08:12:54)の記事
> モジュールですか?プロシージャなくて?

> プロジェクトがパスワード付きで保護されていれば、お望みの処理はできません

ご指摘通りプロシージャ名でした。すみません。

念のため確認ですが、質問の趣旨としてはプロジェクトのロックを突破する処理ではなく、「普通にダイアログに表示される(された)内容を取得したい」というだけのことです。
私が知らないだけで方法がありそうだなあ、と思ったのですが無理なんでしょうか・・・?

[返信 9] Re : モジュール名の取得
投稿者 : tek     投稿日時 : 2024/07/15(Mon) 14:46:01
>バイナリでの解析は.... 掲示板の趣旨から外れる
マクロで行うので問題ないと思います。
とりあえず、手作業でバイナリーエディターでそれらしいのが見えるかやってみてください。

>前述のように[マクロ]ダイアログからは確認できるので、それがVBAから内部的に拾えれば
[マクロ]ダイアログ表示中にマクロを動作させることはできないと思います(別インスタンスならできるかも?私はやる気なし)。

[返信 10] Re : モジュール名の取得
投稿者 : ごんぼほり     投稿日時 : 2024/07/16(Tue) 16:59:12
拡張子.xlsxを .zip に変更します。
解凍します。
xlフォルダの中に vbaProject.bin というファイルがあるので、
この中にASCII文字列として読める部分があれば読んでみてください。

powershellで Select-String -Path vbaProject.bin -pattern "hoge"  
とかやると、vbaProject.bin のなかに hoge という文字列が含まれているかどうかわかります

[返信 11] Re : モジュール名の取得
投稿者 : tek     投稿日時 : 2024/07/16(Tue) 21:03:10
ところで、マクロが増殖するということはトラストセンターの設定のアクセスを信頼するにチェックが有る状態で各部署使用しているということですか?
そうならば即刻止めることをお勧めします。(バージョンUPの問題なら、アドイン方式に変えてください)
そうでないなら、ウィルス感染ファイルをマイクロソフトに提示すべきです。(対策してくれるでしょうし、パスワードも教えてくれるかも)

そのウィルスマクロのプロシージャ名が解っているのですから、トラストセンターの設定のアクセスを信頼するにチェックを外し、
実行させて、エラー内容で有無を判断することも可能ではないでしょうか?
一例です。
Sub プロシージャ検査()
    Dim filePath As String
    Dim procName As String
    Dim bookName As String
    Dim msg As String
    Dim s As String
    Dim wb As Workbook
    
    filePath = "C:\Users\username\Documents\"
    bookName = "あるブック.xlsm"

    procName = "test3"
    s = "*またはすべてのマクロが無効になっている可能性があります。"
    msg = "が有ります"
    
    Set wb = Workbooks.Open(filePath & bookName)
    On Error GoTo ERRLINE
    Application.Run bookName & "!" & procName
    wb.Close False
    MsgBox procName & " " & msg
    Exit Sub
ERRLINE:
    If Err.Description Like s Then msg = "は有りません"
    Resume Next
End Sub

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-07-03 17:19:25 )
タイトルとURLをコピーしました