我试图在运行时和远程启动驻留在另一个程序中的函数。
使用ollydbg我得到了函数地址,我使用CreateRemoteThread来启动这个函数,它实际上运行了这个函数但是,它重现了两个参数,没有那些参数,程序崩溃了。
问题是这个函数从EAX和ECX获取参数/参数,这些参数/参数在被调用之前被推送到这个函数(这两个值都是从1到576的矩阵共存~~)
Createremotethread没有用于插入参数,我尝试使用struct来使用多个(2)参数,但寄存器中的值不会改变。
如何通过从另一个不同的程序启动并设置这两个寄存器来使这个功能在另一个程序上运行?
这是我调用线程在0x01003084中执行此函数的代码
struct tagRemoteThreadParams //didnt worked
{
int Param1;
int Param2;
} RemoteThreadParams, *PRemoteThreadParams;
RemoteThreadParams.Param1 = 0x00000001;//didnt worked
RemoteThreadParams.Param2 = 0x00000001;//didnt worked
int address=0x010038B1; // 0x01003084 -- 0x01002FE0 -- 0x01003512 //Some addresses
RedrawWindow(Find,NULL,NULL,RDW_ERASE|RDW_INVALIDATE|RDW_INTERNALPAINT|RDW_FRAME); //my program stuff
DWORD rc;
//this is where i call the function
CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)address,&RemoteThreadParams,0,&rc);
rc = WaitForSingleObject( hProcess, 30000 );
CloseHandle(hProcess);
VirtualFreeEx(hProcess, (LPVOID)address, 0, MEM_RELEASE | MEM_DECOMMIT);
请记住,我不想使用DLL注入(这不是我正在搜索的内容),我实际上只想用一个代码来实现。 感谢。
答案 0 :(得分:1)
您唯一的解决方案是将代码注入到正确设置寄存器的其他进程中,然后调用您要调用的函数。 CreateRemoteThread
具有严格的调用约定,因此您不能强制它在输入时具有特定的寄存器值。
另一种方法是使用Windows中的debug functionality来更改寄存器内容,但这需要您在正确的位置停止代码[在正确的线程中]并在继续之前设置寄存器。这是棘手的,大多数应用程序(假设我们正在游戏等)都有保护,以防止调试功能“搞乱”他们的状态。
答案 1 :(得分:1)
好吧,你不能将该函数作为CreateRemoteThread
的线程proc传递,因为该函数没有正确的签名。因此,您需要传递一个具有正确签名的函数。
一种非常常见的方法是传递LoadLibrary
的地址。您需要提供自己的DLL。然后,该DLL的DllMain
可以创建一个调用您的函数的新线程。
但是你说你不想涉及另一个DLL。所以在我看来,留下一个选项。在目标进程的虚拟地址空间中分配一些内存。使该内存具有可执行保护。使用CreateRemoteThread
的正确签名将该线程过程写入该内存。最后,在这个线程程序中,调用所需的函数。