3

では、 C ++ Dllインジェクションのステップ3について質問があります。つまり、次のとおりです。

CreateRemoteThread()を使用します。これをLoadLibrary()エントリポイントとして指定し、手順1と2のファイルパスを引数として指定できます。正直なところ、これは少しハッキーですが、DLLを挿入している場合は、すでにかなりハッキーになっています。もう1つの手法は、手順1と2を使用して、マシンコードをリモートプロセスにロードし、それをポイントすることです。

だから私の質問は:を使用してメモリを割り当てVirtualAllocEx、を使用してコードを記述したWriteProcessMemory後、どのように呼び出しを行うのCreateRemoteThreadですか?つまり、4番目と5番目のパラメータは何ですか?

私のコード:

AllocatedMem = VirtualAllocEx(Proc, IntPtr.Zero, code.Length,
    AllocationType.Reserve | AllocationType.Commit, MemoryProtection.ReadWrite);

WriteProcessMemory(Proc, AllocatedMem, code, code.Length, IntPtr.Zero);

CreateRemoteThread(Proc, IntPtr.Zero, 0, AllocatedMem,
    IntPtr.Zero, 0, IntPtr.Zero);
4

2 に答える 2

0

からMSDN Documentation

HANDLE WINAPI CreateRemoteThread(
 _In_   HANDLE hProcess,
 _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
 _In_   SIZE_T dwStackSize,
 _In_   LPTHREAD_START_ROUTINE lpStartAddress,
 _In_   LPVOID lpParameter,
 _In_   DWORD dwCreationFlags,
 _Out_  LPDWORD lpThreadId
);

したがって、4番目のパラメーターはへのポインターLoadLibraryであり、5番目のパラメーターは実行するコードである必要があります。

アップデート

例:

LoadLibAddy = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); 

CreateRemoteThread(
  Proc, 
  IntPtr.Zero, 
  0,
  LoadLibAddy,
  AllocatedMem, 
  0, 
  IntPtr.Zero
);

注:追加の関数をピンボークする必要があり、「コード」はネイティブDLLへのパスである必要があります。

于 2012-08-16T18:22:50.833 に答える
0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437(v=vs.85).aspx

HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId
);

hProcessiaスレッドが作成されるプロセスへのハンドル。

lpThreadAttributesをNULLにして、「デフォルトを使用」を指定できます

dwStackSizeは、「デフォルトを使用」を指定するためにゼロにすることができます

lpStartAddressは、スレッドが実行を開始する外部プロセスのアドレスです。

lpParameterは、外部プロセスでThreadMainに渡される引数です(つまり、外部プロセスでは、lpParameterを唯一のパラメーターとしてWINAPI呼び出し規約を使用してlpStartAddressが呼び出されると想定されます)。

dwCreationFlagsはゼロにすることができます。

lpThreadIdは、成功した場合にスレッドIDを受け取るDWORDへのポインターである必要があります。

lpStartAddressをLoadLibraryWのアドレスに設定し、lpParameterを外部プロセスのポインターL "foo.dll"に設定すると、スレッドが外部プロセスで開始すると、すぐにLoadLibraryW(L "foo.dll")が呼び出されます。外部プロセス。これにより、DLLMain内からコードを実行できます。

于 2012-08-16T18:25:08.557 に答える