2014-11-06 25 views
0

我试图在运行时和远程启动驻留在另一个程序中的函数。远程调用函数设置EAX和ECX

使用ollydbg我得到了函数地址和即时通讯使用CreateRemoteThread来启动这个函数,它实际上运行这个函数,但它收回两个参数,没有这些参数程序崩溃。

的问题是,这种机能的研究得到的参数/从EAX和ECX参数都推到这个功能,它被称为前(这两个值是去从1到576这两个矩阵coordenates ~~)

Function its called at 10038B1 and recives ECX and EAX

Createremotethread没有为inseting参数工作,我试图使用结构使用多个(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

直接处理寄存器是OS /目标特定?您是否错过了指定缩小的标签? – 2014-11-06 20:24:01

+0

这是在Windows,IA32 – Ollegn 2014-11-06 20:31:02

+0

许多编译器允许在C/C++代码中嵌入汇编指令,但不同编译器之间的语法差别很大。你使用什么编译器?你有没有阅读过文档? – Paulo1205 2014-11-06 21:08:55

回答

1

您唯一的解决方案的确是将代码注入到另一个进程中,该进程可以正确设置寄存器,然后调用您想要调用的函数。 CreateRemoteThread具有严格的调用约定,因此您不能强制它在输入时具有特定的寄存器值。

另一种方法是在Windows中使用debug functionality来更改寄存器内容,但这需要您在正确的位置停止代码并在继续之前设置寄存器。这是棘手的,大多数应用程序(假设我们正在玩游戏等)有防止调试功能与他们的状态“搞乱”的保护。

1

那么,您不能将该函数作为CreateRemoteThread的线程处理函数传递,因为该函数没有正确的签名。所以,你需要传递一个具有正确签名的函数。

一个很常见的方法是通过LoadLibrary的地址。你需要提供你自己的DLL。该DLL的DllMain然后可以创建一个调用您的函数的新线程。

但你说你不想涉及另一个DLL。所以在我看来,留下一个选择。在目标进程的虚拟地址空间中分配一些内存。使该内存具有可执行的保护。在该内存中写入一个具有CreateRemoteThread正确签名的线程程序。然后在这个线程过程中,最后调用所需的函数。