static string PatchEntryPointIfNeeded(IntPtr moduleHandle, IntPtr imageBase, IntPtr hProcess) { long fileSize; StringBuilder dllPath = new StringBuilder(1024); if (!WinAPI.GetFileSizeEx(moduleHandle, out fileSize) || fileSize == 0) { return(null); } IntPtr handle = WinAPI.CreateFileMapping(moduleHandle, IntPtr.Zero, WinAPI.FileMapProtection.PageReadonly | WinAPI.FileMapProtection.SectionImage, 0, 0, null); if (handle == IntPtr.Zero) { return(null); } IntPtr mem = WinAPI.MapViewOfFile(handle, WinAPI.FileMapAccess.FileMapRead, 0, 0, UIntPtr.Zero); if (mem == IntPtr.Zero) { return(null); } if (WinAPI.GetFinalPathNameByHandle(moduleHandle, dllPath, (uint)dllPath.Capacity, 0) == 0) { return(null); } dllPath = dllPath.Replace("\\\\?\\", ""); PE.IMAGE_DOS_HEADER dosHeader = (PE.IMAGE_DOS_HEADER)Marshal.PtrToStructure(mem, typeof(PE.IMAGE_DOS_HEADER)); PE.IMAGE_FILE_HEADER fileHeader = (PE.IMAGE_FILE_HEADER)Marshal.PtrToStructure(new IntPtr(mem.ToInt64() + dosHeader.e_lfanew), typeof(PE.IMAGE_FILE_HEADER)); UInt16 IMAGE_FILE_32BIT_MACHINE = 0x0100; IntPtr entryPoint; if ((fileHeader.Characteristics & IMAGE_FILE_32BIT_MACHINE) == IMAGE_FILE_32BIT_MACHINE) { PE.IMAGE_OPTIONAL_HEADER32 optionalHeader = (PE.IMAGE_OPTIONAL_HEADER32)Marshal.PtrToStructure (new IntPtr(mem.ToInt64() + dosHeader.e_lfanew + Marshal.SizeOf(typeof(PE.IMAGE_FILE_HEADER))), typeof(PE.IMAGE_OPTIONAL_HEADER32)); entryPoint = new IntPtr(optionalHeader.AddressOfEntryPoint + imageBase.ToInt32()); } else { PE.IMAGE_OPTIONAL_HEADER64 optionalHeader = (PE.IMAGE_OPTIONAL_HEADER64)Marshal.PtrToStructure (new IntPtr(mem.ToInt64() + dosHeader.e_lfanew + Marshal.SizeOf(typeof(PE.IMAGE_FILE_HEADER))), typeof(PE.IMAGE_OPTIONAL_HEADER64)); entryPoint = new IntPtr(optionalHeader.AddressOfEntryPoint + imageBase.ToInt64()); } if (ShouldBlockDLL(dllPath.ToString())) { Console.WriteLine($"[+] Blocked DLL {dllPath}"); byte[] retIns = new byte[1] { 0xC3 }; IntPtr bytesWritten; Console.WriteLine("[+] Patching DLL Entry Point at 0x{0:x}", entryPoint.ToInt64()); if (WinAPI.WriteProcessMemory(hProcess, entryPoint, retIns, 1, out bytesWritten)) { Console.WriteLine("[+] Successfully patched DLL Entry Point"); } else { Console.WriteLine("[!] Failed patched DLL Entry Point"); } } return(dllPath.ToString()); }