aboutsummaryrefslogtreecommitdiff
path: root/CodeExecution
diff options
context:
space:
mode:
authorclymb3r <bialek.joseph@gmail.com>2013-09-03 20:10:18 -0700
committerclymb3r <bialek.joseph@gmail.com>2013-09-03 20:10:18 -0700
commit5e1f6ac29a851b6833b0e313c02f684f54a79b53 (patch)
tree0fe4e8c1849ba6816e563bc9ca5b1e390ce44dcc /CodeExecution
parent6807da424fca9e1f4b4946e695486aefb7eae1fa (diff)
downloadPowerSploit-5e1f6ac29a851b6833b0e313c02f684f54a79b53.tar.gz
PowerSploit-5e1f6ac29a851b6833b0e313c02f684f54a79b53.zip
Call to DllMain when unloading reflective DLL
Prior to this fix, DllMain with the ProessDetach flag was not called when unloading the reflectively loaded DLL. This was causing very weird crashes in the Invoke-NinjaCopy script which is built on this script. This should fix the crash.
Diffstat (limited to 'CodeExecution')
-rw-r--r--CodeExecution/Invoke-ReflectivePEInjection.ps19
1 files changed, 9 insertions, 0 deletions
diff --git a/CodeExecution/Invoke-ReflectivePEInjection.ps1 b/CodeExecution/Invoke-ReflectivePEInjection.ps1
index b582847..a9772e2 100644
--- a/CodeExecution/Invoke-ReflectivePEInjection.ps1
+++ b/CodeExecution/Invoke-ReflectivePEInjection.ps1
@@ -2620,6 +2620,15 @@ Blog on modifying mimikatz for reflective loading: http://clymb3r.wordpress.com/
$ImportDescriptorPtr = Add-SignedIntAsUnsigned ($ImportDescriptorPtr) ([System.Runtime.InteropServices.Marshal]::SizeOf($Win32Types.IMAGE_IMPORT_DESCRIPTOR))
}
}
+
+ #Call DllMain with process detach
+ Write-Verbose "Calling dllmain so the DLL knows it is being unloaded"
+ $DllMainPtr = Add-SignedIntAsUnsigned ($PEInfo.PEHandle) ($PEInfo.IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint)
+ $DllMainDelegate = Get-DelegateType @([IntPtr], [UInt32], [IntPtr]) ([Bool])
+ $DllMain = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($DllMainPtr, $DllMainDelegate)
+
+ $DllMain.Invoke($PEInfo.PEHandle, 0, [IntPtr]::Zero) | Out-Null
+
$Success = $Win32Functions.VirtualFree.Invoke($PEHandle, [UInt64]0, $Win32Constants.MEM_RELEASE)
if ($Success -eq $false)