求助,谁能写个CreateRemoteThread调用GetProcAddress的函数,谢谢
我自己写的死活不对
//把参数结构体放入目标程序内存中
LPVOID pDataRemote;
pDataRemote=(ParamsStruct*)VirtualAllocEx(processAddr, 0, sizeof(ParamsStruct),MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(processAddr, pDataRemote, ¶ms, sizeof(ParamsStruct), 0);
//开始在目标程序中执行GetProcAddress函数,错误出现在这里:用OD反汇编跟踪目标程序,发现在目标程序中执行GetProcAddress的参数完全不对,HMODULE变成pDataRemote的值(把pDataRemote当作数值处理了,而正确的话应该是0x64A30000才对)
HMODULE kAddr = GetModuleHandle(_T("kernel32.dll"));
FARPROC getProcAddressAddr = GetProcAddress(kAddr, "GetProcAddress");
HANDLE tempHandle = CreateRemoteThread(processAddr, NULL, 0, (LPTHREAD_START_ROUTINE)getProcAddressAddr,pDataRemote, 0, 0);
WaitForSingleObject(tempHandle, 0x0FFFFFFF);
[解决办法]
建议楼主查查CreateRemoteThread函数的定义:
CreateRemoteThreadHANDLE CreateRemoteThread(
HANDLE hProcess, // handle to process
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
SIZE_T dwStackSize, // initial stack size
LPTHREAD_START_ROUTINE lpStartAddress, // thread function
LPVOID lpParameter, // thread argument
DWORD dwCreationFlags, // creation option
LPDWORD lpThreadId // thread identifier
);
调用CreateRemoteThread之后,会在目标进程里启动一个线程,线程函数为lpStartAddress所指向的函数,调用该函数的实参为lpParameter,只有一个参数,所以不能直接设置lpStartAddress为GetProcAddress函数的地址。楼主可以自己写一个只有一个参数的函数作为线程函数,在该线程函数里调用GetProcAddress.
具体可以参考:
http://hi.baidu.com/hurryhx/blog/item/8c748d025c7e420d4afb513c.html
[解决办法]
给你两个方法
1.先CREATE_SUSPEND,用GetThreadContext得到线程的栈指针,安放好参数和返回值,然后把指令指针设置为GetProcAddress
2.在目标进程分配一块内存name,放过程名字,然后分配一块可执行的内存code,放push name,push hmodule,call [esp+12],ret 4的机器码,然后CreateRemoteThread从code开始执行,lpParameter就给GetProcAddress的地址