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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0914
souHMemory.dllについての質問 217解決


sou

リンク

2012/9/14(Fri) 19:57:15|NO.49359

またスレ立ててすいません。

http://hsp.tv/play/pforum.php?mode=all&num=49322

この質問をしたものです。

てれてれさんの言うとおりvarptrを用いたらエラーは出なくなりました。

けれど、実行してみるとなぜか書き込まれていません。

ほかに何か原因があるのでしょうか?

ぜひ教えてください。お願いします。



この記事に返信する


てれてれ

リンク

2012/9/14(Fri) 20:38:55|NO.49360

①権限が無い
②プロセス側で随時書き換えてる
③メモリ操作対策
④使い方が間違ってる

具体的にどういうソフトのメモリを操作してるのか言ってくれないことには始まらない。



sou

リンク

2012/9/15(Sat) 15:17:45|NO.49367

>>てれてれさん

例えば


code1 = 00913588 adr = varptr(code1) //書き換える値 code2 = 1234567 wdata = str(code2) DWriteMemoryS pid,adr,wdata mes strf("%08X",adr) mes wdata
こうすると、mes strf("%08X",adr)には00A65C40となってしまうようです。

この00A65C40が00913588となってないといけないと思います。
どうでしょうか?・・・




てれてれ

リンク

2012/9/15(Sat) 16:14:33|NO.49368

突っ込みどころが多すぎて混乱しているのですが・・・えーと・・・

まず、DWriteMemorySは文字列を書き換える時に使うもので、
今回は数値型なのでDWriteMemoryを使います。

そして、
>この00A65C40が00913588となってないといけないと思います。
この文から察するに、souさんはどうやら重大な勘違いをしているのでは無いでしょうか?

00A65C40はこの場合、変数データのポインタを示すものであり、
DWriteMemoryを使って書き換えてもこの値は変化しません。

例を挙げれば、
1つだけ物を入れられる「箱」がたくさんあると想像して下さい。

その「箱」には「ポインタ」と呼ばれるそれぞれの「箱」を区別するための番号が決められています。
この「ポインタ」は区別をするための番号に過ぎませんので、
中身を入れ替えたところで箱の「ポインタ」が変わるようなことはありません。

DWriteMemoryはこの「箱の中身」を変更するための命令です。

DWriteMemory pid,adr,wdata,4
したがって上記のコードでは、
「箱のポインタ(adr)」ではなく、「箱の中身(code1)」が書き換えられます。

以下に具体的なコードを書いておきます。

#uselib "HMemory.dll" #func DWriteMemory "DWriteMemory" var,int,int,int #func GetID "GetID" str,var code1 = 00913588 adr = varptr(code1) //書き換える値 code2 = 1234567 wdata = code2 GetID "hsp3.exe",pid mes "書き換え前 ⇒ code1 = " + code1 DWriteMemory pid,adr,wdata,4 : wait 100 mes "書き換え後 ⇒ code1 = " + code1

※わかりやすくする為、少し特殊な解釈をしています。



sou

リンク

2012/9/15(Sat) 16:50:05|NO.49369

>>てれてれさん

回答ありがとうございます。

とても勉強になります。

けど、このHMemory.dllは変数adrで選択したアドレスにwdataの値を書き込みをするものですよね?

そこで、adr「ポインタ」に変数を使うことはできないのでしょうか?

説明が下手ですいません・・・回答お願いします。



てれてれ

リンク

2012/9/15(Sat) 17:02:33|NO.49370

>けど、このHMemory.dllは変数adrで選択したアドレスにwdataの値を書き込みをするものですよね?
ここまでは理解出来ました。

>そこで、adr「ポインタ」に変数を使うことはできないのでしょうか?
が、この1文が私にはどうしても理解出来ません(´・ω・`)

というかここまでの質問がどうも間接的で、
直接的で具体的な最終目標が明示されていないから状況が掴めないんだけども・・・
良かったら結局のところ何がしたいのかを教えて頂きたい。



sou

リンク

2012/9/15(Sat) 17:56:06|NO.49371

>>てれてれさん

>>そこで、adr「ポインタ」に変数を使うことはできないのでしょうか?
>が、この1文が私にはどうしても理解出来ません(´・ω・`)

例えば


input code1,,,0 button "ok" ,*ok stop *ok adr = varptr(code1) //書き換える値 code2 = 1234567 wdata = str(code2) DWriteMemoryS pid,adr,wdata mes strf("%08X",adr) mes wdata

このようなプログラムがあって、inputでcode1に12345678と言う数を入れたとして、

そのcode1に入っている12345678を00A65C40のようなポインタとして利用することは可能ですか?と言うことです。

12345678と言う番号のポインタにwdataの内容を書き込みたいんです。



てれてれ

リンク

2012/9/15(Sat) 19:46:23|NO.49372

それなら単純にinputのcode1の部分をadrにしてしまえばいいです。


#uselib "HMemory.dll" #func DWriteMemory "DWriteMemory" var,int,int,int #func GetID "GetID" str,var code1 = 00913588 adr = varptr(code1) input adr,,,0 button "ok" ,*ok stop *ok //書き換える値 code2 = 1234567 wdata = code2 GetID "hsp3.exe",pid mes "書き換え前 ⇒ code1 = " + code1 DWriteMemory pid,adr,wdata,4 : wait 100 mes "書き換え後 ⇒ code1 = " + code1 stop



sou

リンク

2012/9/15(Sat) 20:34:45|NO.49373

>>てれてれさん

その手がありましたか!

しかし、その方法だと

DWriteMemoryを複数設置することができませんよね?



