我的函数使用了多少字节? (C#)

时间:2010-10-27 22:36:40

标签: c# multithreading

我想计算我的函数填充的字节数,以便我可以使用CreateRemoteThread()将其注入另一个进程。一旦我知道了字节数,我就可以使用函数指针将它们写入远程进程。我在网上找到了一篇文章(参见http://www.codeproject.com/KB/threads/winspy.aspx#section_3,第三章),他们在C ++中做了以下内容:

// ThreadFunc
// Notice: - the code being injected;
//Return value: password length
static DWORD WINAPI ThreadFunc (INJDATA *pData)
{
//Code to be executed remotely
}
// This function marks the memory address after ThreadFunc.
static void AfterThreadFunc (void) {
}

然后他们使用以下方法计算填充ThreadFunc个字节数:

const int cbCodeSize = ((LPBYTE) AfterThreadFunc - (LPBYTE) ThreadFunc);

使用cbCodeSize,他们为注入的ThreadFunc在远程进程中分配内存,并将ThreadFunc的副本写入分配的内存:

pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );       
if (pCodeRemote == NULL)
__leave;
WriteProcessMemory( hProcess, pCodeRemote, &ThreadFunc, cbCodeSize, &dwNumBytesXferred );

我想在C#中这样做。 :) 我已经尝试过创建委托,获取指针,然后像这样减去它们:

    // Thread proc, to be used with Create*Thread
    public delegate int ThreadProc(InjectionData param);       
    //Function pointer 
    ThreadFuncDeleg = new ThreadProc(ThreadFunc);
    ThreadFuncPtr = Marshal.GetFunctionPointerForDelegate(ThreadFuncDeleg);
    //FunctionPointer
    AfterThreadFuncDeleg = new ThreadProc(AfterThreadFunc);
    IntPtr AfterThreadFuncDelegPtr= Marshal.GetFunctionPointerForDelegate(AfterThreadFuncDeleg);
    //Number of bytes
    int cbCodeSize = (AfterThreadFuncDelegPtr.ToInt32() - ThreadFuncPtr.ToInt32())*4 ;

这似乎不对,因为无论我对代码做什么,我都会得到一个静态数字 我的问题是,如果可能的话,如何计算函数代码填充C#的字节数?

提前谢谢你。

1 个答案:

答案 0 :(得分:7)

由于.NET中的动态优化和代码生成,我认为不可能。您可以尝试测量IL代码长度,但是当您尝试在一般情况中测量机器依赖的代码长度时,它将失败。

通过'fail'我的意思是你无法通过动态使用这种技术来获得正确的大小。

当然你可以找到NGEN,JIT编译如何工作,pdb结构并尝试测量。例如,您可以通过在VS中浏览生成的机器代码来确定代码的大小。

How to see the Assembly code generated by the JIT using Visual Studio


如果 确实 需要确定尺寸,请从NET Internals and Code Injection / NET Internals and Native Compiling开始,但我无法想象你为什么要这样做。

  

请注意有关JIT如何正常工作的所有内部成员可能会发生变更因此 em> .NET的未来版本。


如果您想坚持使用IL:请检查Profiling Interfaces(CLR性能分析API)以及一些旧文章:Rewrite MSIL Code on the Fly with the .NET Framework Profiling APINo Code Can Hide from the Profiling API in the .NET Framework 2.0。在SO上还有一些关于 CLR Profiling API 的主题。

  

但探索装配的最简单方法是Reflection API,您需要MethodBody。因此,您可以查看MethodBody.GetILAsByteArrayLength,然后在 IL-commands中找到方法长度。