Kaby LakeとRyzen をブロックする更新、調べてみたら記事とちょっと違った話

最新CPUのWindows Updateを阻止するMicrosoftの施策を無効化してWindows 7/8.1でも自動更新できるパッチを有志が作成 - GIGAZINE

有志の1人であるZeffy氏は、KB4012218をリバースエンジニアリングしたところ、KB4012218を通じて提供された2017年3月版の
wuaueng.dllの中に「IsCPUSupported(void)」と「IsDeviceServiceable(void)」という2つの新規
機能を発見しました。Zeffy氏によると2つの追加機能によってWindows
Updateを受けるPCのCPUをチェックしており、これらの関数を「1」に書き換えることで、マシンのCPU情報を「supported
CPU」と変更して、CPU検閲による更新プログラム配布のブロックを回避するとのこと。

気になってたので調べてみた。

 SUB_L500717B5:
          cmp    dword ptr [L50225E38],00000000h
          jz     L500717FC
          call    SUB_L500BCEF9  // <- IsCPUSupported?
          mov    [L50225E3C],eax
          call    SUB_L50195F4E // <-  __AreTestKeysAllowed()  ?
          test    eax,eax
          jz     L500717F5
          push    00000001h
          push    00000000h
          push    SWC50071804_ForceUnsupportedCPU
          push    SWC50071830_SOFTWARE_Microsoft_Windows_Curre
          push    80000002h
          call    SUB_L5018FF8A
          cmp    eax,00000001h
          jnz    L500717F5
          and    dword ptr [L50225E3C],00000000h
 L500717F5:
          and    dword ptr [L50225E38],00000000h
 L500717FC:
          mov    eax,[L50225E3C]
          retn
;------------------------------------------------------------------------------
          Align    4
 SWC50071804_ForceUnsupportedCPU:
          unicode    'ForceUnsupportedCPU',0000h
          Align    8
 SWC50071830_SOFTWARE_Microsoft_Windows_Curre:
          unicode    'SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Test\Scan',0000h

IsDeviceServiceable.asm ・ GitHub
zeffy 氏のソース見て見ると、 IsDeviceServiceable とか IsCPUSupported と言う関数が存在する訳ではないらしく、 その関数に便宜的に名前を付けたらしい

で、どうやらレジストリで強制的にサポートを有効にするものがあるのだけど、それがUpdate Services\autest.cab にはいっている AreTestKeysAllowed と言う関数によって有効にするかどうか制御されているようだ。

その部分がいじれないので、AreTestKeysAllowed が強制的に1になるように小細工して、レジストリ 'SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Test\Scan の ForceUnsupportedCPU を 1に設定して、強制的に非サポートのCPUとしてふるまわせることも可能にできるらしい。

実際、コードエリアを書き換える必要はなく、X86版の場合は、
L50225E38 を 0、L50225E3C を 1にするだけで、機能するはずなので、コードを書き換えてるわけではなく、コード上の変数領域を書き換えてるだけと言うオチだということが分かる。

最後にまとめ

「IsCPUSupported(void)」と「IsDeviceServiceable(void)」という2つの新規機能関数を発見しました。
Zeffy氏によると2つの追加機能関数によってWindows
Updateを受けるPCのCPUをチェックしており、これらの関数この関数の設定する変数を「1」に書き換えることで、マシンのCPU情報を「supported
CPU」と変更して、CPU検閲による更新プログラム配布のブロックを回避するとのこと。

修正するとこういう事

Zeffy氏は、「公開した解決策の唯一にして最大の欠点は、wuaueng.dllの内容が更新される度に新しいパッチを適用する必要があることです」
とのことだけど、処理が、シンプルなので、恐らく自動でパッチを当てることもできると予測できるし、DLLインジェクションを行えば、パッチ当てなくても済むんじゃないかなと思います・ω・

おすすめ

2件のフィードバック

  1. 名無しのプログラマー より:

    wuauengは改ざん防止の対象(今に始まったことではない)なので、
    どのみちホットパッチが実践的かと。

  2. 名無しのプログラマー より:

    wuauengは改ざん防止の対象(今に始まったことではない)なので、
    どのみちホットパッチが実践的かと。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です