【发布时间】:2015-01-03 12:05:47
【问题描述】:
我试图在运行时和远程启动驻留在另一个程序中的函数。
使用 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 注入(这不是我要搜索的内容),我实际上只想用一个代码来实现。 谢谢。
【问题讨论】:
-
直接处理寄存器是操作系统/目标特定的??您是否错过了指定缩小范围的标签?
-
这是在 Windows,IA32 中
-
许多编译器允许在 C/C++ 代码中嵌入汇编指令,但不同编译器之间的语法差异很大。你用的是什么编译器?您是否已经阅读过文档?
-
CreateRemoteThread 仅允许您调用接受单个 LPVOID 参数的函数(如 ThreadProc)。考虑到您正在释放包含该函数的页面这一事实:您是自己注入该函数吗?如果是这样:更改签名以使其符合 ThreadProc。如果不是:也许您可以先注入一个辅助函数(使用 ThreadProc 的签名),在调用实际目标之前将结构的成员(作为 LPVOID 传递)推送到堆栈上。
-
@Paulo1205 我正在使用 g++,是的,我要更改的寄存器是另一个程序,而不是我正在编写的程序,因此只有在我将代码注入到其他程序
标签: c++ windows multithreading memory reverse-engineering