tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル他プロセスのメモリの読み書き
記事No8146
投稿日: 2008/09/16(Tue) 00:45
投稿者ASV
はじめまして、プログラム未経験と言ってほど無知なASVと申します。
やろうとしてる事を例えると test と言うプロセスのメモリを読み書きする事です。
具体的に言うと test のメモリアドレス 00AABBCC の値を8バイト読み込み
その値を任意の値に書き換えようとしてます。

ネットで丸一日調べたのですが、無知な私には理解出来なくて旨くいきませんでした。
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim ps As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("test")
        Dim p As System.Diagnostics.Process
        For Each p In ps
        Next
        Try
        Catch
            MsgBox("プロセスが見つかりません")
        End Try

        Dim hProcess As Integer 'プロセスハンドル
        Dim lpBaseAddress As Integer '書き込み開始アドレス
        Dim lpBuffer As Byte 'データバッファ
        Dim nSize As Byte '書き込みたいバイト数
        Dim lpNumberOfBytesRead As Integer '読み取ったバイト数
        Dim lpNumberOfBytesWritten As Integer '実際に書き込まれたバイト数

        hProcess = ps(0).Handle
        lpBaseAddress = &HAABBCCDD
        nSize = 8

        ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesRead)
        WriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
    End Sub

間違いだらけで不完全なコードで非常に見苦しいとは思いますがご教授お願いします。

[ツリー表示へ]
タイトルRe: 他プロセスのメモリの読み書き
記事No8153
投稿日: 2008/09/16(Tue) 15:58
投稿者花ちゃん
> はじめまして、プログラム未経験と言ってほど無知なASVと申します。

この関数でどのような事が出来るのかは、ご存知なのでしょうか?

> ネットで丸一日調べたのですが、無知な私には理解出来なくて旨くいきませんでした。

関数名で検索して、MSDN のサイトを見れば、関数の使用方法は掲載されていますし、
http://msdn.microsoft.com/ja-jp/library/cc429006.aspx
http://msdn.microsoft.com/ja-jp/library/cc429067.aspx

VB 関数名 で検索すれば、下記のサイト等に使用例も見つかります。
http://hongliang.seesaa.net/article/9121793.html

どこが理解できなくて、どう旨くいかないのかを説明されないと答えようがありません。
作れや、試せと言われても、簡単な事なら別ですが面倒なものは何方もやらないかと。

又、文面通りの プログラム未経験と おっしゃるなら、API関数を使った処理やメモリを
いじくるような処理はやめておかれた方が無難かと思います。

# 投稿キーが 7777 だ、縁起がよいのか不吉なのか?

[ツリー表示へ]
タイトルRe^2: 他プロセスのメモリの読み書き
記事No8159
投稿日: 2008/09/17(Wed) 01:29
投稿者ASV
こんばんは、ご返事有り難うございます。

> この関数でどのような事が出来るのかは、ご存知なのでしょうか?

調べた結果この関数がメモリの読み書きが出来るものだと思ってます。

> 関数名で検索して、MSDN のサイトを見れば、関数の使用方法は掲載されていますし、
> http://msdn.microsoft.com/ja-jp/library/cc429006.aspx
> http://msdn.microsoft.com/ja-jp/library/cc429067.aspx
> VB 関数名 で検索すれば、下記のサイト等に使用例も見つかります。
> http://hongliang.seesaa.net/article/9121793.html
はい、MSDN のサイトで使い方調べて書きました
他のサイトも色々見てるのですが、どの部分が必要なのか理解できず苦戦してます。

> どこが理解できなくて、どう旨くいかないのかを説明されないと答えようがありません。

説明不足ですみません、解らない部分が多くてつい大雑把になってしまいました。

> 作れや、試せと言われても、簡単な事なら別ですが面倒なものは何方もやらないかと。

御もっともです

> 又、文面通りの プログラム未経験と おっしゃるなら、API関数を使った処理やメモリを
> いじくるような処理はやめておかれた方が無難かと思います。

初心者と言って良いレベルかも疑問だったので未経験と言いました、経験は3日と3年前に2ヶ月です。
どうしてもやりたいので出来る限り頑張ってみたいです。

現在解らないのは、lpBuffer のメモリ帯域を確保する方法と、MSDN に記載されてる hProcess の
「PROCESS_VM_READ アクセス権を備えていなければなりません。」と言う言葉に引っかかってます。
あれから色々調べてやってみた結果、WriteProcessMemory は旨く動いてくれるのですが
ReadProcessMemory は何時も lpBuffer に「0」しか戻ってきません。

そこでメモリ帯域を確保しようと VirtualAlloc を使ったのですが毎回違う値が戻ってきたり
期待の値は戻ってきませんでした、おそらく使い方が間違ってるのでしょう・・・

とにかくこのままではろくに質問も出来ないので、もう少し頑張って調べてみます。

[ツリー表示へ]
タイトル[解決] 他プロセスのメモリの読み書き
記事No8160
投稿日: 2008/09/17(Wed) 14:33
投稿者ASV
こんにちは
あれから色々調べていたら、私のしたい事にピッタリのソースが C# であったので
早速 C# をインストールしてソースを開き少し書き換えた所、旨く動いてくれました。
それを変換ツールに手伝って貰いながら VB.NET に書き換えたら旨くいきました。
まだ未完成ですが、こんな感じになりました。

    Dim hProc As IntPtr = IntPtr.Zero
    Dim bAddr As IntPtr
    Dim bytesRW As IntPtr
    Const dwAllAccess As System.UInt32 = &H1F0FFF
    Dim bBuff(4) As Byte
    Dim bFound As Boolean = False

    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If Not bFound Then
            If Process.GetProcessesByName("test").Length = 1 Then
                hProc = OpenProcess(dwAllAccess, True, CType(Process.GetProcessesByName("test")(0).Id, System.UInt32))
                bFound = True
            End If
        Else
            If Process.GetProcessesByName("test).Length <> 1 Then
                bFound = False
                Return
            End If
        End If

        bAddr = &AABBCCDD
        ReadProcessMemory(hProc, bAddr, bBuff, 4, bytesRW)
        MsgBox(BitConverter.ToInt32(bBuff, 0).ToString())

    End Sub

まだ理解出来てない所も多いので、これからじっくり理解して使いこなせるように勉強します。

次回は下手な質問をしないよう努力しますので、また何かあった時は宜しくお願いします。
本当に有り難うございました、感謝してます。

[ツリー表示へ]