簡體   English   中英

將 C# 轉換為 Powershell 涉及 DllImport

[英]Converting C# into Powershell with DllImport involved

我最近一直在做一個小項目,看看我是否可以對 memory 進行一些編輯以與 PowerShell 一起使用。 我在 C# 中編寫了一個小腳本,它不需要管理權限,運行時會在 Hill Climb Racing 中為您提供最大的硬幣和鑽石。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace HCRtest2
{
    public class Programmmm
    {
        public static void Main()
        {
            [DllImport("kernel32.dll")]
            static extern bool WriteProcessMemory(IntPtr hProcess, long lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesRead);
            long BaseAddress;
            IntPtr ProcessHandle;
            Process process = Process.GetProcessesByName("HillClimbRacing")[0];
            if (process.Handle.ToInt64() != 0L)
            {
                BaseAddress = process.MainModule.BaseAddress.ToInt64();
                ProcessHandle = process.Handle;
                uint num = 0U;
                WriteProcessMemory(ProcessHandle, BaseAddress + 0x28CAD4, BitConverter.GetBytes(2147483647), 4U, out num);
                WriteProcessMemory(ProcessHandle, BaseAddress + 0x28CAEC, BitConverter.GetBytes(2147483647), 4U, out num);
            }
        }
    }
}

我現在的挑戰是看看我是否可以找到一種方法在我的學校筆記本電腦上執行此代碼,該筆記本電腦沒有管理員權限或無法訪問打開的未知可執行文件,但它確實可以訪問 PowerShell(當然是非管理員)。 我一直在做很多研究,但找不到將此腳本移植到 PowerShell 的好方法。 如果有人有任何好主意,請告訴我,因為這讓我現在很緊張。

該網站提供了有關如何在 powershell session 中玩 c# 的答案。

$code = @"
using System;
namespace HelloWorld
{
    public class Program
    {
        public static void Main(){
            Console.WriteLine("Hello world!");
        }
    }
}
"@
 
Add-Type -TypeDefinition $code -Language CSharp 
iex "[HelloWorld.Program]::Main()"

上下班已經有幾個月了,但我發現所有東西都必須標記為公共和 static,此外我還缺少確保進程正確打開所需的方法,這里是可以在 Powershell 中執行的工作代碼。

$code = @"
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace HelloWorld
{
    public class Program
    {
        public const int ProcessVMWrite = 0x0020;
        public const int ProcessVMOperation = 0x0008;

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool WriteProcessMemory
            (
                IntPtr hProcess,
                long lpBaseAddress,
                byte[] lpBuffer,
                int nSize,
                out int lpNumberOfBytesRead
            );

        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess
            (
                int dwDesiredAccess,
                bool bInheritHandle,
                int dwProcessId
            );
        
        public static IntPtr Handle;
        public static long BaseAddress;

        public static void Main(){
            Process process = Process.GetProcessesByName("HillClimbRacing")[0];
            Handle = OpenProcess(ProcessVMOperation | ProcessVMWrite, false, process.Id);
            BaseAddress = process.MainModule.BaseAddress.ToInt64();
            int thingy = 0;
            WriteProcessMemory(Handle, BaseAddress + 0x28CAD4L, BitConverter.GetBytes(2147483647), 4, out thingy);
            WriteProcessMemory(Handle, BaseAddress + 0x28CAECL, BitConverter.GetBytes(2147483647), 4, out thingy);
        }
    }
}
"@
 
Add-Type -TypeDefinition $code -Language CSharp 
iex "[HelloWorld.Program]::Main()"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM