私はここ数日間DLLインジェクタを作成しようとしています。私はDLLインジェクションが見つかり
最も簡単な方法は、これは私がこれまでに書かれたものであるCreateRemoteThread
別のプロセスにDLLを挿入するには?
を使用している、このコードは動作しませんし、理由を見つけることができません。
私の問題は、私がWinAPI関数を呼び出すために使用している変数の型にあるとは確信していますが、どこに見つけることができません。
bool Injector::Inject(HANDLE hProcess)
{
//hProcess is a process with writing and reading access
HANDLE hThread;
void* pLibRemote = 0;
string dllPath = "Some dll path";
HMODULE hKernel32 = GetModuleHandle(__TEXT("Kernel32"));
pLibRemote = VirtualAllocEx(hProcess, NULL, sizeof(dllPath.c_str()), MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, pLibRemote, dllPath.c_str(), sizeof(dllPath.c_str()), NULL);
hThread = CreateRemoteThread(hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,"LoadLibraryA"),
pLibRemote, 0, NULL);
.
.
.
CloseHandle(hThread);
}
.
.
.
これはうまくいった!どうもありがとうございました!あなたはなぜ 'dllPath.size()'の代わりに 'dllPath.size()+ sizeof(char)'を使ったのですか?(NULLターミネータのためです) – HackinGuy
@HackinGuyまさに、[文字列: :size()](http://en.cppreference.com/w/cpp/string/basic_string/size)は、終了NULLを除いた文字数を返します。それを考えると、文字列サイズ**は、 '(string.size()* sizeof(TCHAR))+ sizeof(TCHAR)'として計算されるべきです。これは、std :: wchar_tと_UNICODEを持つcharとstd :: wstringの文字列が定義されています。 – Neitsa
@Neitsa 'std :: basic_string'も使用しないと 'sizeof(TCHAR)'を使うことはできません。 'std :: string'は' char'を使い、 'std :: wstring'は' wchar_t'を使います。適切なAnsi/Unicode APIを適切に使用します( 'LoadLibraryA' /' LoadLibraryW')。この場合、 'std :: string'が使用されているので、'(string.size()+ 1)* sizeof(char) 'を使用してください。 –