My goal is to call a function in a remote process using P/Invoke in C# (CreateRemoteThread). The problem is that the function takes more than one parameter. Is there a way to pass multiple parameters to the function?
Passing multiple parameters using CreateRemoteThread in C#
5.1k views Asked by osos95 AtThere are 2 answers
If the function has more than one parameter it is not possible to pass them to the function being called by CreateRemoteThread()
without using shellcode.
Passing a pointer to a structure or an array of arguments will not work.
The first argument will get passed correctly, the other arguments will exist in the memory you wrote them too, but they will not be placed into registers or the stack where they are required for the calling convention to properly access them.
If the function takes 2 arguments and you pass a pointer to a structure (as I have seen mentioned in other answers) the first argument will be placed on the stack or in a register correctly, but when the function tries to access the subsequent arguments, it will just pull whatever data was on the stack or inside the registers prior to that.
Essentially it will consider this junk data to be the arguments.
The only way to properly get the arguments where they need to be is to write shellcode to the process which loads the arguments into the proper registers and stack before performing a call or jmp to the target function.
You can easily test this by trying to perform either of these with CreateRemoteThread:
MessageBoxA(0,0,0,0);
Beep(500, 500);
You can follow the assembly yourself and easily see the problem, at no point does the assembly ever attempt to touch the addresses following the first argument. Instead it simply touches the data in the positions where the arguments are supposed to be (on the stack and in the registers, not in your structure you wrote to memory).
If your function takes a pointer to a structure, then the methods provided in the other answers will work.
In your C/C++ code have:
Cast the
LPVOID
received by the thread function toPRemoteThreadParams
(i.e.*RemoteThreadParams
).If you have some "strings" that you want as one of your parameters, then you would have to do some more work to marshal them across. For more help see:
Some other references: