HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0407
ぬぃまぁ (投稿者削除)10未解決


ぬぃまぁ

リンク

2006/4/7(Fri) 16:29:29|NO.292

この記事は投稿者により削除されました。
2006/4/10(Mon) 07:29:37



この記事に返信する


Irisawa

リンク

2006/4/7(Fri) 20:15:00|NO.293

書き込み先のメモリが書き込み許可である必要があります。

その上で条件によって以下のような方法があります。

dupptr buf, 0x000003BC, 4 ; poke buf, 0, 0xFF ; 1byte のみ書き込む場合 ; wpoke buf, 0, 0xFFFF ; 2byte のみ書き込む場合 ; lpoke buf, 0, 0xFFFFFFFF ; 4byte 書き込む場合 ; buf = 0xFFFFFFFF ; 4byte 書き込む場合はこれでも OK ; memset buf, 0, 1 ; 特定の 1byte 数値を連続で書き込む場合 ; 4byte 以上のデータを書き込む場合 ; mem = 0xFFFFFFFF, 0xFFFFFFFF ; memcpy buf, mem, 8

すべてコメントアウトしています。
(動作確認はしていませんがメモリに書き込む場合は上記のような感じでいいと思います)



Irisawa

リンク

2006/4/7(Fri) 20:22:15|NO.294

一応、補足。
アドレス、0x000003BCは保護されているメモリ領域なので書き込むことはできないと
思います。
ファイルの内容を書き換える場合はオフセット0x000003BCをpoke系命令で書き込むか
memset/memcpyで書き込んでください。

また、バッファがオーバーフローしないことが前提です。
オフセット0x000003BCより小さいファイルサイズのファイルのデータを書き換えようと
するとコンピュータの仕様上、何が起こるか分かりませんのでご注意下さい。



Shinya

リンク

2006/4/7(Fri) 20:46:08|NO.295

 「ぬぃまぁ」さんが bsave命令を使おうとしたならば、もしかすると、ハードディスクに保存
されているデータに対して、直接書き換える、と言うことでしょうか...。アドレスが指定されて
いる時点で、僕の推測は間違でしょうね。



Shinya

リンク

2006/4/7(Fri) 20:57:36|NO.296

 NO.295 の返事まちがえました。
ファイルの書き込みにも 先頭アドレスが必要だったみたいです。



白い騎士のお供の犬

リンク

2006/4/8(Sat) 16:25:55|NO.314

解決済みのスレに書いてすいません。
似たような質問なので投稿します。

>2006/4/7(Fri) 20:46:08|NO.295
>
> 「ぬぃまぁ」さんが bsave命令を使おうとしたならば、もしかすると、ハードディスクに保存
>されているデータに対して、直接書き換える、と言うことでしょうか...。アドレスが指定されて
>いる時点で、僕の推測は間違でしょうね。

保存されているのをいじるのと、実行中のをいじるのとどう違いがでるのか
教えてくれませんか?
また、前者も後者もpoke系命令で書けるのですか?



Irisawa

リンク

2006/4/8(Sat) 19:21:03|NO.317

> 保存されているのをいじるのと、実行中のをいじるのとどう違いがでるのか
> 教えてくれませんか?

実行中のプロセスのメモリ領域は主に

-読み取り可能領域(Read)
-書き込み可能領域(Write)
-実行可能領域(Execute)

の3つの属性があります。
(実際には他にもいくつかあるみたいですがよく分かりません)
PEヘッダなどはReadです。
プログラムの実行コード(マシン語)の格納されている.textセクションはRead, Execute
です。
変数の領域は.dataセクションでWrite, Readです。

ファイルの内容を書き換えたりするには一度変数領域にデータをロードして内容を
書き換えた後に、ファイルに書き戻します。
ただし、実行中のプロセスの実行ファイルはOSが保護するので書き込めません。
通常のプログラムは0x00000000〜0x00401000までを実行ファイルのヘッダ(PEヘッダ含む)に
して0x00401000〜不特定までを.textセクションにします。
そしてその後に.dataセクションなどが入りますので0x000003BCは通常のプログラムでは
ヘッダ領域です。
なので書き込もうとすると強制終了します。

