Я использую функцию P / Invoke в PowerShell для вызова функции Win32 VirtualProtectEx.

Для третьего параметра требуется беззнаковый указатель int в качестве аргумента, согласно сигнатуре функции.

static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);.

У меня есть переменная с именем $shellcode, и я хочу записать ее по некоторому адресу памяти, поэтому мне нужно зарезервировать $shellcode.Length байтов. Однако я не могу понять, кого переводить на указатель. Я уже пробовал

[System.UIntPtr]$shellcode.Length

# Set memory for shellcode to Execute and Read
$oldProtect = 0
$procHandle.GetType().fullname
$basePtr.GetType().fullname
$shellcode.Length.GetType().fullname
$PAGE_EXECUTE_READWRITE.GetType().fullname
$oldProtect.GetType().fullname
$result = $Kernel32::VirtualProtectEx($procHandle, $basePtr, $shellcode.Length, $PAGE_EXECUTE_READ, [ref] $oldProtect);

Но он возвращается

System.IntPtr
System.IntPtr
System.Int32
System.Int32
System.Int32
Cannot convert argument "dwSize", with value: "168", for "VirtualProtectEx" to type
"System.UIntPtr": "Cannot convert the "168" value of type "System.Int32" to type
"System.UIntPtr"."
At C:\Users\Admin\Desktop\malware.ps1:59 char:1
+ $result = $Kernel32::VirtualProtectEx($procHandle, $basePtr, $shellco ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument
1
Axel Munoz 15 Окт 2019 в 14:29

1 ответ

Лучший ответ

Используйте конструктор: {{X0 }}.

0
Jeroen Mostert 15 Окт 2019 в 11:53