Как вызвать LdrLoadDll в другом потоке другого приложения?

#c #winapi

Вопрос:

Я сделал простейший инжектор NtCreateThreadEx LdrLoadDll, но инжектор вводит dll в себя , а не в целевой процесс (используя LoadLibraryW вместо LdrLoadDll ((wchar_t *) 0, 0, amp; name, amp; Module)) этого, он работает правильно — как я могу решить проблему самым простым способом

 #include lt;windows.hgt; #include lt;winternl.hgt; #pragma comment(lib, "ntdll.lib")  using namespace std;  EXTERN_C NTSYSAPI NTSTATUS NTAPI NtCreateThreadEx(PHANDLE,  ACCESS_MASK, LPVOID, HANDLE, LPTHREAD_START_ROUTINE, LPVOID,  BOOL, SIZE_T, SIZE_T, SIZE_T, LPVOID);  typedef HMODULE(__stdcall* _LdrLoadDll)(  wchar_t* PathToFile,  unsigned long Flags,  PUNICODE_STRING ModuleFileName,  PHANDLE* ModuleHandle  ); _LdrLoadDll LdrLoadDll;  int main() {  DWORD targetProcId = 10340; //Proc id to inject  wchar_t targetDllPath[255] = L"C:\DllTest32.dll"; //dll path to inject    unsigned short targetDllPathLength = sizeof(targetDllPath);  HANDLE targetOpened = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetProcId);  LPVOID allocatedMem = VirtualAllocEx(targetOpened, 0, targetDllPathLength, MEM_COMMIT, PAGE_EXECUTE_READWRITE);  bool wpm = WriteProcessMemory(targetOpened, allocatedMem, targetDllPath, targetDllPathLength, 0);   LdrLoadDll = (_LdrLoadDll)GetProcAddress(GetModuleHandleA("ntdll.dll"), "LdrLoadDll");  UNICODE_STRING name;  name.Buffer = targetDllPath;  name.Length = wcslen(name.Buffer) * sizeof(wchar_t);  name.MaximumLength = name.Length   sizeof(wchar_t);  PHANDLE Module;    HANDLE rt;  NtCreateThreadEx(  amp;rt, PROCESS_CREATE_THREAD, NULL, targetOpened,  (LPTHREAD_START_ROUTINE)LdrLoadDll((wchar_t*)0, 0, amp;name, amp;Module),  allocatedMem, FALSE, NULL, NULL, NULL, NULL); }  

Комментарии:

1. введите код оболочки и позвоните LdrLoadDll из него.

2. Могу ли я назвать это без asm?

3. можно, но нужны глубокие знания

4.Вы вызываете LdrLoadDll() в процессе ввода, а не в целевом процессе, а затем передаете его возвращаемое значение NtCreateThreadEx() . Это не то, как работает удаленная инъекция. Вам нужно будет сначала ввести входные параметры для LdrLoadDll() в другой процесс, а затем передать адрес кому LdrLoadDll() , чтобы NtCreateThreadEx() таким образом LdrLoadDll() можно было использовать параметры, когда удаленный поток вызывает его. Однако подпись LdrLoadDll() не совместима с LPTHREAD_START_ROUTINE , но LoadLibrary(A|W)() есть , так почему бы вам не использовать ее вместо этого?

5. Спасибо, я просто хочу изучить другие методы внедрения, помимо LoadLibrary, и понять, как это работает в глубине) Могу ли я попросить пример не обязательно LdrLoadDll, просто любую функцию, которая принимает параметр из другого потока и выполняется в этом удаленном потоке