変数のオフセット0x000003BCはそれとはまったく違い、例えば変数のメモリが0x00450000に
格納されていたとすれば0x00450000+0x000003BCで0x004503BCのメモリを書き換えることに
なります。
ただし、0x004503BCのメモリが初期化されていない場合は強制終了するなどの問題がある
かも知れません。
ファイルの内容を書き換えるというのは例えば0x00450000以降にファイルの内容を
読み込んで書き換えて0x00450000以降のメモリをファイルに保存することです。

> また、前者も後者もpoke系命令で書けるのですか?

要はpoke系命令はメモリを直接書き換える命令です。
高速に動作しますが、メモリを直接書き換えるので書き込み属性のない領域や初期化されて
いない領域に書き込もうとすると強制終了したりします。
(場合によっては強制終了せずにそのまま動作して違うところでおかしな動作をすることも
あるので要注意です)

HSP3では普通に変数を使用すると自動でバッファを初期化してメモリ領域を確保して
くれますがdupptrでポインタ先のメモリ領域を変数に割り当てたりpoke系/memset/memcpy
命令でメモリに直接アクセスする際にはアクセスする部分が書き込み可能かどうかの
注意が必要になります。



Yuki

リンク

2006/4/8(Sat) 19:23:11|NO.318

To 白い騎士のお供の犬さん

保存済のものをいじるときは、bsave命令を使う。
実行中のものをいじるときは、poke命令を使う。

という違いが出ます。



Shinya

リンク

2006/4/8(Sat) 20:08:31|NO.319

>ハードディスクに保存されているデータに対して直接書き換える
 直接書き換えると言うことは、ハードディスクのセクタに、直接値をコピーすると言うことです。
余計な書き込みをしてしまいました。気おつけます。

 2次キャッシュ(RAMメモリ)と、ハードディスクでは、書き込むスピードに違いが出ます。
あくまでたとえですが、あるファイルを別のフォルダにコピーするのと、
配列変数aを配列変数bにコピーすのでは、後者の方が断然速いです。



白い騎士のお供の犬

リンク

2006/4/9(Sun) 02:22:49|NO.321

詳しく教えてくれてありがとう
内容はよくわかりましたが、プログラムになるとちょっと苦手で・・・
実行中のプロセスの書き換えは初回起動時だけ反映されていました。一応成功です^^
しかし、セーブデータを書き換えるほうも自分なりに試したのですが、コピーした部分だけが
残り、あとは全て0000 00000 という結果になってしまいました。
"コピーした部分"以降は白紙になってしまいます・・・;;

セーブファイル"Data.sav"のAddress:[00006DE0]をFFFF FFFF (所持金最大)
に書き換えるサンプルを組んでいただけないでしょうか?

お礼は何もできませんがヨロシクお願いします。



Shinya

リンク

2006/4/9(Sun) 16:34:53|NO.334

 セーブデータの書き換えとかなら、専用のメモリエディターを使ったほうが
効果的ですよ。メモリのデータは暗号化されてないことがほとんどですから。
    // 書き込めるのはファイルのサイズまで //
dialog "*",16 :if stat == 0 : end exist refstr :fsize=strsize :dim bin,fsize/4+4 :bload refstr,bin,fsize objsize 128 mes "書き込むアドレス(オフセット)を16進法で指定" hex_adress = "00006DE0" input hex_adress mes "書き込む数値を1byte単位(16進数)で指定\n連続して指定する場合は半角スペースで区切る" insertb = "FF FF" input insertb button "名前をつけて保存",*save stop *save adress = int("$"+hex_adress) size = 0 repeat getstr get,insertb,size,' ' :if strsize == 0 : break size + strsize poke bin,adress+cnt,int("$"+get) if fsize=0 : offset++ loop dialog "*",17 :if stat == 0 : end bsave refstr,bin,fsize + offset end



ONION software Copyright 1997-2023(c) All rights reserved.