Chromeの横幅最小制限をバイナリ書き換えで撤廃させる

概要とか経緯

注意

手順

1. バイナリエディタを入手

ファイルの内部データを書き換えることに特化したソフト みたいなものです。 某 プ〇アクションリプレイとか、ああいうノリで書き換えると言えば、伝わる方も多そう。 バイナリエディタ あたりでググって自己責任のもと適当なエディタを使ってください。 簡単なUIのものなら、初心者の方でも結構直感的に使えると思います。

2. Chrome.dll を引っ張り出す

インストール済みのChrome本体が置かれた場所をPCから探してください。
自分はおおよそ以下の場所にインストールされていました。

C:\Program Files (x86)\Google\Chrome

そこから更にフォルダを辿って Chrome.dll を探します

C:\Program Files (x86)\Google\Chrome\Application[バージョン値]\Chrome.dll

アクセス権限の関係があるので一度デスクトップなどに Chrome.dll をコピーし、そこで後述の編集作業をしてください。 また、念のため 同じフォルダ内に Chrome.dll.bak といった風に、名前を変えたファイルをバックアップしておきましょう。 最悪、書き換えに失敗して破損しても、そのファイルをコピーして Chrome.dll に名前を戻せば元のファイルとして使えます

3. バイナリエディタで Chrome.dll を編集

3-1. データ検索

バイナリエディタには十中八九「データ(バイナリ/HEX)検索」と呼ばれる機能が付いています。
テキストエディタで言うところの「文字検索」機能と同じです。 ただ、扱うのがバイナリという特質上、 1F A5 09 82 55 14 AB 3C 2F FD.. のような16進数の羅列でファイル内を検索します

3-2. 検索 & 書換データ

バージョンが変わると、検索データ変わってしまったり ヒットしたと思っても全く関係ない箇所だったりする事がしょっちゅうありますので、この辺りは必ず念頭においてください。以下はすべて Official Build x64 前提となります。

以下の項目でデータ検索すると 1件だけヒットする筈なので、その一部を書き換えます。


4C CD 31 D2 85 C9 0F 48 CA 85 C0 0F 48 C2

4C CD 31 D2 B9 54 01 00 00 85 C0 0F 48 C2

8B 0B 31 D2 85 C9 0F 48 CA 85 C0

8B 0B 31 D2 B9 54 01 00 00 85 C0

31 D2 85 C0 0F 48 C2 85 C9 0F 48 CA 41 89

31 D2 B8 54 01 00 00 85 C9 0F 48 CA 41 89

31 D2 85 C0 0F 48 C2 85 C9 0F 48 CA 41 89 07 41

31 D2 B8 54 01 00 00 85 C9 0F 48 C2 41 89 07 41

どのバージョンであっても書き換え箇所は必ず1件なのですが、共通値だけで検索を掛けると関係ない箇所も多数ヒットしてしまいます。(敢えて長く表記しているのはその為) 今のところ 31 D2 85 C9 0F 48 CA 85 は共通しているっぽいので、今後また検索箇所が変更された場合は、複数ヒットするであろうこの値を足掛かりに、自力で1つずつ試していくのもアリだとは思います。


↓以下バイナリエディタの編集イメージ (画像古め)

undefined.jpg

4. 書き換えた Chrome.dll をオリジナルの物と差し替える

※ 差し替え(上書き)する際、GoogleChrome は予め全て終了させてください

先ほども書きましたが、セキュリティ権限の観点から インストールフォルダ内にある Chrome.dll の直接編集(上書き)が、バイナリエディタ経由で出来ないケースがあると思います。

その場合は、一度デスクトップなど別の場所に書き出した Chrome.dll (編集済み)を、再び Chromeインストールフォルダ内にドラッグアンドドロップして、ファイルを置き換えるような上書き手法をとってください。

5. ブラウザの横幅下限緩和を確認

バイナリを書き換えた Chrome.dll に差し替えたのち、GoogleChromeを起動させ、ブラウザの横幅の最小制限が緩和されているのが確認できれば成功です。

そもそも起動しない場合は上手くいっていない可能性が高いです。 また、書き換えた筈なのに緩和されていない場合も「意図していない場所を書き換えてしまったが、なぜか起動している」という宜しくない状態になっているかも知れません。

アステールちゃんはかわいいなあ
もしかして:無課金タイマー


おまけ:Chromiumを対象とした記事

サブブラウザとして、比較的最近(執筆時)のChromiumを弄り、横幅を撤廃させる手法も別記事として公開しました。
基本的にやっていることは同じで、書き換えの値も(恐らくは)同じもので通るのだと思います。
ビルド済みChromiumを入手して、横幅の下限緩和を行うまでの道筋


