WSCをリバースエンジニアリングして休暇がパーになった話
引用元:https://news.ycombinator.com/item?id=43959403
Defenderを無効にする一番強引だけど効果的な方法は、Linux USBで起動してC:\ProgramData\Microsoft\Windows Defenderをリネームして、その場所に空ファイルを作る方法だって見つけたよ。
windowsに署名付きマニフェストがなくて、それが検出できないのが変だね。
Windows Updateを完全に無効にするには、wuaueng.dllと.exeの所有権を取る手もあるよ。Windows Homeでは唯一効果的な方法だね。
でもインターネットに繋がってるシステムでアップデート無効にするのは最悪だろ。その後どうやってアップデートすんの?
Group policiesはまだ効果てきめんだよ。俺はhomelabにコントローラー立てて、ローカルドメイン組んで、全ユーザーのdefenderポリシーだけ自動で変えるようにしてるもん。
win11だとGroup policyはもう効かないよ。アップデートで元に戻されるし、リアルタイム監視オフにするとdefenderがマルウェアだって検知するんだ。
世界中のPCはアップデートしてるから、マルウェア作者は古いバージョンを悪用しないことが多い。ChromeもWindowsもそう。
国家レベルの攻撃者以外には、2025年にはパッチされてないChromeやWindowsでもドライブバイ攻撃はされないだろう。
11 LTSC 24H2ではそんな問題全然ないけど?Tamper Protection無効にするの忘れただけじゃない?
Windows updateとwindows defenderを無効にすることが、システムの侵害リスクを有意に高めるっていう具体的な証拠は見たことがない。
去年の終わりにWindows 10 2016 ltscをVMに入れ、8年遅れの状態でやばいサイトを見たが感染しなかった。
ブラウザを最新にする方が重要だろう。
10年前にLinuxに移行した身からすると、このコメント欄見てるとWindowsが本物のハッカー向けディストロになったみたいだね。
Group policiesとかregistry keysってのはさあ、優しい提案みたいなもんなんだよ。ファイルを消したり名前変えたりするのは”聞いちゃいねえよ、俺のPCだろ”って感じのアプローチだね。
ある意味、ずっとそうだったんだよな。Linuxにはさ、きれいに物事をやる良い方法と、変なハックがあったりするじゃん。Windowsだと、Microsoftがエコシステムをどんどん囲い込んでるせいで、変なハックから始まることが多いんだよ。(俺はWindowsを主にゲームとVRで使ってるけど、基本的なレベルで動かし続けるために常にシステムをいじくり回さないといけなくて、マジ悲しい。まさかVRで8Kのヨーロッパドキュメンタリーを見るだけで、GitHubで見つけたDirectShowフィルターを設定する必要があるなんて、誰が考えたと思う?)
まだDOSとかWin98に対してアクティブな攻撃があるんだぜ。ボットファームのサイズ増やそうとしてる、自動化されたドライブバイ攻撃とかね。かなり古いシステムに対する新しいエクスプロイトも、まだリリースされてるんだよ。
Win11 Enterprise版のイメージ配布する準備するのにさ、200行くらいのpowershellスクリプトでMSが突っ込んでるブロートウェア全部消してるんだぜ。マジ馬鹿げてる。無料でめっちゃ良い製品作ってるLinuxディストロの開発者たちって、Microsoftの高給もらってる連中とは比べもんになんないよな。
確かにそれはあるね。Windowsはコード署名とかDISMやSFCを使ってやってる。でも、これはバイナリの話じゃないんだよ。定義とか設定がどこに保存されてるかって話。C:ProgramDataであって、C:Program Filesじゃない。システムもそこまで厳しく文句言えないんだ。サードパーティのエンドポイント保護だってあるわけだし。
DOSってどうやって攻撃するわけ?ネットワークサポートないじゃん。それにローカルアクセスできてるなら、もう特権持ってんじゃん。
それ、結構怪しい理屈だと思うけど。治安悪すぎる地域に住んでるから、他の奴らがみんな鍵かけてるから自分は鍵かけなくていいや、みたいなさ。
DOSのネットワークスタックを攻撃するんだよ。それはまだ活発に開発されてるんだ(mTCPは2025年1月が最終更新)。ビジネスでネットワーク使ってるDOSって結構あるからさ。DOSのネットワークスタックはパケットドライバとNICドライバとプロトコルライブラリでできてて、全部攻撃対象になりうるんだ。特にNICドライバはさ、最初にリリースされてからあんまり更新されてないことが多いんだよな。当時のハードウェアメーカーは人に使ってもらうのがゴールで、サポートは後回しだったからさ。意外と新しいDOSのNICドライバもあるんだぜ。Realtekとか、ISA NICをまだ作ってサポートしてるって聞いたよ。
そのpowershellスクリプト、俺たちにもシェアしてくれない?
Windows Updateにも同じことできるよ。
その通り!今やブラウザが主要な攻撃経路だよ。ほとんどのデバイスで一番無防備なソフトだからね。ブラウザのゼロデイ対策で、ダウンロード不要の”web RPA agent creation”っていうブラウザ隔離製品を作ったんだ。正当な防御層だけど、使い勝手が課題で普及は進んでないな。特にDLPとか厳重なブラウザが必要な規制対象企業で使われてるよ。でも、この技術層の可能性はまだ始まったばかりだと思う。
>まさかVRで8Kのヨーロッパドキュメンタリー見るのに、GitHubにあるDirectShowフィルターの設定が必要になるとはね。Dios Mio、mpvを使ってgpu-hqを有効にしろよ。
それって、ある人気製品がやってるやり方と一緒だね。それでインターネット全体の25%くらいをダウンさせてるけど…
泥棒が全てのドアをチェックするコストや危険が高ければ筋が通るよね。残念ながら、ネットワークに繋がったコンピューターだと、ドアチェックはリスクなくて実質無料なんだ。
じゃあ古いコードを攻撃するんじゃなくて、今も活発に開発されてるネットワークスタックを攻撃してるってこと?それって、ベースのプラットフォームが古くても、Win98を攻撃するのとは全然違う話な気がするな。
エクスプロイトが何年も、時には何十年も前から存在してたら最悪だよね。古いエクスプロイトが山積みになってて、必要な時に引っ張り出して使われたりしたら、さらに最悪だろうな。
無効にしたはずなのに、Defenderのグループポリシーが自動で再有効化されるのは簡単に再現できるよ。Defenderがグループポリシーの変更をマルウェア検知してるスクリーンショットもあるし。Windowsを自分でコントロールできてるなんて、全部幻想だよ。
サンキュー!でもVRでどうやって動かすの?マニュアル[1]見ても見つけられないんだけど。
[1]: https://mpv.io/manual/master/
これ見て→ https://github.com/Raphire/Win11Debloat 最近は最初にTiny11入れて、それからこれ使って残りの不要なやつ消してるよ。
参考までにね、WSCはWindows Security Centerのことだよ。
もっとコメントを表示(1)
助かるよ。初めて略称が出てきた時に筆者が定義してくれないのって、マジでイライラするんだよね。
でも、してるじゃん:>こういうごちゃごちゃを全部管理してるシステムの部分をWindows Security Centerって呼んでて、略してWSCだよ。
略称の定義は、初めて出てくる場所の近くにないと意味ないんだ。私の画面だとスクロールしないと見えないから。タイトルの下とかにあれば分かったと思う。参考資料も貼っておくね。* https://apastyle.apa.org/style-grammar-guidelines/abbreviati… * https://www.stylemanual.gov.au/grammar-punctuation-and-conve… * https://learn.microsoft.com/en-us/style-guide/acronyms 私、分かりやすくするために文章校正よくやるから、こういうの気になっちゃうんだよね。
これ、まあまあ役立つフィードバックなんだけど、ブログ記事の構成上どう直せるかちょっと分からなくて。最初の段落に『*WSCはWindows Security Centerの略です』って一行追加するだけで大丈夫だと思う?
私の提案ね:この記事では、Windows Security Center(WSC)のサービスAPIを直接使ってWindows Defenderを無効にするツール、defendnotを実装するまでの道のりを簡単に説明するよ。
ありがとう!最初の段落、その変更を含めたよ!
あー、なるほどね.このやり取り見て、ちょっと混乱してたんだ.だってWSCって最初の文でハッキリ定義されてたじゃん?なんで?って思ってたんだけど、これで理由が分かったよ.フィードバック取り入れてくれてありがとう!後から記事に来た私みたいな読者にとっては、プラスの効果があったよ.
感謝してるよ、ありがとうね!〜
abbr タグ使うのはどう? タイトル属性も使えるし,記事の流れを邪魔しないよ.スマホの人はインジケーターを長押しすれば詳細読めるし,最初から WSC 知ってる人はそのまま理解できるしね.https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/…
よくある解決策は,最初に使った後に括弧で正式名称を書くことだよ.僕が Electronic Engineering degree で学んだ簡単なルール(僕らアクロニムばっか使うんだけど):論文とか誰かが読むものにアクロニムを書くときは,読者が知らないと思って,最初の使用時にすぐ後ろに正式名称を括弧書きすること.
追記:兄弟コメントも言ってるけど,最初にフルで書いて,括弧にアクロニムを書くのもありだよ.
これって Slack? どんなロギングフロー使ってるのかな?
https://blog.es3n1n.eu/posts/how-i-ruined-my-vacation/pics/p…
これ Discord の Compact テーマだよ.
少なくとも WSC は後で定義されてるね.僕まだ CTF が何かわからなくて頭抱えてるんだけど.[追記 - Capture The Flag かも?]
君の言う通り,CTF は定義されてないね.うん,Capture The Flag っていうサイバーセキュリティ系の競技だと思うよ.
https://news.ycombinator.com/item?id=43960389
いや,定義してるよ.タイトルでは短縮してるけど,記事の中で初めて使う時にアクロニムを定義してる.
「使ってたアンチウイルス」の開発者が DMCA を送ってきたってところで混乱した.なぜ送る理由があるの? 別のアンチウイルスをリバースエンジニアリングしてプロジェクトに使ったってこと?「Impersonating WinDefend」って見出しもあったし,著作権法違反したってこと?
僕の理解では,彼は別の AV tool の残骸を使ってシグネチャ要件を回避したんだ.それはグレーゾーンなのはわかる(IMO では transformativeness の議論はあるけど,僕は弁護士じゃないし).
既存のAVプログラムの一部をコピーしてるから著作権法違反だね。引用した箇所の一つ前の段落にも書いてあるけど、このプロジェクトは既存のアンチウイルスからサードパーティコードを使ってて、そのAVをWSCに登録させてたみたいだよ。
これヤバい(cursed)ね。
https://github.com/es3n1n/defendnot/blob/master/defendnot-lo…
何が起きてるか気になるならこっち見てみて。
https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s…
C++に詳しい人で、何が起きててなんでこれがcursedなのか教えてくれる人いる?
問題のコードdefer->void { CoUninitialize(); };
がマクロでauto _defer_instance_1234 = Defer{} % [&]()->void { CoUninitialize(); };
みたいに展開されるって解説してるよ。Defer{}
とか%
とか[&]()->void
のラムダ構文とか、DeferHolder
がデストラクタで関数を呼ぶ仕組みを説明してる。
マクロでC++っぽいけど違う構文になってるのがcursedな理由だって。
もっとマクロっぽくDEFER(...)
みたいにする方が良いんじゃないかって提案もしてるね。
同じことだけど、もっとマシなやり方もあるよ。
https://github.com/abseil/abseil-cpp/blob/master/absl/cleanu…
面白いね!このマクロは今のスコープが終わった後に実行されるコードを登録できるってことかな。auto _defer_instance_1234 =
って、作られた後どこからも参照されてないみたいだけど、コンパイラは未使用だってすぐ検出して最適化で消しちゃわないの?デストラクタは常に今のスコープを抜けた後で呼ばれるって保証されてるの?
前のコメントの質問(最適化で消えないか、デストラクタ呼び出しが保証されるか)について。
「そう、その通りだよ。」って肯定してる。
デストラクタにはファイルクローズやmutexアンロックみたいな副作用があるから、コンパイラは勝手に最適化で消せないんだって。
スコープの終わりで呼ばれること、コンストラクタと逆順で呼ばれることは保証されてるよ。
そう、それは保証されてるよ。
副作用があるステートメントを、コンパイラは勝手に省略(elide)できないんだ。
->void
は要らないんじゃない?
コンパイラは戻り値がないことを推論できるはずだよ。defer { CoUninitialize(); };
みたいに書くだけなら、そんなにcursedに見えなかったかもね。
一番簡単な「直し方」はマクロを全部大文字にすることに同意するよ。
前のコメントの指摘(->void
不要、defer { ... };
構文)に同意したり、それでも個人的には嫌だと言ったりしてる。
一番簡単な修正はマクロを大文字にすることって話に触れつつ、実はオブジェクト風じゃなくて関数風マクロ[1]にする方が魔法っぽさが減って良いって提案してるんだ。
[1] https://stackoverflow.com/questions/36126687/function-like-m…
正直、関数に偽装してるけど実際は関数じゃないマクロはマジ嫌いだわ。例えば#define min(x, y)みたいに引数を複数回評価するやつとかね。引数が1個だけならちょっとはマシだけど、htonlみたいなのもイライラするんだよ。”ベスト”なやり方は、関数っぽく見せつつ名前を全部大文字にすることだと思う。(あと、defer { ・・・ }; の後ろにセミコロンがいるのも相変わらずイケてないと思うわ。キーワードなのにブロック取るみたいな錯覚が崩れるしね。)
> * Deferにはoperator%がオーバーロードされてる。これはcallableなオブジェクト(型はテンプレートパラメータCallable)を取って、DeferHolder<Callable>インスタンスを返すテンプレート関数。
operator%を使う理由って何かあるの?普通のメソッド呼び出しじゃダメなの?もしかしてカッコつけ?でもその呼び出しマクロの中に隠れちゃってるし役に立たない気がするけど。
普通のメソッド呼び出しだと、ラムダ関数の終わりに閉じカッコが必要になるんだ。でもマクロは行の先頭にあるだけだから、閉じカッコを提供できないんだよね。だからマクロを呼ぶ側が自分でそれを供給しなきゃいけなくなる。コメントの最後の方で言ったけど、このdeferマクロは呼び出し側が閉じカッコを不要にするために特別に工夫されてるっぽいんだ。それが気にならないなら、「実装をシンプルにできる」って書いたけど、それはつまり、君が言うようにDefer::operator%(というかDeferクラス自体)がいらなくなるってこと。(コード例は長いので省略)試してないし普段マクロ書かないから変な問題あるかもだけど。
もっとコメントを表示(2)
うーん、これより構文が分かりやすい(->voidとかない)もっと良い実装もあるけど、それ以外は問題ないよ。何するのかは結構明らかだし、似たようなものが過去に必要だったことあるわ。cppconの講演で、優先順位のために->*演算子を使ってて、マクロを使えば’defer { ・・・ };’みたいに使えるって話があったな。
これは’defer’っていう仕組みを実装したクラスだよ。GoとかJavascriptの同じ仕組みに似てて、現在のブロックスコープを抜けるまで指定されたブロックの実行を遅延させるんだ。これ、実際めちゃくちゃ賢いし、かなり役に立つんだよね。個人的にはそんなにヤバいとは思わないけど、古いC++使いにとってはとんでもない匂い(smell)がするかもね。言語機能であるべきものをクラスで実装しちゃうのは、一部の人にとってはイデオロギー的にやりすぎに感じるかもしれないね。
C++はある程度、オブジェクトのデストラクタがスコープを抜けるときに呼ばれることを保証してるんだ。だからこのメカニズムを’悪用’して、現在のスコープをどう抜けようが関係なく、スコープの終わりに実行されるように’登録’できるんだよ。
うん、ごめん、時間的な制約でCOM関連のRAIIを全部自分で実装する気にならなかったんだ。次のアップデートでは変えるつもりだよ。
https://github.com/es3n1n/defendnot/pull/6
https://en.cppreference.com/w/cpp/experimental/scope_exit
scope_exit{[&]{ ・・・ } };
正直、これが公開されるAPIの一部じゃないなら、C++的にはそんなにヤバくないよ、特にその場限りのクリーンアップ操作がいっぱいあるならね。個人的に唯一気に入らないのはシンタックスだけかな。普段はマクロでdeferを実装して、見た目をキレイにしてるんだ。ちゃんとやればdefer []{ something(); };
みたいにキーワードっぽく見えるようになるよ。
俺的にはさ、そのsyntaxが”呪われてる”って言われてる理由だと思うんだよね。IMO君の提案もno better - yes it makes defer look like a keyword, but it’s not! As I said in a sibling comment, I think it’s clearer if you’re honest that you’re using a macro: DEFER({something();});
Or you could even make a non-macro version (but then you need to think of variable names for each defer): auto defer_uninitialise = do_defer({CoUninitialize();});
Sure, 俺も__LINE__使ったことあるよ for this before too, and yeah I agree that my keyword construction was too clever (seemed cool at the time, since the macro had a dangling = at the end to make it work).
Why did you write it with two structs though? You could do #define defer(body) DeferHolder COMMON_CAT(_defer_instance, LINE) {(&->void body)};
and call it as defer({
function body here;
});
Which looks much nicer. The preprocessor treats balanced curlies as one single token regardless of how many lines it spans, precisely to enable this usage.
What’s cursed about this? 俺はThis pattern all over in my code although the signature at the callsite looks a bit different (personal preference).D (for example) has the concept of statements that trigger at end of scope built into the language.
Michael Featherの言葉”Code is a way you treat your coworkers”を引用。TL;DR: AIじゃない。記事のコードはオブジェクトがscopeから抜ける時にfunction callをdeferさせるもの。C macrosでsuccinctにしてるけど、UPPER CASEを使わないから普通のfunction callに見えて紛らわしい。This patternに慣れてない人はconfusionするかもね。でもcommon enoughだってopinionもあるよ。技術的な詳細はnews.ycombinator.comのコメント参照。
lol, 俺はWindowsのvirtual desktopsをreverse engineeringしてvacationをsignificantly improvedしたぜ :)
best memories of last year: reverse engineering is hellovafun!learned a lot of interesting thing, namely there is an undocumented messaging underlying the RPC in windows: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC….
For those wondering:WSC stands for Windows Security Center.俺もhad to look it up as well
”>The part of the system that manages all this mess is called Windows Security Center - WSC for short。”
It’s in the article
true, but you have to read until the 4th paragraph to find it. Putting it in the title would have been better
なんでWSCを無効にしたいの?
もっとパフォーマンスが良くて、リソース食わないWindowsのアンチウイルスってないの?
それ”アンチウイルス無し”って呼ぶんだぜ。この記事がやろうとしてることじゃん。アンチウイルスなんて役立たずのマルウェアだよ。
あー、”Windows上級ユーザービンゴカード”引っ張り出してきたわ!このスレッドでもういくつかチェック入ったぞ。
アンチウイルスソフトはマルウェア
30年前気に入らなかったからWindows Updateは無効にしないと
Windows Defenderがリソース食いまくる、ノートPCのレビューでブラウジング10時間とか嘘、DefenderがPCのパフォーマンス実際はぶっ壊してる
Linuxに乗り換えるよりWindowsに文句垂れて機能無効化する方がマシ
あとは”Windowsクソ、Linuxに乗り換えようと思ってるけど絶対やらない”を待つだけだ。それ来たらビンゴ!
うちはレコードごとに別ファイルで保存するソフト使ってるんだけど、要はファイルシステムをDB代わりに使ってる感じ。Windows Defenderに例外追加しないと、そのソフト使い物にならないくらい遅いんだよね。例外追加したら(Defender切るか)ちゃんとまた速くなるけど。
俺のハードウェアだ。好きなようにさせてもらうぜ、相棒。
ただそれだけ。
熟練ユーザーね。ファイルシステムの概念すらよく分からない人には強制的なAVもまあ理解できるし、だいたい賛成だよ。でも、太古のインターネットの炎で鍛えられたユーザー層もいるんだ。そういう人はブラウザ上の偽explore.exeウィンドウとか絶対クリックしない。
ユーザーに選択肢を与えるのが一番だよ。確かにAV無効化はすごく難しくしてもいい。でも、このクソなものをちゃんと無効にする方法を見つけるために、DMCAで消されたリポジトリとかネットの闇を探し回らせるのはやめてくれ。
まあ、これは”私の体、私の選択”みたいなストレートな意見だよね。でも、そうじゃない時もある。
たぶん君のハードウェアは、ネットワークに繋がるとそのネットワークの他の部分に実際影響を与えるんだよ。もし君のシステムがボットネットに加わって、金のためにDDOS攻撃始めたら?もし君のシステムがレジデンシャルプロキシネットワークの一部になってて、グレーマーケットで他のシステムのあらゆる使用や悪用に使われるためにレンタルされたら?もし君のシステムが、君が知らない間に当局に押収されるまでCSAMとか著作権侵害素材のホストになったら?
そして、もし君のハードウェアが社内ネットワーク上の特別な特権的な場所にいたり、価値ある資産のあるVPCを運用してて、それが国家レベルの脅威アクターに侵害され、乗っ取られたら?それでもまだ”君のハードウェア、君の選択”かな?それとも君の悪い選択は他の人にも影響を与えるのかな?