int DllInjector::inject(unsigned long processId, std::string dllName) { LPTHREAD_START_ROUTINE lpStartExecAddr = NULL; LPVOID lpExecParam = NULL; HANDLE hTargetProcHandle = NULL; char* lpcDll = NULL; char tcDllPath[_bufferSize] = ""; if (GetFullPathNameA(dllName.c_str(), _bufferSize, tcDllPath, NULL) == 0) { if (_logger) _logger->error("Cannot get full dll path!"); return -1; }; // Attach to process with OpenProcess() hTargetProcHandle = attachToProcess(processId); if (hTargetProcHandle == NULL) { if (_logger) _logger->error("Could not Attach to Process!!"); return -1; } // Copy the DLL via write path method lpStartExecAddr = AllocWritePath(hTargetProcHandle, tcDllPath, &lpExecParam); if (lpStartExecAddr == NULL) { if (_logger) _logger->error("Could not allocate memory!!"); return -1; } // Inject the DLL into process via create remote thread method if (_logger) _logger->info("INJECTING!"); injectDLL(hTargetProcHandle, lpStartExecAddr, lpExecParam); CloseHandle(hTargetProcHandle); return 0; }
/* * Class: sun_jvm_hotspot_debugger_windbg_WindbgDebuggerLocal * Method: attach0 * Signature: (I)V */ JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_windbg_WindbgDebuggerLocal_attach0__I (JNIEnv *env, jobject obj, jint pid) { if (getWindbgInterfaces(env, obj) == false) { return; } if (attachToProcess(env, obj, pid) == false) { return; } if (addLoadObjects(env, obj) == false) { return; } if (addThreads(env, obj) == false) { return; } }