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

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

新規登録して質問してみよう
ただいま回答率
85.47%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

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

C++

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

Q&A

1回答

1694閲覧

x64のゲームにフックしてアセンブリを注入するコードがわからないです

退会済みユーザー

退会済みユーザー

総合スコア0

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

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

C++

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

0グッド

1クリップ

投稿2020/05/26 07:02

編集2020/05/26 07:39

#やりたいこと
64bitゲームのアセンブリの特定の命令をjmp 空いてるメモリ領域に変更し、ジャンプ先で自分のアセンブリを実行してから元の位置に戻るというのをC++でやりたいです。
Cheat EngineのCode injectionの模倣のようなことです
例えば

armasm

1 sub [rbx+54],edi 2 mov rcx,rsi

jmp アドレスに変更し、その先で

armasm

1 mov edi, (int)0 2 sub [rbx+54],edi 3 mov rcx,rsi 4 jmp 元居たアドレス

のようにしてアセンブリを挟みたいんです!
#分かっていること
メモリにアセンブリを書き込むのはmemcpy関数を使うことでできるみたいですね

cpp

1BYTE* dest = アドレス 2memset(dest, (BYTE*)"\x50\x8D\x4C\x24", 4)

こんな感じです。(書いてませんが、VirtualProtect関数で書き込み権限を得る必要はあります。)

#僕が参考にした動画
この動画を見たんですが、これはx86アーキテクチャを対象としたもので、x64だとそもそもインラインアセンブリが使えない上に特定のレジスタも使えないので、肝心の部分があまり参考になりませんでした。
ただ、一体どの部分で空いているメモリ領域のアドレスを探しているのかも僕にはわからないので、わかる方いたらそれだけでも教えていただけませんか?
以下の部分です

cpp

1bool mem::HookCode(void* toHook, void* ourFunct, int len) { 2 if (len < 5) { //Hook元が5以下なら(jmp に5バイト必要なので) 3 return false; 4 } 5 DWORD oldprotect; 6 VirtualProtect(toHook, len, PAGE_EXECUTE_READWRITE, &oldprotect); 7 memset(toHook, 0x90, len); 8 DWORD relativeAddress = ((DWORD)ourFunct - (DWORD)toHook) - 5; 9 10 *(BYTE*)toHook = 0xE9; //E9はjmpを表すバイト 11 *(DWORD*)((DWORD)toHook + 1) = relativeAddress; //+1をすることでE9を上書きしない(?) 12 13 DWORD temp; 14 VirtualProtect(toHook, len, oldprotect, &temp); 15 return true; 16}

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

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

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

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

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

tmp

2020/06/03 09:42

DLL injectionした時点でメモリ上にあり、空いているメモリ領域のアドレスを探していないのでは??
guest

回答1

0

x64だとそもそもインラインアセンブリが使えない

インラインアセンブラではなくアセンブラを使うなり、Xbyak使って実行時にアセンブルするなり

一体どの部分で空いているメモリ領域のアドレスを探しているのか

DLLなので対象プロセスに読み込ませるのにひと手間必要ですが
読み込ませる段階でOSが勝手に未割り当てのメモリに対して割り当ててくれます。

ちなみに、外部プロセスに自由に使えるメモリ領域が欲しい場合はVirtualAllocExを用います。

投稿2020/05/26 09:07

asm

総合スコア15147

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

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

退会済みユーザー

退会済みユーザー

2020/05/26 13:32

回答ありがとうございます。 ただこの質問はDLL injectionではなく、その中での話ですので何かずれてる気がします
asm

2020/05/26 16:20

では、もう少し直接の回答をすると 未使用領域だの難しく考える必要はなく普通にnewやmallocやHeapAlloc/VirtualAllocで割り当てればいいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問