リンクフリーを近日中にとりやめる予定です

すでにリンクを貼っていただいている方、ご一報頂きたくお願い申し上げます。


ごく少数ですが、リンクをお断りする場合があります



ブログ内 風景光景カテゴリー

続編記事などをご希望の方は こちらへどうぞ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[検索語彙への応答] 信長の野望 嵐世記 (7)

今回も「嵐世記 攻略」などで検索サイトから訪れるヒトへの応答。



なかには、攻略するツール等を探して当ブログを訪れるヒトもいることだろう・・・

パワーアップキットに付属する武将データの編集機能を利用すれば、だいたいプレイヤーの想いに近い状況を作り出せる。
一方、武将の健康状態、実親や義理親といった出自、敵国に潜伏させる忍者の能力や派遣期間、城郭の最大防御度合、国の石高 (その地域の米の収穫高) などは変更できない。
さらに、ミッションチャレンジでは編集機能が使えないなどの制限がある・・・

お知らせ
活動休止にともない、この記事を事前に予約投稿してあります。
トップ記事の固定を目的としています

「嵐世記 攻略」という単語で検索サイトから訪れる方々の全てに対してではないが、中には
攻略用アプリそのものをダウンロードできる場所やソースコードを探していたヒトもいるようだ。
それらに直接応じることは、わが国の法律に抵触する恐れもある。

嵐世記が発売されてから10年以上経つ。この世代のゲーム等のデータを書き換えるには
ディスク上にセーブされたデータを変更する
現在プレイ中のデータ、つまり PC のメモリ上の数値を直接書き換える
などが考えられる。

ディスク上に保存されたデータを改ざんすることは、一見簡単そうに思える。バイナリエディタで開いてみれば16進数が並んでいることを確認できる。



しかし、案外うまく行かない。データを生のまま保存するアプリも多い。が、作り込まれたアプリであれば保存する際に暗号化する。つまり、生データのまま保存しない。
例えば、嵐世記の前にリリースされた烈風伝のデータは、特定の数値をビット演算することで生データに変換できた。しかし、ほかも含め、生データに戻すカギとなる数値が毎回同じとも限らない。毎回カギとなる数値を算出するとなると手間がかかる・・・

となると、プレイ中にメモリ上の数値を書き換えるのが良いだろうか?
古くからプロセスメモリエディタやデバッガと呼ばれるフリーウェアが存在しており、起動中アプリのデータ領域を確認したり書き換えることが出来た。これらツールは本来、アプリの開発中にバグを探す、想定外の動作をする要因を突き止めるのに役立てるものだ。が、ゲームのパラメータ書き換えにもしばしば使われる。

予め述べておくが、無闇に書き換えることはアプリの暴走を引き起こす可能性がある。
そもそも、メモリ上の数値を書き換える行為はセキュリティ上好ましくない。悪意のあるアプリなどはこの手法で外部からバッファオーバーランを仕掛けてくる場合もある。

Windows Vista 以降、Windows 7 、Windows 8 などでは外部からメモリ内容を簡単に書き換えられないような仕組みが加わった。ASLR と呼ばれるアドレス空間配置のランダム化やカナリアやクッキーを用いてのスタック領域保護などなど。
スタック領域保護はアプリを作る側の課題であり、一般的にアプリを使うヒトであれば気にする必要はない。
※ Visual Studio 2005 以降は「クッキーによるスタック領域保護」機能を持ったアプリを作成可能。

メモリエディタの紹介や使い方について扱っているサイトは多々あります。それらをお望みの方は他所様のサイトをご覧いただきたい。
ここでは、陥りがちな点を述べます。不慣れな段階においては、
確認する際、データの並び順を勘違いし易い
過去記事、2012年 8月17日分でビッグエンディアンとリトルエンディアンについて触れてあります。

例えば、999という数値を探したいとしましょう。
私たちが日常的に使う10進数で考えると999です。一方、PC の中では 2進数で扱われ、16進数で表現されます。
10進数は一桁が0から9となり、9の次は10。それに対し、16進数は9の次はA,その次はB・・・と続き15を表すFの次が一桁繰り上がって10といった具合・・・

999を16進数で表すとどうなるか確認してみましょう。特別なツールは不要です。Windows に付属している電卓で変換できます。
電卓を起動し、「999」を入力。



画像はWindows 7 で電卓を起動した例、メニューバーの表示(V) をクリックし、関数電卓に切り替えてあります。
「16進」のラジオボタンをクリックすれば、16進数に変換されます。



