2012年8月24日金曜日

[ThinkPad Edge E430] 2つ目のリカバリメディア作成法

ようやく2つ目のリカバリディスクを作ることができました。(作成方法だけを知りたい人は、こちらにまとめを書いてありますので、そちらをご覧ください。)

転売対策か何かの理由(ライセンスの問題?)で、リカバリディスクは1部しか作れないようになっているようですが、DVDに焼いたものは保存性にどうも疑問があります。以前TVドラマをDVD-Rに焼いていたのですが、ほんの1ヶ月くらいで読めなくなったことがありました。怪しいDVD-Rを使うからだ!と言われればそれまでですが、それ以来DVD-Rよりは保存性がいいと言われているDVD-RW(もちろん国内メーカーのもの)を使うようにしていますが、それでも使えなくなったらと思うと心配です。

話がそれました。
いったんはDVDにリカバリを作ったものの、やはりUSBメモリにリカバリメディアを用意したいと思いました。が、一度作ってしまったらそれを許してくれません。WEBをいろいろ見てみると、リカバリメディアの作成に失敗してしまってもう二度と作れなくってしまった人もいるようなので、そういう人のためにもここに方法を記録しておきたいと思います。

できるだけ簡単な方法として、リカバリメディア作成処理の本体であるrecovburncd.exeにパッチを当てるプログラムを書こうと思ったのですが、このexeはデジタル署名がついていて改造が困難なこととそのプログラムを作る時間がないので、手動での操作手順だけ示したいと思います。
前置きが長いですが、この方法はちょっと面倒且つ難しいです。慣れていない人はそれなりの根気が要るかもしれません。また、この方法が適用できるのは今のところ特定のバージョンのrecovburncd.exeに対してのみです(ファイルサイズ504120byte、更新日時2012年3月22日13:18:54のもの)。他のバージョンでは、下記手順のアドレスを調整しなければいけないでしょう。

では、方法です。

  1. ここのページからWinDbgをダウンロードしインストールします。
  2. WinDbgを「管理者として実行」します。
  3. 「File」→「Open Executable」メニューを押して、c:\Program Files (x86)\Lenovo\Factory Recovery\recovburncd.exeを開きます。
  4. 「Save information for workspace?」と聞かれたら、Noを押します。
  5. Commandウィンドウで lm [ENTER] とタイプします。モジュールの一覧が表示されますので、少しスクロールバックしてモジュール名=rec7burncdを探します。そのstartアドレスを控えておきます(通常は00400000hになります)。
  6. Commandウィンドウで bp 0x40c7fc [ENTER] とタイプします。この0x40c7fcの部分は、前の手順で控えたstartアドレスに+C7FChを加えたものとします。
  7. g [ENTER]とタイプします。Commandウィンドウの最終行が
    0040c7fc e85f0d0000 call rec7burncd+0xd560 (0040d560)
    と表示されていればOKです。そうでない人はrecovburncd.exeのバージョンが異なっていると思われます。あきらめるか、何らかの方法でオフセット値を再調査しなければいけません。
  8. 次に「F10」を1回だけ押してください。しばらく*BUSY*表示となったあと、再びプロンプトに戻ってきます。このとき4行くらい前にeax=00000001と表示されている場合はリカバリ作成済みです。一方、eax=00000000と表示された場合リカバリはまだ作成されていません。このeaxを強制的に00000000に書き換えることでリカバリ作成処理に移ることができるようになります。
  9. r eax=0 [ENTER]とタイプして、eaxレジスタの値を1→0に書き換えます。
  10. g [ENTER]とタイプして続きを一気に実行します。
    以降は、リカバリメディアの作成を行うダイアログが表示されて処理を進めることができるはずです。

私はこの方法で新たにUSBメモリにリカバリメディアを作成することができました。これで4枚ものかさばるDVDを管理しなくて済みます。
しかし、私の場合このUSBメモリからブートすることができませんでした。調べてみると、USBメモリ上のリカバリ用パーティションがactiveになっていない、MBRにブートコードが書き込まれていないということのようです(リカバリメディア作成中にブートコードを書いてくれない仕様なのかなあ)。
その後もいろいろと検索してみたのですが、書き込み済みのUSBメモリのMBRにブートコードだけを書き込む方法がなかなか見つかりませんでした。仕方ないので、MBMをUSBメモリにインストールしました。幸いネットワークブートできるMBMを用意してあったので、そこからPCをブートしてUSBメモリにMBMをインストールしました(通常はCDブートの方が簡単かも)。ついでに、パーティションもアクティブにしておきました。
ようやくUSBメモリ版リカバリメディアが用意できました。

