gpt4 book ai didi

c# - 在不是用 .NET 编写的另一个进程中调用函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:53 26 4
gpt4 key购买 nike

我想在另一个进程中调用一个函数,并通过 createremotethread 发送超过 1 个参数。

现在,我可以通过发送内联 asm 来做到这一点,但我对汇编的了解不够多,无法那样做。此外,我无权访问远程进程源代码。

我在考虑使用:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct RemoteThreadParams
{
[MarshalAs(UnmanagedType.I4)]
public int Param1;

[MarshalAs(UnmanagedType.I4)]
public int Param2;

}

但据我了解,远程进程必须知道如何处理它。

有没有一种简单的方法可以向不包含任何程序集的远程进程发送超过 1 个参数?

编辑:

这就是我目前尝试解决它的方式,但我遇到内存不足异常,我真的不明白我做错了什么。

我们在远程进程中的 0x64D480 处有我们的函数 ptr,这是从 IDA pro 中获取的程序集。

// FUNCTION PTR IS 0x64D480
.text:0064D480 sub_64D480 proc near ; CODE XREF: sub_4DA7F0+3Ap
.text:0064D480 ; sub_64D550+Bp ...
.text:0064D480
.text:0064D480 var_C = dword ptr -0Ch // arg1
.text:0064D480 arg_0 = dword ptr 4 // arg2
.text:0064D480
.text:0064D480 push esi
.text:0064D481 push edi
.text:0064D482 mov edi, [esp+8+arg_0]
.text:0064D486 push edi
.text:0064D487 mov esi, ecx
.text:0064D489 call sub_64D330
.text:0064D48E test al, al
.text:0064D490 jnz short loc_64D497
.text:0064D492 pop edi
.text:0064D493 pop esi
.text:0064D494 retn 4

是不是应该可以这样调用函数:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct RemoteThreadParams
{
[MarshalAs(UnmanagedType.I4)]
public int Param1;

[MarshalAs(UnmanagedType.I4)]
public int Param2;

}

void CallFunction(IntPtr _functionPtr, RemoteThreadParams _parameters)
{
// Allocate some native heap memory in your process big enough to store the parameter data
IntPtr iptrtoparams = Marshal.AllocHGlobal(Marshal.SizeOf(_parameters));

// Copies the data in your structure into the native heap memory just allocated
Marshal.StructureToPtr(_parameters, iptrtoparams, false);
// Use to alloc "committed" memory that is addressable by other process
IntPtr iptrremoteallocatedmemory = VirtualAllocEx(this.handle, IntPtr.Zero, (uint)Marshal.SizeOf(_parameters), AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
UIntPtr bytesWritten = UIntPtr.Zero;
// Copy from local process memory to the memory of the remote process
WriteProcessMemory(this.handle, iptrremoteallocatedmemory, iptrtoparams, (uint)Marshal.SizeOf(_parameters), out bytesWritten);
//Free up memory
Marshal.FreeHGlobal(iptrtoparams);

//thread id and return value in case we need it for later
uint iThreadId;
uint returnValue = 0;

IntPtr hThread = CreateRemoteThread(this.handle, IntPtr.Zero, 0, _functionPtr, iptrtoparams, 0, out iThreadId);

WaitForSingleObject(hThread, 0xFFFFFFFF);
GetExitCodeThread(hThread, out returnValue);

CloseHandle(hThread);
CloseHandle(this.handle);
}

最佳答案

没有简单的方法。最简单的方法是使用 LoadLibrary 和非托管代码来执行此操作。您需要两个版本:32 位 dll 和 64 位 dll,您根据目标进程的“位数”选择注入(inject)哪个版本。

CreateRemoteThread(....., Address of LoadLibrary,   "location of your unmanaged dll");

当您用谷歌搜索 C# CreateRemoteThread LoadLibrary 时,您会在 Internet 上找到引用资料。

之后,您希望自定义 dll 进行函数调用:

#include "stdafx.h"

typedef void (__stdcall *MyCustomFunc)(int param1, int param2);

BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
// this code is executed arbitrarily.
// this is just a test,
// you're better off writing a separate function in a DLL
// and export it, so you can later call it from C#, once DLL is injected.
MyCustomFunc test = 0x64D480;
test(2, 4);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

ps,如果需要的话,你还需要FreeLibrary。正确调用约定也很重要。我在这里有点冒险,说它看起来像 __stdcall,但它可能是 __cdecl、__fastcall 或其他任何东西。请参阅:http://www.codeproject.com/Articles/1388/Calling-Conventions-Demystified了解更多信息。

关于c# - 在不是用 .NET 编写的另一个进程中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264910/

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