Dll Injecting — написание собственного кода внутри другого процесса

Итак, у меня есть вопрос о шаге 3 C++ Dll Injection, а именно:

Используйте CreateRemoteThread(). Вы можете указать LoadLibrary() в качестве точки входа и путь к файлу из шагов 1 и 2 в качестве аргумента. Честно говоря, это немного хакерски, но если вы внедряете DLL, вы уже довольно хакерски. Другой метод заключается в использовании шагов 1 и 2 для загрузки машинного кода в удаленный процесс и указания на него.

Итак, мой вопрос: после того, как я выделил память, используя VirtualAllocEx, и написал код с помощью WriteProcessMemory, как мне сделать вызов CreateRemoteThread, и под этим я подразумеваю, что такое четвертый и пятый параметры?

Мой код:

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);

person Thanatos    schedule 16.08.2012    source источник


Ответы (2)


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
);

hProcess — дескриптор процесса, в котором должен быть создан поток.

lpThreadAttributes может быть NULL, чтобы указать «использовать по умолчанию».

dwStackSize может быть равен нулю, чтобы указать «использовать по умолчанию».

lpStartAddress — это адрес ВО ВНЕШНЕМ ПРОЦЕССЕ, с которого поток начнет выполняться.

lpParameter — это аргумент, передаваемый ThreadMain во внешнем процессе (т. е. во внешнем процессе предполагается, что lpStartAddress вызывается с использованием соглашения о вызовах WINAPI с lpParameter в качестве единственного параметра).

dwCreationFlags может быть равен нулю.

lpThreadId должен быть указателем на DWORD, который получает идентификатор потока в случае успеха.

Если вы установите lpStartAddress на адрес LoadLibraryW и установите lpParameter на указатель ВО ВНЕШНЕМ ПРОЦЕССЕ на L"foo.dll", то когда поток запустится во внешнем процессе, он немедленно вызовет LoadLibraryW(L "foo.dll") во внешнем процессе, что позволяет вам запускать код из вашего DllMain.

person SecurityMatt    schedule 16.08.2012
comment
Хорошо, но я спрашивал, как мне вызвать CreateRemoteThread, чтобы он запускал какой-то собственный код, а не DLL - person Thanatos; 16.08.2012
comment
Если собственный код, который вы хотите запустить, находится во внешнем процессе, вы можете просто использовать указатель функции (во внешнем процессе) в качестве lpStartAddress. - person SecurityMatt; 20.08.2012
comment
В качестве альтернативы вы можете скопировать некоторый собственный код из вашего локального процесса во внешний процесс через VirtualAllocEx/WriteProcessMemory. После этого вы сможете использовать собственный код, который вы только что внедрили, в качестве аргумента lpStartAddress. - person SecurityMatt; 20.08.2012

Из 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.

person Martin    schedule 16.08.2012