//////////////////////////////////////////   メモリエディタ2 for Windows95         MemEdit2 Ver1.2 Copyright (C),1998,M.Oshikiri ////////////////////////////////////////// 1.概要 Windows95上で動作するゲームのデータを、ゲーム実行中に更新することを目的にしたプログラムです。 スーファミやSS・PS等にあるゲーム改造ツールの様に、ゲーム中のパラメタを変更することができます。   主な機能は以下の通りです。    ・Windows95上で動作している32ビットアプリケーションのアドレス空間をダンプ表示し、     更新することができる。    ・表示は16進表示とシフトJISによる表示が可能。    ・16進データ、文字列データの検索ができる。    ・ProActionReplayライクなサーチ機能がある。    ・メモリの内容をファイルに保存、及び、メモリへ書き込みができる。    ・登録したメモリの内容が変わったら知らせてくれるメモリ監視機能がある。   アーカイブにはソースリストが添付されていますので、   自由に改造して使用してください。 2.必要なもの   このプログラムを実行するにあたり、必要な物を以下に示します。    ・VisualBasic5.0用各種ランタイムルーチン(DLL,OCX)      このプログラムはVB5でのみ書かれています。      もともとVB4で作っていたものをVB5でリコンパイルしたので、      ソースの随所に「なんで?」ってところがあります。      DLLがない等のメッセージが表示された場合、      申し訳ありませんが適当なところから持ってきてください。      アーカイブのサイズが大きくなるので、ソースファイル以外は添付していません。      どうしても手に入らないという方は、作者までメールなりでご連絡下さい。    ・知識      このプログラムはゲームデータの改造を目的としたプログラムです。      ゲームデータの改造にはある程度の知識と経験を必要とします。      スーファミなどでパラメタ探しを自分でしたことがあれば問題ないと思いますが、      Windows95のプロセス管理についてある程度知っていないと上手くいかないかもしれません。      またWindows95の基本的な操作方法や「バイト」等の意味について、知っているものとして      この文章は書かれていますので、わからないところは誰かに聞きましょう。      プロセス等については簡単な説明(ほんとに簡単。理解しやすいのではなく説明が簡単)を後述します。      また、アーカイブにはこのプログラムの全ソースファイルが添付されています。      このプログラムは基本的な機能しか持ち合わせていません。      使用者自身でカスタマイズして使用してください。      その場合、当然ですがVisualBasic5.0およびWindows95のプログラミング技術が必要となります。    ・覚悟      下手するとWindows95そのもの、最悪の場合ハードも再起不能になる場合もあります。      (こんなプログラムでなくとも、通常使っていてもその可能性はあるけどね)      少なくともセーブ機能があるゲームはセーブしておくことをお勧めします。      せっかく育てだキャラがなくなってもしょうがないという覚悟を持って下さい。      また、データをいじったキャラを友達に自慢して、友達を失っても知りません。    ・努力、根性、忍耐 そして 運      必要です、はい。 3.インストール及び実行方法   この文章を読まれているということは、既にアーカイブを展開されていると思います。   それでインストールは完了です。   いっしょに展開された MEMEDIT2.EXE を実行すれば起動できます。   DLLがない等のメッセージが表示された場合、   申し訳ありませんが適当なところから持ってきてください。   アーカイブのサイズが大きくなるので、ソースファイル以外は添付していません。   どうしても手に入らないという方は、作者までメールなりでご連絡下さい。 4.使用方法(例)   私もかなりハマったゲーム「DIABLO」のキャラデータ改造を元に、   このMemEdit2を使ってデータを改ざんする例をご紹介します。   始めに断っておきますが、データを改ざんして遊ぶことについては、   全て使用者の責任において行って下さい。   こんなプログラム作っておいてなんですが、   改造したキャラでは絶対にバトルネットに来ないで下さい。   迷惑です。   この例ではある程度知識がある方向けに書かれています。   10進−16進数変換など、暗算で出来るようになりましょう。   できない方は「計算ウィンドウ」を使って下さい。   なお、実際の画面、データ、アドレス等は著作権法に触れる恐れがありますので、   ここには書いていません。(よくわかんないけど〜)  (1)MemEdit2起動     別にゲームの起動後にこっちを起動しても問題ありませんが、     先に起動しておいた方がロード時間がかからないので。     DIABLOはCPUをかなり占有しますから。  (2)DIABLO起動     通常に起動してください。     起動後、マルチプレーを選択し(別にシングルでもいいけどさ)、     適当なキャラでゲームを開始してください。          なおこの例では Ver 1.00 を使用します。     最新のバージョンは 1.04 だと思いますが、     そっちでは試していないので、うまくいかないかもしれません。     こういうデータ改造してバトルネットで迷惑をかけている輩がいるので、     なんらか改ざん防止が行われているのかもしれません。     重ねてお願いしますが、     改造したキャラでは絶対にバトルネットに来ないで下さい。     ゲームが始まったら、選択したキャラのパラメタをメモして置きます。  (3)MemEdit2に切り替え     Alt+Escなどでディスクトップ画面に切り替えて下さい。  (4)DIABLOプロセスの選択     メニュー「ダンプ」−「プロセスの選択」をクリックします。     プロセス一覧の中から「DIABLO.EXE」を選択します。     ダンプ画面にDIABLOのメモリ内容が表示されます。  (5)サーチ     メニュー「ツール」−「検索」をクリックし、検索画面を表示させます。     「検索データ」の欄にキャラクタの名前を入力します。     解っているとは思いますが、半角で大文字小文字を区別して入力して下さい。     入力後、「検索開始」ボタンを押します。     「出現アドレス」リストにいくつかのアドレスが表示されるはずです。  (6)チェック     ここからが難しく、しかし楽しい所です。     検索で見つかったアドレスの付近を一つ一つチェックしていきます。     「出現アドレス」リストのアドレスをダブルクリックすると、     ダンプ画面がそのアドレスにジャンプします。     その前後を見て、(2)でメモしたパラメタがある様なところを探します。     16進ダンプを見ながら探すこの辺は経験がものを言います。     たとえばキャラクタの LIFE が 45 だったとすれば、     16進数では 2d になります。     で、HPの様なものは必ずMaxと現在の値の2つがありますので、     二つ並んである場合がほとんどです。     また、プログラマの気分によりますが、大概 short か long で    格納してますので、      2d 00 2d 00     とか      2d 00 00 00 2d 00 00 00     というデータがある所を探します。     低い桁が前に来るという点を忘れないで下さい。  (7)書き換える     パラメタのアドレスが見つかったら、あとはやり放題です。     F6キーを押し、書き込み禁止を解除します。     カーソルの色が緑から黄に変わります。     で、データを書き込んでみましょう。  (8)確認する     DIABLOの画面に戻り「CHAR」ボタンを押して、     パラメタが変わっていることを確認しましょう。     出来ればここで一旦ゲームを終了させ(セーブさせる)、     もう一度起動してから遊ぶ方がより安全でしょう。(たいして変わらんけど)     ちなみに私はこれを データロンダリング(money launderingから)と呼んでいます。   大体こんな感じでしょう。   他の機能については次をご覧下さい。 5.各機能の詳細   (1)ダンプ画面      一行のサイズは画面サイズを変更することにより調整できます。      以下のキー操作が行えます。        ・カーソルキー          カーソルの移動。          画面上下ではスクロールします。          またマウスでクリックすると、その位置にカーソルが移動します。        ・Tabキー          16進部とキャラクタ部の間でカーソルを移動させます。        ・PageUp/PageDownキー          一画面ごとにスクロールします。        ・F2キー          メモリから最新の状態を読み込み、ダンプします。          目的のプロセスは当然動作している訳ですから、メモリの値は変わっていきます。        ・F6キー          書込みの許可/禁止を切り替えます。          書込み不可の時はカーソルが緑色、書込み可の時はカーソルが黄色になります。      ジャンプ機能はアドレスを指定してその位置にカーソルを移動させます。      ジャンプしたアドレスはメニューに追加されていきます。      (再起動時にリセットされますが)      ウィンドウ右端のエリアにマウスを持ち込むと、マウスカーソルが上下の矢印に変わります。      この状態で左クリックすると、真ん中より上なら↑キー、下なら↓キーと同様の動きをします。      右クリックした場合は、上下それぞれPageUp、PageDownと同様の動作をします。      文字フォントの種類、サイズも変えられます。      丸文字フォントとか使うとバカっぽくていいです。      なお、固定ピッチフォントしか使用できません。      「最前面に表示」をONにすると、MemEdit2の画面は常に手前に表示されるようになります。      ゲームによってはほかのウィンドウが重なるのを嫌がるものもありますので      (DirectX使ってWindowモードで実行可能なゲームとか)、この機能を使うと見やすくなるでしょう。      ただしこれによってゲームの画面が崩れる恐れがあります。   (2)検索機能      検索機能は16進データ及び文字列データの検索が出来ます。      「検索データ」テキストボックスに検索したいデータを入力し、その下のオプションボタンでデータタイプを選択します。      16進データの場合は、        00 01 02 03 04      のように1バイトごとにデータを入れます。必ず2桁毎にスペースで区切ります。      文字列データの場合はそのまま入力して下さい。漢字はシフトJISコードで検索されます。      検索中でもダンプ画面の操作を行うことが出来ます。      検索はバックグランドで行われると考えて下さい。見つけ次第「出現アドレス」リストボックスに表示されます。      一つでも見つかったらそこをチェックでき、その間に次のアドレスを検索してくれるわけです。      「発見アドレス」リストボックスのアドレスをダブルクリックすると、ダンプ画面がそのアドレスにジャンプします。   (3)メモリマップ表示機能      メニューから「描画」をクリックすると、      広大なアドレス空間を64kBを1ピクセルとして256×256で表示します。      このマップでアドレス空間の大体の配置を見ることが出来ると思います。      マップは、プロテクト情報、メモリ状態、メモリ種類の3種類が表示できます。      マップ上にマウスカーソルを持っていくと、その位置のアドレスが左上に表示されます。      マップをクリックすると、ダンプ画面がそのアドレスにジャンプします。      プロテクトマップで灰色の所に書き込むと「一般保護違反」、      赤色や黒色の所に書き込むと「ページ違反」が起きるでしょう。..たぶん...だったらいいなぁ...起きないかも...      このマップはなんに使うかというと、はっきり言ってあまり意味がありません。      ただ単に私が見たかっただけのことです。   (4)計算ウィンドウ      簡単な計算を行えるウィンドウです。      ウィンドウサイズは変更することができます。      16進数の扱える関数電卓をもっていれば、そちらを使った方がいいでしょう。      式を入力してリターンキーを押すと「>」に続いて答えが表示されます。      リターンキーを押した所の行の式を計算します。      「=」などはいりません。       例)1+2*3         >7 (&H7)      ()のなかには答えが16進数で表示されます。      一応、四則演算とカッコが使用できます。      小数点も使用できます。(計算結果が整数でない場合、16進表示は無視してください。)      16進数の場合は頭に &H を付けて下さい。      あと、なぜかA〜Zまでの変数が使えます。       例)a=&h5555+&Haaaa         >65535 (&hffff)         1+a         >65536 (&h10000)      なんででしょうねぇ。(^^;   (5)ファイル出力/読み込み      ダンプ画面のメニューからメモリデータのファイル出力/読み込みができます。      ただしなるべる64Kバイト以上の連続データを書き込み/読み込みしないで下さい。      (バッファサイズの関係ではなく、メモリページの関係で)      有効なページに対する操作なら保証しますが、無効なアドレスに対して行った場合、      保証できません。      特にファイルからの読み込み時には必ず有効なページに対して読み込んで下さい。      変なアドレスに書き込むと落ちる可能性があります。   (6)メモリ監視機能      メモリの内容が変わったことを知らせてくれる機能です。      知らせるだけでなく、特定の値やメモリの内容を書き込ませることもできます。      例えば、「アドレスxxxxの内容がアドレスyyyyの値より小さくなった場合、      アドレスyyyyの内容を書き込む」なんてこともできます。      要するに「HPが減ったら、MAXの値を書き込む」なんてことを自動的に      やってくれる機能です。      便利そうですが、やってることはとってもしょぼいです。      タイマーで一定間隔ごとに登録されたメモリの内容を調べて、      条件にあったら登録された動作をやってるだけですので、      多くを望んではいけません。罰があたります。      アクション系のゲームで無敵化しようなんて考えてはいけません。      最大でも100ミリ秒間隔(こいつもかなりいいかげんだが)でしかみれませんので、      間に合わないでしょう。   (7)PAR風サーチ機能      その筋の方ならPARと言えば解るでしょう。(正確にはCommsLink風です)      パラメタの値を少しずつ変更して、そのつどメモリをチェックしアドレスを特定していく      サーチ機能です。      始めに初期値としてメモリの内容を読み込み、そこから、      メモリの値が変わった所、変わらない所、値が大きくなった所、小さくなった所、      特定の範囲内になった所などの条件を指定してふるいにかけていき、      最後までのこったやつが目的のアドレスという訳です。      なお検索する範囲は、上限を7fffffffとさせていただきました。理由は聞かないで下さい。      広大なメモリ空間をサーチしますので、かなり動作は遅いです。      またメモリの変更内容を履歴していきますので、かなりメモリを食います。      スワップガリガリになります。      なおメモリのアロケート時にチェックなんてしていませんので、      落ちたらごめんなさい。 6.制限事項   わかっているとは思いますが、全てのゲームで上手くいく訳ではありません。   以下のような場合、失敗するでしょう。たぶん。    (1)データ改ざん防止を行っているプログラムの場合        メモリの中までそんなことしているプログラムはあまりありません。        あまりありませんが、ないともいえません。        そういう場合はあきらめるか、プログラムを改造するなりしてください。    (2)プロセスがアクセスを拒否した場合(セキュリティ関係)        さぁ?そんなプログラムいじろうとした時ないのでどうなんでしょう?        NT用のプログラムでもない限り大丈夫だと思いますが、        このプログラムでやれることは悪性ウイルスとあまり変わりませんから(注:うつったりしません)、        セキュリティではじかれかもしれません。    (3)ゲームが16ビットコードで書かれている場合        昔のゲームに多いです。        システムソフトの大戦略EXとか。MasterOfMonstersとかは32ビット。        (こういうゲーム好きやねん) 6.知ってるつもり     Windows95のプロセスについて、あまりよくわかんな〜いという方のため、超簡単(手抜き?)に説明します。     (私自身そんなに詳しい訳ではないので、間違い等があるかも知れません。自分で調べるのがベストです。)     プロセスとは、       プライベート仮想アドレス空間、 コード、 データ、 およびこれら以外のオペレーティングシステムリソース        (ファイルや「パイプ」、 同期など、 「プロセス」から参照することができるオブジェクト) から構成される、       実行中のアプリケーション。       プロセスはまた、 そのコンテキスト内で実行される1つまたは複数の「スレッド」から構成されます。       ※ Win32APIプログラミングリファレンスより抜擢     これで分かればこんなとこ読まなくてもいいですね。     プロセスとはぶっちゃけた話、実行中のプログラムのことだと思っていいと思います。     Windows95で適当なアイコンをクリックすれば、なんらかのEXEファイルが起動され、それが1つのプロセスとなります。     (多少違うがとりあえずそう思ってくれ。)     「プライベート仮想アドレス空間」とは、     Windows95のように複数のプログラムを実行させられるOSの場合、それぞれのプログラムは基本的に別々に動かなければ     ならないので、それぞれのプログラムごとにその実行環境をOSが用意してやる訳です。     ここでいう実行環境とは、つまりアドレス空間です。     プログラムを車にたとえるなら、車(プログラム)が走るためのサーキット場(アドレス空間)を、     OSがそれぞれの車毎に用意してくれるわけで、このおかげでそれぞれの車はぶつからないですむのです。     (あまり良いたとえでないが納得して下さい)     ただし与えられたサーキット場はどこを走ってもいい訳ではなく、コース以外のところを走ると(暴走)、当然事故ります。     (いわゆる「ページ違反」ってやつですね。)     Windows95はプロセスごとに「アドレス空間」を用意するわけですが、そのサイズは4GBの大きさになります。     4kBでも4MBでもありません、4ギガバイトです。4294967296バイトです。     そんなメモリが積める訳ない(数年後はわからんが)ので、ページングと呼ばれる技術により実行中のとこだけ実メモリを     使用するわけです(これ以上こっちの話をすると長くなるので省略。面白いんだけどね。)。     仮想的なアドレスを使用する空間ということで「仮想アドレス空間」と呼ばれる訳です。     「仮想アドレス空間」は00000000〜FFFFFFFFまでの仮想リニア(連続しているという意味)アドレスで示される     メモリ空間で、そのメモリ空間にプログラムコード・データ等がいれられ、1つのプロセスとして扱われるわけです。     (わかるかなぁ、わかんねぇだろうなぁ)     で、このメモリエディタ2は、本来なら見たりいじったりしてはいけない他のプロセスの「仮想アドレス空間」を     見ていじれるプログラムなわけです。(どれだけ危険なことか(^^;)     本来こういう操作はできないことになっている(?)のですが、「ツールヘルプ」と呼ばれる主にデバッグ用に使用される     抜け道が実は用意されているんです。     ちなみにプロセスIDとはプロセスを識別するための番号みたいなものです。     プロセス毎に割り当てられ、他のプロセスと区別するために使われます。     他にプロセスハンドルなるものもありますが、ここでは省略します。     もう1つ知ってて損のない知識として「スレッド」があります。     実行可能なファイルはプロセスとして管理される訳ですが、これはすなわちCPUの実行単位として数えられる訳ではありません。     ご存知のようにWindows95は「マルチタスクOS」と呼ばれます     (最近ききません。実際はそーじゃねぇとか言われる方もいらっしゃいますが、ま、そー見えるんだからそれでいいでしょ。)。     複数のプログラムを同時に動かすといっても、CPUの数は決まってるんで(95場合、1個やね)、     各プログラムを短い時間ごとに切り替えて実行し、あたかも同時に動いているようにみせるわけです。     (「タイムスライス」と呼ばれます。たしかWindows95は「ラウンドロビン」でやっていたと思います。)     この時切り替えられる単位が「スレッド」と呼ばれる単位です。(さぁわかんなくなってきたでしょう)     1つのプロセスは1つ又は複数の「スレッド」によって構成されているのです。     CPUはこの「スレッド」ごとに実行するので、プロセスが多くなればそれだけスレッドも増え、各プロセスの動作が遅くなるし     プロセスが少なくともスレッドが多ければ、全体的に遅く感じられるわけです。(実際にはリソースや優先度などの問題のほうが     かなり大きいですが。またスレッドは常に動いているとも限らない。寝ている場合があるので)     ま、このMemEdit2でスレッドを意識する必要があるところはありませんので、安心してください。 7.動作原理    動作原理と言えるほどのたいしたことではありませんが、どうやってVBからアドレス空間のデータを読み書きするのかを説明します。    読んだ人はこのMemEdit2より良いものを作って、私にプレゼントしなければなりません。    (1)まず CreateToolhelp32Snapshot()API でシステムスナップショットを作成します。       この辺の情報はもっと公開してほしいなぁ>ゲイツ君へ    (2)Process32First()API,Process32Next()APIで順にプロセスを列挙し、プロセスID、ファイル名を取得します。    (2)列挙したプロセスから、ユーザーに目的のプロセスを選択させます。    (3)選択されたプロセスIDを元に、OpenProcess() API でプロセスハンドルを取得します。       この時、全ての権限を持ったハンドルをこしらえます。    (4)後は ReadProcessMemory() API で目的のアドレスからデータを読み込みます。    (5)書き込む時は WriteProcessMemory() API を使用します。    実に簡単ですね。さぁ作りましょう。 8.その他   ・このプログラムの著作権は M.Oshikiri にあります。   ・このプログラムはフリーソフトとします。    作者の M.Oshikiri に害が及ばない限り自由に複写/配布することができます。   ・このプログラムよるいかなる損害も M.Oshikiri は責任を負わないこととします。    使用者の責任で使って下さい。   ・添付のソースファイルの全部を、他のプログラム作成に流用することができます。    このプログラムは自由に改造でき、改造した人の名前で有料/無料を問わず    再配布することに一切の制限を設けません。    改造したプログラムを再配布する際は、このテキストファイルを添付しないで下さい。    また、著作権表示などは必ず変更してください。    改造したプログラムは改造した人のものと考えますので、私は知ったこっちゃありません。    当然、改造したプログラムによるいかなる損害にも私は責任を負いません。    なおこのプログラムは予告なしに変更され、再度配布する可能性があります。    改造したプログラムを配布する際、私のこの権利を禁止することはできないこととします。    要するにこのプログラムの著作権は放棄しない(できない?)が、    勝手に改造しようが売ろうが全然かまわない、    ただしそれらの行為に作者はまったく関係ないよってことです。    他人に迷惑をかけない限りね。   ・プログラムについての質問や要望は下記作者までご連絡下さい。    必ず返事するとは言えませんが、出来るだけ返事を書きます。   ・あなたの健康を損なうおそれがありますので、ゲームの改造し過ぎに注意しましょう。    改造マナーをまもりましょう。    作者:       M.Oshikiri       連絡先  E-mail     moshikiri@geocities.co.jp            大じゅんネット  DJN0076 オシキリ