#なぜ知りたいか
僕が書いたコードがめちゃくちゃバグってるようなのですが、vectorの中身を見ないと何がどうバグってるのかわからないからです
#何をやっているか
こんなvectorがあるとします。
cpp
1std::vector<BYTE> jmp_inst = { 2 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 3 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 4 };
これの7要素目から先(2行目)をmemcpyを使って別の値に上書きします。
cpp
1memcpy(&jmp_instr[6], &newMemory, 8)
(まずこの時点であってるか不安ですが)
ちなみにnewMemoryとは、VirtualAlloc
関数の戻り値で、型はvoid*
です。
#出力できない
とりあえずmemcpyをする前のもともとのvectorを出力しようと試みたのですが、Visual Studio上でエラーが発生しました。
cpp
1#include <iostream> 2#include <windows.h> 3#include <vector> 4 5std::vector<BYTE> jmp_inst = { 6 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00, 7 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 8 }; 9 10//例1 11for (auto a : jmp_inst) { 12 std::cout << a << std::endl; 13 } 14 15//例2 16for (std::vector<BYTE>::const_iterator i = path.begin(); i != path.end(); ++i) { 17 std::cout << *i << ' '; 18}
どうしたら中身の値を確認できますでしょうか?
バイト配列なのでできれば16進数で出力したいです。
全体的なコードの良し悪しは置いておいて、memcpy関数の引数並びは
memcpy(コピー先のメモリ位置を指すポインタ, コピー元のメモリ位置を指すポインタ, コピーするバイト数)です。その意識は合っていますでしょうか。
https://ja.cppreference.com/w/cpp/string/byte/memcpy
「第一引数のアドレスに、第二引数の値を第三引数のバイト数だけコピーする」という粗い認識ですが、一応間違ってはないですか...?
memcpyは配列などに値をコピーするのに使えるようなのでそういう意味で使ってるつもりなんです
提示されているコードが
> memcpy(&jmp_instr[6], &newMemory, 8)
となっていて、更にその上の提示コード、 std::vector<BYTE> imp_inst がコピー元としたいソースデータのように見受けられ、
newMemoryからimp_instr[6]から始まるアドレスへ8バイトコピー、と言うような呼び出しになって、それは逆じゃないのか?と思ったので指摘した限りです。(jmp_instrと jmp_inst でスペルが違いますが)
質問者さんの意図通りであれば特にそれ以上、コメントはないです。
回答1件
あなたの回答
tips
プレビュー