電卓には 3E7 と表示されているはずです。
16進数で32ビット幅の数値を現すと8桁、64ビット幅の数値は16桁になります。32ビット幅ならば、000003E7 と表すべきですが、冒頭のゼロが5桁続く部分は省略されています。

16進数のE は14を意味します。
10 進数で999 を (9 * 10 * 10) + (9 * 10) + 9 と書けます。意図的に各桁を括弧で括ってありますが、本来括弧は不要。
同じように「3E7」を紐解くなら
(3 * 16 * 16) + (14 * 16) + 7 となり、
768 + 224 + 7 = 999

さてさて、バイナリディタやメモリエディタ等で 999 という数値を探したい場合、検索語として 3E7 や 03 E7 と入力してしまいがち。そして、見つからないことも・・・

過去記事、2012年 8月17日分で述べたように、データの並び順が異なっている場合があります。
00 00 03 E7 ではなく、
E7 03 00 00 の順や
03 E7 00 00 の順で数値が格納されているかもしれません・・・

さてさて、ミッションチャレンジモードの中に
・織田信長公で鉄砲を三千挺を集める
・大友義鎮公で大砲を15門集める (大友義鎮は大友宗麟公の若い頃の名前)
などのシナリオが含まれています。

通常のゲームであればパワーアップキット付属の編集機能から、大名家の財政状況を変更できる。
嵐世記のミッションチャレンジモードでは編集機能が使えない。ミッションクリアしないかぎり次の章へ進めない。
「嵐世記 攻略」というキーワードで検索サイトから訪れた方々は、この辺を解消したくてアレコレ検索していたのではないだろうか。

ゲーム画面左上に軍団長の画像と、金銭、兵糧、兵士、軍馬、鉄砲、大砲の各数値が表示されている。
それに加え、メモリエディタの使い方や16進数の並び順について判ってしまえば解決のヒントが見えてくるハズ。

かつて嵐世記の武将データの構造が詳しく掲載されているサイトがあった。現在閲覧できるか否か不明。
それらの情報を基に、標準の編集機能では不可能な部分を変更できる。病気や怪我から復帰したり、誕生年や親など出自の変更も可能。
ゲーム中、義理親が設定されている武将は親が仕官している大名家に仕官する仕組みとなっている。義理親や誕生年、登場年を変更できることを応用し、特定の武将を自動的に仕官させるように変更するのも面白だろう。
例えば、豊臣秀吉公子飼いの福島正則、加藤清正、加藤嘉明といった猛将が有名である。もし、豊臣秀吉公がプレイヤー大名家の一員であれば、子飼いの猛将たちもプレイヤー大名家の一員に加えたいところだ。
初期設定のままであれば、これら猛将は浪人として登場する。浪人を召抱えるには滞在地で登用を行うことになるが、大名家の知名度が低い、運が悪いなど条件によっては他大名家に仕官するかもしれない・・・

実際のところ、16進数と睨めっこしながら多数の武将データに変更を加えるのは手間がかかります。その辺がデータ修正用アプリを作るきっかけでした・・・



ところで、この種の話題は
メモリを直接書き換えるツールを作るにはどうしたら良い?
に行き着きがちです。
外部からのメモリ書き換えはセキュリティ上、避けたいところです。
これより後に述べるのは、あくまでも、アプリ開発時にメモリ内容を確認したかった際の例です。アプリが順調に動いているか確認するためメモリに書き出す内容を別のアプリから監視する必要がありました。
根本的に、Visual Studio 等の統合開発環境にデバッガが付属しています。昨今のデバッガは強力になりスレッドや外部モジュールまで深追いでき、深い問題点の検出も可能です。しかし、数世代前の統合開発環境に付属していたデバッガでは深追いできなかった事があり、検証ツールを自作したことがあります。

OS を Windows に限定して言えば、デバッグの補助機能に関する関数 ( 機能 ) が備わっています。それら関数を利用することで他アプリの利用しているメモリ空間を確認できます。



その頃の手順は以下の通り。
・プロセスと、プロセスが使っているヒープ、モジュール、スレッドのスナップショットを作成
・得られたハンドルから指定されたプロセスのメモリ領域からデータを読み取る
・スナップショットで得られたハンドルを返却するため CloseHandle 関数を呼ぶ

細かく知りたいヒトは ヘッダーファイル tlhelp32.h や winbase.h を参照すると良いでしょう。