てれてれ

リンク

2012/9/15(Sat) 23:02:40|NO.49378

>DWriteMemoryを複数設置することができませんよね?
またもや私の拙い理解力では理解の出来ない文章が・・・



sou

リンク

2012/9/15(Sat) 23:43:29|NO.49379

inputのcode1の部分をadrにして、inputを複数設置するとadrが2こ以上になってしまいますが、adrを2こ以上設置してもいいのでしょうか?



てれてれ

リンク

2012/9/16(Sun) 00:07:13|NO.49380

それでも十分に難解で理解が追いつきません。

というか何で毎度毎度、最終的な目標の部分の説明をすっ飛ばしてそのやり方だけを質問するんですかね?
ここでは使い古された文句ですが、私達はエスパーでは無いので、
目標を言わずに断片的な情報だけの質問をされると物凄く答えにくいです。

souさんの中ではやりたいことも定まっていて、
単刀直入に質問の答えだけもらえればいいやーとか思ってるんでしょうがね・・・

ぶっちゃけこんな質問は最初から最終目標をはっきりと挙げたあとで、
やりたいことの説明を具体的に行なっていれば2~3レス程度で解決出来るような問題だったと思います。

また、HSPの基礎的な知識も不足しているように思えます。



sou

リンク

2012/9/16(Sun) 01:12:48|NO.49383

私にHSPの知識がないのは百も承知です。だからこそこの場を借りて質問をさせてもらっているのです。
確かに断面的でな情報で、わからずらかったかもしれませんが、初心者の私にはこれをどう説明すれば良いのかわかりませんでした。
最終目標はHMemory.dllに興味を持ち、色々と弄っていたら疑問が生じたので質問させていただきました。それとも初心者の知識の浅い人達はmes命令でも使って文字を表示させて遊んでろと言うことなのでしょうか?
2、3レスで終わるような内容だったならば、「が、この1文が私にはどうしても理解出来ません(´・ω・`)」の冷やかすような文章でレスを終わらせるのではなく、「もしかして~のような事ですか?」のように候補を上げることは不可能だったのですか?
真面目な質問をしているのに理解されないとなると残念で仕方ありません。



匿名希望

リンク

2012/9/16(Sun) 02:03:03|NO.49384

いや、だからね?
たとえ初心者であっても、やりたい事(最終的な目標)が何なのか、ぐらいは言えるんじゃないですか?

NO.49360
>具体的にどういうソフトのメモリを操作してるのか言ってくれないことには始まらない。
NO.49370
>良かったら結局のところ何がしたいのかを教えて頂きたい。
NO.49380
>というか何で毎度毎度、最終的な目標の部分の説明をすっ飛ばしてそのやり方だけを質問するんですかね?
これだけ質問されてもなお答えないということは、何か疚しい目的なのかと勘繰られても仕方ないと思われます
(例えばMMOのクライアントをハックしたいだとか)

横レスで申し訳ないけども、てれてれさんは非常に丁寧かつ親身になって回答して下さってると思いますよ
それを冷やかし呼ばわりだとか、あまつさえ更なる歩み寄りを要求するのは、いかがなものでしょうか



てれてれ

リンク

2012/9/16(Sun) 02:27:59|NO.49386

>初心者の私にはこれをどう説明すれば良いのかわかりませんでした。
結局のところ何がしたくて、どんなツールを作りたいのかがわからないことには、
方向性も定められず答えようが無かったので「最終目標」を聞いていたのですが・・・

>最終目標はHMemory.dllに興味を持ち、色々と弄っていたら疑問が生じたので質問させていただきました。
それは質問に至った経緯ですよね。
要するに別に何か特別なものが作りたくて質問したというわけでは無かったということですね。

変数の値を書き換えるのに、わざわざ遠回りにAPIを用いて変数を操作するのが不思議で仕方がなかったんですが、
そう解釈したら納得いきました。(質問の内容は相変わらず理解出来ませんが。)
というか最初からそれを言って欲しかったです。

>それとも初心者の知識の浅い人達はmes命令でも使って文字を表示させて遊んでろと言うことなのでしょうか?
いやいや、滅相もない。
ただ、メモリ操作にはHSP以外の知識も必要なため、初心者には荷が重いのは事実です。
もう少し過程を踏んで、HSPの扱いに慣れてからでも遅くないのかな?って思っただけです。
誤解をしてしまったのなら謝ります。

>候補を上げることは不可能だったのですか?
考えてはみたのですが、
上記の通り「変数の値を書き換えるのに、わざわざAPIを使う」という特殊な質問は初めてで、
経験の浅い私には、その候補を想像することは全く出来ませんでした。

>真面目な質問をしているのに理解されないとなると残念で仕方ありません。
理解する努力はしましたが、どうやら誤解があったようです。
申し訳ございません。



Him

リンク

2012/9/16(Sun) 02:45:14|NO.49387

予想では
input code1,,,0
button "ok" ,*ok stop *ok adr = varptr(code1)

の部分が
input code1,,,0
button "ok" ,*ok stop *ok adr = int ("$" + code1)

16進数表記の変数code1のデータをadrに渡す方法がvarptrだと
勘違いしてしまったのでは、と



KA

リンク

2012/9/16(Sun) 05:50:13|NO.49388

斜め読みで推理すると

「各種数値を1画面で操作出来るツール」

を作りたいのかな。



sou

リンク

2012/9/16(Sun) 12:46:55|NO.49392

自分の知識不足で迷惑をかけてすいませんでした。

これからは回答者様に分かりやすいような質問を心がけていきます。



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