質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3316閲覧

C# Win32APIのWriteProcessMemoryが適用されない

Susanoo2442

総合スコア153

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/11/19 02:45

リバースエンジニアリングのスキルを上げるために
現在、自分でプログラムの解析ツールを作っております。

現在の開発段階としては
ターゲットプロセスのidを取得して
そのidを元にプロセスのハンドルも取得できました。

次はWin32のWriteProcessMemory();で
プロセスのハンドルを元にターゲットのプロセスのメモリを書き換える箇所ですが
この段階でハマりました。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.Diagnostics; 11using System.Runtime.InteropServices; 12 13namespace NUNS4{ 14 15 16 17 18 public partial class Form1 : Form{ 19 20 21 22 [DllImport("kernel32.dll")] 23 static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId); 24 25 26 [DllImport("kernel32.dll")] 27 public static extern bool ReadProcessMemory(int hProcess, 28 int lpBaseAddress, int lpBuffer, int dwSize, ref int lpNumberOfBytesRead); 29 30 31 32 33 [DllImport("kernel32.dll", SetLastError = true)] 34 static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress, 35 int lpBuffer, int dwSize, ref int lpNumberOfBytesWritten); 36 37 38 39 private enum ProcessAccessFlags : uint 40 { 41 All = 0x001F0FFF, 42 Terminate = 0x00000001, 43 CreateThread = 0x00000002, 44 VMOperation = 0x00000008, 45 PROCESS_VM_READ = 0x10, 46 VMWrite = 0x00000020, 47 DupHandle = 0x00000040, 48 SetInformation = 0x00000200, 49 QueryInformation = 0x00000400, 50 Synchronize = 0x00100000 51 } 52 53 54 55 56 57 int faste = 0; 58 int aaa; 59 byte[] newvalue = { 0x90, 0x90, 0x90, 0x90, 0x90 }; 60 int newvalue2 = 600; 61 IntPtr aPtr; 62 System.Diagnostics.Process[] ps = 63 System.Diagnostics.Process.GetProcessesByName("Tutorial-x86_64"); 64 65 66 67 68 public Form1(){ 69 InitializeComponent(); 70 foreach (System.Diagnostics.Process p in ps) 71 { 72 Console.WriteLine("{0}/{1}", p.Id, p.MainWindowTitle); 73 aaa = p.Id; 74 } 75 76 77 78 if ((aPtr = OpenProcess(ProcessAccessFlags.All, false, aaa)) == null) 79 { 80 Console.WriteLine("ハンドルが取得されませんでした"); 81 } 82 else 83 { 84 Console.WriteLine("ハンドルが取得されました"); 85 Console.WriteLine(aPtr); 86 } 87 88 89 90 } 91 92 private void button1_Click(object sender, EventArgs e) 93 { 94 Console.WriteLine("コマンドオン"); 95 96 97 ReadProcessMemory((int)aPtr, 0x00121C80, newvalue2, 1, ref faste); 98 WriteProcessMemory((int)aPtr, 0x00121C80, newvalue2, 1, ref faste); 99 100 101 102 } 103 } 104} 105

こちらが、コードになりますが
WriteProcessMemory();が適用されません。

ハンドルも取得して
アクセス県もすべて得ております。

何が原因でWriteProcessMemory();が適用されないのでしょうか??

目的としては
WriteProcessMemory();で他プロセスのメモリを書き換える事です。

どなたか、目的を実現するべくアドバイス頂けたらと思います。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KenjiToriumi

2016/11/19 06:28

「WriteProcessMemory();が適用されません」との事ですが、WriteProcessMemory()の戻り値は正常終了しているのでしょうか? 異常終了しているのなら、その時のGetLastError()値(C#なら Marshal.GetLastWin32Error()値はどうなっていますか?
guest

回答1

0

ベストアンサー

書き込み対象のアドレスは、そもそも書き込み可能なページなのでしょうか?

読み込みは出来ても書き込みは不可なページ属性(実行コードなど)のデータを書き換えようとしているという事はありませんか?

VirtualQueryEx を使用し、対象ページの MEMORY_BSIC_INFORMATION を取得して、書き込み可能なページなのか確認してみてください。

投稿2016/11/19 07:13

KenjiToriumi

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Susanoo2442

2016/11/19 12:42

回答ありがとうございます。 WriteProcessMemory();は確かbool型で関数が成功したら trueを返すはずでしたので if文で 次のように分岐してみました。 if ((WriteProcessMemory((int)aPtr, 0x01540C20, newvalue3, 1, ref faste)) == true) { Console.WriteLine("プログラム改ざん失敗!"); } else { Console.WriteLine("プログラム改ざん成功!"); } するとコンソールに成功!と表示されましたが これは、関数自体は成功していると解釈して良いんですかね?? しかしながら、値は書き変わっておりませでした。
Susanoo2442

2016/11/19 12:44

間違えました。 if文の ==true の箇所は ==false で試しました。
Susanoo2442

2016/11/20 15:52

自己解決致しました! どうやら ReadProcessMemoryは 値をターゲットプロセスから コピーしてくる関数みたいなので これを、先に記述した事が原因で 先にターゲットの値がコピーされて そのコピーされた値を こちらが書き込んでいた・・・ つまりは、初期状態の 値をそのまま書き込んでいたみたいです。 この、ReadProcessMemory関数を コメントアウトした所 無事、値をプロセス間で 書き換えることに成功しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問