我想计算我的函数填充多少字节,以便我可以使用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) {
}
Run Code Online (Sandbox Code Playgroud)
然后他们使用以下方法计算ThreadFunc填充的字节数:
const int cbCodeSize = ((LPBYTE) AfterThreadFunc - (LPBYTE) ThreadFunc);
Run Code Online (Sandbox Code Playgroud)
使用cbCodeSize它们在远程进程中为注入分配内存ThreadFunc并写入ThreadFunc已分配内存的副本:
pCodeRemote = (PDWORD) VirtualAllocEx( hProcess, 0, cbCodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if (pCodeRemote == NULL)
__leave;
WriteProcessMemory( hProcess, pCodeRemote, &ThreadFunc, cbCodeSize, &dwNumBytesXferred );
Run Code Online (Sandbox Code Playgroud)
我想在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 ;
Run Code Online (Sandbox Code Playgroud)
这似乎不对,因为无论我对代码做什么,我都会得到一个静态数字.
我的问题是,如果可能的话,如何计算函数代码填充C#的字节数?
先感谢您.
由于.NET中的动态优化和代码生成,我认为不可能.您可以尝试测量IL代码长度,但是当您尝试测量机器依赖的代码长度时,它通常会失败.
通过'失败',我的意思是你不能通过动态使用这种技术来获得提供任何意义的正确尺寸.
当然你可以找到NGEN,JIT编译如何工作,pdb结构并尝试测量.例如,您可以通过在VS中浏览生成的机器代码来确定代码的大小.
如果你真的需要确定大小,请从NET Internals和Code Injection/NET Internals和Native Compiling开始,但我无法想象为什么你会想要它.
要知道有关JIT是怎么工作的是所有内部随时更改,所以要根据解决方案可以打破由任何 .NET的未来版本.
如果你想坚持使用IL:检查分析接口(CLR分析API)和一些旧文章: 使用.NET Framework分析API动态重写MSIL代码,无代码可以从.NET Framework中的分析API 隐藏2.0.在SO 上还有一些关于CLR Profiling API的主题.
但最简单的探索程序集的方法是Reflection API,你需要MethodBody.所以,你可以检查
Length的MethodBody.GetILAsByteArray,你会发现在法长度IL-命令.
| 归档时间: |
|
| 查看次数: |
447 次 |
| 最近记录: |