**手順だけ知りたい人用の項目ここまで**

以降は、この手法にたどり着くまでに試行錯誤した知見などの一部を記した記事・メモとなります。


やった事や、その流れ等

x64dbg の存在

https://x64dbg.com/

以前調べ物をしているときに偶然見つけた改竄手法として挙がっていたのがこのツールでした。 知識ゼロのところから、見様見真似で使い方を覚え、アセンブリを齧り…試行錯誤の上、今に至ります。

この神ツールが無ければ、きっと諦めていたことでしょう。

Chromium のソースコード群

https://cs.chromium.org/
GoogleChromeの派生元であるChromiumはオープンソースで開発されており、コードを読むことができます。  当然、GoogleChromeとは異なりますが、大まかな構造は同じなので「Chromiumが改造できれば、ある程度の応用が効くだろう」と確信していました。

時間をかけてコードを洗い出し、アセンブリと見比べたりしてトライアンドエラーの日々..という作業過程で、このサイトは大変助けになりました。

また、Chromium版ほどの利便性はありませんが、GoogleChrome も、ソースコードが見られます https://chromium.googlesource.com/chromium/src/+/master/

アセンブリ

プログラムのソースコードは「ワタシ チョット ヨメル」レベルなのですが、機械語..を少しだけ人が読めるようにしたアセンブリ言語には全く馴染みがありませんでした。 とにかくググって覚えたり x64dbg と併用して掘り下げていくことで、「雰囲気でちょっと読めるかも」程度にはなりました。

アセンブリのマッピング

x64dbgの 参照文字列検索機能で、ソースコード内の文字列と予測・紐づけを行い、そのメソッドと思わしき個所を特定していく..という地道な作業でした。 うまく合致できれば、あとはその関数ブロックから呼ばれている(call)ところも芋づる式に特定出来たりと、大変ながらも捗りました。

また、メモがデータベース形式で書きだせるので、(かなり重かったですが)一行一行覚書を割り当てられるのも助けになりました。

何が起こっているのか

※ 個人的な解釈を含みますので、事実と異なっている可能性があります。

Chromiumのレイアウトは、このような仕組みになっているようです https://cs.chromium.org/chromium/src/chrome/browser/ui/views/frame/browser_view.h?l=693

BrowserView という大きな枠組みがあり、その中に様々なレイアウトが子・孫等として格納されています。 最初は、アドレスバー・ツールバーの類を弄るのだと予測を立てて探っていましたが、思い返せば、結果的にそちらより BrowserView 自体のサイズをいじる方向が適切であったように思います。

BrowserView クラスの中で、 BrowserViewLayout クラスが使われています。

https://cs.chromium.org/chromium/src/chrome/browser/ui/views/frame/browser_view.h?l=584 https://cs.chromium.org/chromium/src/chrome/browser/ui/views/frame/browser_view.cc?g=0&l=2646

BrowserViewLayout クラスを覗いてみると… https://cs.chromium.org/chromium/src/chrome/browser/ui/views/frame/browser_view_layout.cc?l=65

gfx::Size BrowserViewLayout::GetMinimumSize(const views::View* host)

という「如何にも」なメソッドが見つかります。

https://cs.chromium.org/chromium/src/chrome/browser/ui/views/frame/browser_view_layout.cc?l=172

constexpr gfx::Size kMainBrowserContentsMinimumSize(500, 1);

メソッド内にこの処理があり、この 500 という値が、BrowserView の最小幅であるのだと仮説を立てました。

アセンブリのマッピングと併せて、BrowserViewLayout::GetMinimumSize() の場所をバイナリ(アセンブリ)上で特定し、 一部を弄って必ず指定の値を返すように仕向ける、といった寸法です。

54 01 00 00 の値は書き換え後の下限幅に相当し、0x154 (16進数表記) すなわち、実数 340 を表します。
この値を調節すれば下限自体を弄れますので、必要に応じて変えてください。 0 でも行けるとは思いますが、「キリのよい下限サイズ」にしたほうが、ドラッグでサイズも下げやすいと思いますので、実質このくらいが良いのではないかなと個人的には思います。

つかれた

一か月くらい掛けて、知識ゼロからほぼ毎日コツコツと作業してきました。
諦めなくてよかったです。

もっとスマートな方法があるのかもしれませんが、表に出てきてない(観測できていない)ので、きっと容易には変えられないものなのでしょう。

汎用性の高そうな書き方にしているつもりですが、掲載している検索値が今後再び使えなくなった場合 まだやる気が残っていたら記事を更新させると思います。