8 件のコメント:

  1. 更に調査したところ、もっと簡単な方法が見つかりました!

    C:\Program Files (x86)\Lenovo\Factory Recovery\recovburncd.exeファイルをバイナリエディタで開いて、次の10バイトの16進数データを検索します。

    3A 00 44 00 6F 00 6E 00 65 00

    そしてこのデータをすべて00に書き換えて保存します。私のE430では、このデータはE744h~E74Dhに見つかりました。
    その書き換えたrecovburncd.exeを使えばリカバリメディアを作ることができるようです。

    ちなみに上のデータはUnicodeで":Done"という文字列になっています。これがあると、Q:\FactoryRecovery\recovery.iniファイルが開けなくなって「リカバリ済みです」という例のメッセージが出るようになっていることを突き止めました。ということは、リカバリが終わったときにrecovburncd.exeは自分自身に":Done"を書き込んでいるのだろうか?このあたりはもう少し検証が必要そうです。

    返信削除
  2. すごい!
    ネットを見ていて久々に「これは良い事を知った!」と思いました

    最初は「iniファイルで管理しなくなったのであれば、単純に別ファイルにしたか、レジストリか?」と推測していたのですがまさかexe本体にフラグ的なものを仕込むとは!しかも文字列とは

    自分もつい先日E430を購入しましたので(まだ届いていませんが・・)今後も色々と参考とさせて頂きます!

    ※前の記事の「E420のようにはいかない」情報も大変有益でした!危うく鵜呑みにするとこでした。

    返信削除
  3. コメントありがとうございます。

    先の投稿で
    「リカバリメディア作成終了時に、recovburncd.exeの実行ファイルから":Done"という文字を消しているのではないか?」
    と書きましたが、そうではないのかもしれません。

    例の":Done"という文字は、"Q:\FactoryRecovery\recovery.ini"という文字と連結されて、"Q:\FactoryRecovery\recovery.ini:Done"というファイル名としてファイルをオープンしようとしているようなのです。このコロン':'を含む特殊なファイルを開くことができるかどうか?でリカバリメディア作成済みかどうかを判定していて、リカバリ作成後は"recovery.ini"という普通のファイル名にリネームしているのではないかという推測です。
    通常はコロン':'を含むファイル名のファイルを作ることはできないので、これが一般ユーザに対する「複数メディア封じ」になっていると考えましたが、私はこのことを知る前にリカバリメディアを作成してしまったので、もともとこういう名前のファイルがあったかどうかはもう分かりません。どなたか、E430でリカバリメディアを作る前の方がいましたら、Q:\FactoryRecovery\のファイルに注意してみてください。できればexplorerだけでなくコマンドプロンプトからdirとかattribでファイル名を確認してみて、よければここで教えてください。

    返信削除
  4. 某掲示板を見ていて「ファイル名の:DoneはNTFSの副次ストリームじゃねーの?」とありました

    とりあえず先日自分もE430が届きましたのでリカバリメディア作成前にQ:\FactoryRecovery配下をdir /r で見てみたら:Doneぽいのがいました
    (/rオプションは代替ストリームを表示するオプションだそうです。代替ストリーム=副次ストリームなのかな?と思っています。不正確ですみません)

    以下がコマンドの結果

    ★ここから★

    Q:\FactoryRecovery>dir /r
    ドライブ Q のボリューム ラベルは Lenovo_Recovery です
    ボリューム シリアル番号は 70FF-86FA です

    Q:\FactoryRecovery のディレクトリ

    2012/09/08 22:16 3,986 bcdinfo.txt
    2012/09/08 22:16 11,339,956,803 cdrivebackup.wim
    2012/09/08 22:16 51,200,000 flush.dat
    2012/09/08 21:38 25,394 populateini.log
    2012/09/08 22:16 868 RECOVERY.INI
    4 RECOVERY.INI:Done:$DATA
    2012/09/08 21:38 309,579,788 sdrivebackup.wim
    6 個のファイル 11,700,766,839 バイト
    0 個のディレクトリ 7,076,622,336 バイトの空き領域

    Q:\FactoryRecovery>

    ★ここまで★

    自分は恥ずかしながら副次ストリームというものを知らなかったので色々と試しながらやりましたが、
    コマンドプロンプトでテキストエディタの引数にQ:\FactoryRecovery\RECOVERY.INI:Doneを与え実行してみたところ中身が参照でき、内容は以下の一行でした
    0△
    ※△は半角スペースです
    ※行末にCRLFで改行あり
    と不明な内容でした

    バイナリエディタで参照したところ
    30 20 0D 0A
    とテキストエディタで参照した内容と変わりありませんでした。(30→0、20→スペース、0D 0A →CRLF)

    リカバリメディア作成済みの環境でRICOVERY.INIに副次ストリームが存在していなければこれを元にリカバリメディア作成可否の判断をしているのかもしれませんね


    とりあえず下記に実施した際のメモ的なものを書いておきますね(人様のブログなのに!)

    ・テキストエディタはサクラエディタを使用(notepadだと拡張子.txtがおまけで必ず付いてくるのでファイル名:副次ストリーム.txtなんてものができてしまう)
    ・バイナリエディタはBzを使用
    ・副次ストリーム参照はテキストエディタのパラメータに「ファイル名:副次ストリーム名」を指定
    ・副次ストリーム作成はコマンドプロンプトで以下のコマンドを実行
    echo test > ファイル名:Done
    ・↑だと副次ストリームDoneの内容が「test」になっているのでテキストエディタで開いて編集
    ・副次ストリーム削除は本体のファイルを消せば消えます(当然ですよね)
    ・副次ストリームはNTFSの機能なので異なるファイルシステムにファイルをコピーすると副次ストリームの情報が欠落する(これも当然すね)

    以上が調べた結果です。長文で申し訳ありません。
    また見当違いな内容でしたらすみません・・

    返信削除
    返信
    1. Hooah!さん、有益な情報ありがとうございます!

      「副次ストリーム」・・・ですか。知りませんでした。

      MSDNとかで調べると、確かにBackupRead/BackupWrite/BackupSeekというようなAPIが用意されていて、副次ストリーム(代替ストリーム?)にアクセスできるようですね。
      これまでいろいろとアプリを作ってきましたけど、使ったことも聞いたこともありませんでした。勉強になりました。

      いただいた情報からすると、

      echo 0 > recovery.ini:Done

      とかやると、再度リカバリメディアが作れるようになるのかな。"0"の後ろのスペースやCR-LFも必要かも知れませんね。
      いまは元HDDが手元にないので、後日試してみたいと思います。

      おもしろい情報をありがとうございました。

      削除
    2. 元のHDDに戻して試してみました。

      結論としては、副次ストリーム":Done"があるかないかの違いが、リカバリ済みかどうかの判定基準になっているようです。
      つまり、リカバリ前はrecovery.iniに副次ストリーム:Doneがついており、リカバリ後はそれがなくなるということです。

      というわけで、コマンドプロンプトを立ち上げて

      q: [ENTER]
      cd \FactoryRecovery [ENTER]
      echo > recovery.ini:Done [ENTER]

      と打ち込んで副次ストリームを追加してやれば、再度リカバリメディアを作ることができるようになりました。先のようなバイナリエディタでごにょごにょというのは必要ありません!
      ちなみに、副次ストリームの内容は問われないようです。

      これをされる方は基本的に自己責任でお願いします。作業前に念のためにrecovery.iniのコピーをとっておいた方がよいでしょう。

      削除
  5. 素晴らしい!出来ればコメント欄の追記分も
    別エントリでまとめてもらえると有難いです。

    ところで、以前のEdgeシリーズですとリカバリ先では
    リカバリを作成できない(cdrivebackupファイルが異なる)
    のですが、これについても元のcdrivebackupファイルを
    バックアップ取っておいて、リカバリ先へ移植すれば
    作成OKということなんですかね。

    参考
    http://www45.atwiki.jp/e420_think/pages/16.html

    返信削除
    返信
    1. コメントありがとう。

      確かにここは返信が多くなって見づらいですね。別エントリで総括したいと思います。

      それから、この書き込みは何も考えずにリカバリメディアを作ってしまった人が、もう一度(と言わず二度、三度と…)メディアを作りたい人のためと思って書き込みました。
      本当の意味での「工場出荷状態」を保存しておきたい人はリカバリメディアを作る前にHDDのイメージをバックアップしておけばよい訳で、この私の書き込みとは無縁ですね。
      試してはいませんが(というかもうcdrivebackupが分割されてしまったあとなので確認できないのですが)、おそらくはQドライブのファイル構成をそのままコピーしておけば、リカバリを作成できる状態が完全に保存されるのではないでしょうか。

      削除