DLL 주입: 프로그램 실행 프로세스를 변경하여 대상 DLL-createRemoteThread를 능동적으로 로드합니다.

2062 단어 역어셈블리
프로그램 프로세스를 변경하는 것은 일반적으로 스레드 EIP를 변경하거나 새 스레드를 만들거나 대상 프로세스의 코드를 수정하여 LoadLibrary를 실행하여 대상 DLL을 불러오는 것입니다.
CreateRemoteThread법: 목표 프로세스에서 메모리 저장 목표 DLL 경로를 요청한 다음CreateRemoteThread를 호출하여 루트 함수를 만드는 것은 LoadLibrary이고 파라미터는 목표 DLL 경로를 저장하는 메모리 포인터입니다.
코드는 다음과 같습니다.
void InjectDLL::InjectDLLToProcessMethodOne(wchar_t* targetProcName, char* dllPath)
{
	DWORD targetPid = GetProcessPid(targetProcName);
	HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid);
	if (hProc == NULL)
	{
		cout << "      !" << endl;
		return;
	}
	LPTSTR AllocatedMem = (LPTSTR)VirtualAllocEx(hProc, NULL, strlen(dllPath)+1, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
	if (AllocatedMem == NULL)
	{
		cout << "      !" << endl;
		return;
	}
	if (WriteProcessMemory(hProc, AllocatedMem, dllPath, strlen(dllPath), NULL) == 0)
	{
		cout << "dll      !" << endl;
		return;
	}
	//LoadLibraryA    kernel32.dll ,GetModuleHandle                  
	HMODULE mKernel = GetModuleHandleA("kernel32");
	if (mKernel == NULL)
	{
		cout << "kernel32      !" << endl;
		return;
	}
	LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(mKernel, "LoadLibraryA");
	if (lpStartAddress == NULL)
	{
		cout << "  LoadLibraryA  " << endl;
		return;
	}
	HANDLE mHandle = CreateRemoteThread(hProc, NULL, 0, lpStartAddress, AllocatedMem, 0, NULL);
	if (mHandle == NULL)
	{
		cout << "      !" << endl;
		return;
	}
}

DWORD InjectDLL::GetProcessPid(wchar_t* processName)
{
	HANDLE lpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == lpSnapshot)
	{
		cout << "        !" << endl;
		return 0;
	}
	PROCESSENTRY32 pe32 = { 0 };
	pe32.dwSize = sizeof(pe32);
	Process32First(lpSnapshot, &pe32);
	do
	{
		if (_wcsicmp(processName, pe32.szExeFile) == 0)
			return pe32.th32ProcessID;
	} while (Process32Next(lpSnapshot, &pe32));
	return 0;
}

좋은 웹페이지 즐겨찾기