gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:46:08 25 4
gpt4 key购买 nike

我想计算我的函数填充了多少字节,以便我可以使用 CreateRemoteThread() 将它注入(inject)另一个进程。一旦我知道字节数,我就可以使用函数指针将它们写入远程进程。我在网上找到一篇文章(请参阅 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 在远程进程中为注入(inject)的 ThreadFunc 分配内存,并将 ThreadFunc 的副本写入分配的内存:

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

我想在 C# 中执行此操作。 :)我试过创建委托(delegate),获取他们的指针,然后像这样减去它们:

    // 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# 中填充的字节数?

提前致谢。

最佳答案

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

“失败” 的意思是您无法通过动态使用此技术获得提供任何意义的正确尺寸。

当然,您可以了解 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但我无法想象你为什么想要它。

Be aware all internals about how JIT works exactly is subject to change so depending solution can be broken by any future version of .NET.


如果你想坚持使用 IL:检查 Profiling Interfaces (CLR Profiling 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 的主题。

But simplest way to explore assembly is Reflection API, you want MethodBody there. So you can check Length of MethodBody.GetILAsByteArray and you'll find method length in IL-commands.

关于c# - 我的函数使用多少字节? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com