C# 等效于 AutoHotKey NumPut 和 VarSetCapacity

问题描述

我正在尝试从使用 AutoHotKey 语言编程的 this repository 转换此函数。 但我最终陷入了一个问题:在 C# 中,AutoHotKey 中的 NumPut 和 VarSetCapacity 函数相当于什么?

我要转换的函数通过传递可以动态的参数调用内存过程中的某些函数

自动热键:

callWithParams(hProcess,dwFunc,aParams,bCleanupStack = true) {
    if(!hProcess) {
        ErrorLevel := ERROR_INVALID_HANDLE
        return false
    }
    validParams := 0
    
    i := aParams.MaxIndex()
    
    ;         i * PUSH + CALL + RETN
    dwLen := i * 5    + 5    + 1
    if(bCleanupStack)
        dwLen += 3
    VarSetCapacity(injectData,i * 5    + 5       + 3       + 1,0) //This <------------
    
    i_ := 1
    while(i > 0) {
        if(aParams[i][1] != "") {
            dwMemAddress := 0x0
            if(aParams[i][1] == "p") {
                dwMemAddress := aParams[i][2]
            } else if(aParams[i][1] == "s") {
                if(i_>3)
                    return false
                dwMemAddress := pParam%i_%
                writeString(hProcess,dwMemAddress,aParams[i][2])
                if(ErrorLevel)
                    return false
                i_ += 1
            } else if(aParams[i][1] == "i") {
                dwMemAddress := aParams[i][2]
            } else {
                return false
            }
            NumPut(0x68,injectData,validParams * 5,"UChar") //And this <------------
            NumPut(dwMemAddress,validParams * 5 + 1,"UInt")
            validParams += 1
        }
        i -= 1
    }
    
    offset := dwFunc - ( pInjectFunc + validParams * 5 + 5 )
    NumPut(0xE8,"UChar")
    NumPut(offset,"Int")
    
    if(bCleanupStack) {
        NumPut(0xC483,validParams * 5 + 5,"UShort")
        NumPut(validParams*4,validParams * 5 + 7,"UChar")
        
        NumPut(0xC3,validParams * 5 + 8,"UChar")
    } else {
        NumPut(0xC3,"UChar")
    }
    
    writeRaw(hGTA,pInjectFunc,&injectData,dwLen)
    if(ErrorLevel)
        return false
    
    hThread := createRemoteThread(hGTA,0)
    if(ErrorLevel)
        return false
    
    waitForSingleObject(hThread,0xFFFFFFFF)
    
    closeProcess(hThread)
    
    return true
}

C#:

public class ParamsObject
{
    public String type { get; set; }
    public dynamic value { get; set; }
}

public static bool callWithParams(IntPtr hProcess,int dwFunc,ParamsObject[] aParams,bool bCleanupStack = true)
        {
            if (hProcess == IntPtr.Zero) return false;
            int validParams = 0;

            int i = aParams.Length;
            int dwLen = i * 5 + 5 + 1;
            int i_ = 1;
            if (bCleanupStack) dwLen += 3;
            
            //this is VarSetCapacity (maybe?)
            byte[] injectData = new byte[i * 5 + 5 + 3 + 1];

            foreach(ParamsObject param in aParams)
            {
                if (!String.IsNullOrEmpty(param.type))
                {
                    dynamic dwMemAddress = 0x0;
                    if(param.type == "p")
                    {
                        dwMemAddress = param.value;
                    } else if (param.type == "s")
                    {
                        if (i_ > 3) return false;
                        if (i_ == 1) dwMemAddress = (int)pParam1;
                        if (i_ == 2) dwMemAddress = (int)pParam2;
                        if (i_ == 3) dwMemAddress = (int)pParam3;
                        if (!WriteString(hProcess,param.value)) return false;
                        i_ += 1;
                    } else if (param.type == "i")
                    {
                        dwMemAddress = param.value;
                    } else
                    {
                        return false;
                    }
                    //Here I need the NumPut <----------
                }
            }

            return true;
        }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)