さてさて、C/C++ 言語を嗜んだヒトから
ポインタでアクセスしたい番地を指定すればメモリの読み書きが出来るのでは !?
との声も聞こえてきそうです・・・たしかに、不可能とは言いませんが危険極まりない・・・
そもそも、たいてい C/C++ 言語の教本等で扱っているのは単一のアプリ作りと、その範囲内でのメモリの読み書き。ここで行いたいのは複数の異なるアプリ間でのメモリの読み書き。
自宅にある冷蔵庫の中を確認するのと、他人様のお宅にお邪魔して冷蔵庫の中を拝見させていただく位話が違う・・・
ほかにも、
Word や Excel で文字や図形などのデータを共有できる
などの声も聞こえてきそうです。これは、OLE と呼ばれるデータ共有の仕組みであって、両アプリがデータの共有すること前提に成り立っています・・・

C/C++ 言語の教本などに例題としてファイルの読み書きが登場します。おおまかに、ファイルポインタを取得、ファイルの読み書き、ファイルポインタを解放といった具合。
Windows 用のアプリを作る場合、ファイルポインタではなくファイルハンドルになります。つまり、ファイルハンドルを取得、ファイルハンドルを経由してファイルを読み書き、ハンドルを閉じるとなります。
その手順が飲み込めていれば、ファイルハンドルをプロセスのハンドル、ファイルをプロセスの使用しているメモリ領域に置き換えるだけで、手順を飲み込めることでしょう。

「~のスナップショットを作成」という部分が判り難いかもしれません。これは、現在 OS 上で動いているアプリの一覧表を作成することです。
関連する関数名が ~~First や ~~Next となっています。C/C++ 言語を嗜んだヒトならばお気づきのように、ファイル検索の際 _findfirst と _findnext 関数を用いるのと同様です。目的のプロセスと一致するまで while 文 や do-while 構文で繰り返し列挙してゆきます。
後はファイルの読み書きと同じような要領でメモリの読み書きを行います。
ファイルの読み書きと同様、ハンドルの取得に失敗していればメモリの読み書きは行えません・・・

参考までに記しておきます。Windows 用のアプリを作るならば、ファイル検索に用いる関数は _findfirst や _findnext 関数よりも OS 付属の FindFirstFileEx や FindNextFile 関数を利用する方が無難です・・・

・・・嵐世記の話にもどります・・・と、ここまで手間が掛かることを考えると、パワーアップキットに付属する武将データの編集機能で若干修正を加えるにしろ、いかに速やかに進めるか考えた方が有効です。

たしかに、「急いでクリアしたい」や「次のシナリオへ一刻も早く進みたい」と考えがちです。しかし、急いだ分その作品の持つ醍醐味を味わう機会を失います。

先に挙げた「鉄砲を三千挺を集める」や「大砲を15門集める」といった課題であっても地道に進めば解けるように練られています。
もし、難しいなら各月始めに軍団の配分、奉行の割り当てが適切か、出陣前の訓練が十分か、負傷兵の確認などが必要でしょう。戦毎に負傷兵数が激しいならば「合戦中の陣形や敵将への向い方を変えてみる。」、「負傷兵が回復するには3ヶ月ほど要するので、その間は出陣を控える。」など今までと異なる策を試みることが状況改善のきっかけになるハズ・・・

せっかく購入なされた作品、奥深さを味わうのもこれまた然り・・・

本日も最後までご覧いただきありがとうございます。

「つまらなかった」「判り辛った」という方もご遠慮なくコメント欄へどうぞ

テーマ : PCゲーム
ジャンル : ゲーム

コメントの投稿

非公開コメント

検索サイトからお越しの方へ
検索サイトからお越しの方は、ブラウザのアドレス欄vitalaboloveおよび、fc2.comが含まれているかご確認ください。
含まれていない場合、偽サイトを閲覧なされている可能性があります。

偽サイトは、当ブログの文字部分や画像部分が有害サイトへのバナーと置き換わっているようです。
プロフィール

Author:Vitalabolove
ご訪問ありがとうございます。
店長を任されておりますVitalaboloveです。

コメントはお気軽に。
今のところリンクフリーですが、あと数日でとりやめます。

画像データ、文言の引用は事前連絡くださるようお願い申し上げます。事前連絡の際は、左下、メールフォームを経由をご利用ください。

最新記事
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
カテゴリ
ランキング
いつも応援いただきありがとうございました。ただいま休養中につきランキングへ参加していません・・・

フリーエリア
内緒話などはおきてがみをご利用ください。
月別アーカイブ
メールフォーム
掲載された記事について、ご不明な点はここからお問い合わせください

名前:
メール:
件名:
本文:

最新コメント
最新トラックバック
スパムと思われるトラックバックは削除しました
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。