ひげさんのチラ裏だったりカンニングペーパーだったり学習ノートだったりする所です。

概要とか経緯

  • 過去、GoogleChromeの横幅が縮められない現象に陥った
  • 都度何とか対策方法があったが、それが再び使えなくなり、鬱が再発 (誇張)
  • 再びダウングレード以外で何とかしたかったので奮闘 → 成功
  • モバマスとかグラブルとかガルフレとかの一部ユーザーさんが助かりそうな情報だと思います

判明している副作用

AmazonPrimeでのビデオ再生でエラーが発生する副作用情報があります。 書き換えによりファイル固有のチェックサムが変動し、それを検知するような一部の厳格なサービスでエラーが発生するのだと推測しています。

Chromiumを対象とした後続の記事

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

注意

  • 自己責任でオナシャスです (バックアップは取っておいてください)
  • Chromium でも使えましたが、本記事に乗せる情報は GoogleChrome 前提です
  • バージョンによっては使えない手法かもしれません。記事を注意深く読んでください
  • Official Build 64ビット版のみ前提としています

※「ウィンドウとして開く」ショートカット版と異なり、ブックマークバーやアドレスバーも消えません。

先に結論(?)

  • Chrome.dll をバイナリ編集
  • 内部にある最小幅の限界値を上書きする
  • 再び鬱が完治!!!!!!しあわせ!!!!!!!

手順

バイナリエディタを入手

ファイルの内部データを書き換えることに特化したソフト みたいなものです。 某 プ〇アクションリプレイとか、ああいうノリで書き換えると言えば、伝わる方も多そう。

バイナリエディタ あたりでググって、自己責任のもと適当なエディタをダウンロードして使ってください。 初心者の方でもワリと直感的に使えると思います。

編集の際には「上書きモード」と「挿入モード」というのに分かれていると思うので、必ず上書きモードで処理を行ってください

※ ちなみに自分は QuickBe というソフトを昔から使いづつけています..配布も更新もとっくの昔に終わってると思いますが。

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 に名前を戻せば元のファイルとして使えます

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

データ検索

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

検索データ / 書換データ

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

※書き換える時のバージョンが一致している事も必ず確認し、書き換え後は一度別名で保存するなどしてください


2019/05/22 時点 :: 74.0.3729.169

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

でデータ検索すると、1件だけヒットすると思いますので、

そこの一部分を以下のように書き換えます。

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

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


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

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

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

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

ブラウザの横幅下限緩和

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

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


もしかして:無課金タイマー

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

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



やった事や、その流れ等

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 でも行けるとは思いますが、「キリのよい下限サイズ」にしたほうが、ドラッグでサイズも下げやすいと思いますので、実質このくらいが良いのではないかなと個人的には思います。

つかれた

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

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

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

この記事へのコメント

まだコメントはありません