#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, просто любую функцию, которая принимает параметр из другого потока и выполняется в этом удаленном потоке