线程注入的问题
最近在学习线程注入技术
现在要把一个dll注入到记事本进程中.
这是我的注入线程的工作函数
DWORD WINAPI remote(LPVOID pvparam)
{
REMOTEPARAM *rp=(REMOTEPARAM*)pvparam;
EBeep tBeep = (EBeep)rp->rpBeep;
ELoadLibrary tLoadLibrary = (ELoadLibrary)rp->rpLoadLibrary;
HINSTANCE hInst = tLoadLibrary(rp->path);
// if (NULL == hInst)
// tBeep(3000, 100);
EGetProcAddress tGetProcAddress = (EGetProcAddress)rp->rpGetProcAddress;
typedef void (WINAPI *Ms)();
Ms makesounds;
makesounds = (Ms)tGetProcAddress(hInst, rp->szFunc); //返回的函数指针老是null
if (NULL == makesounds)
tBeep(3000, 100);
// makesounds();
return 0;
}
我的dll中的函数是:
_declspec(dllexport)void MakeSounds()
{
Beep(32767, 1000);
}
实在是不晓得问题出在哪里了!不用动态链接库的版本我好了,我相信我的步骤是对的,但是为什么用dll的版本就成功不了呢????
还请大家多多指教,不胜感激!
------解决方案--------------------
标准步骤如下:
1 GetWindowThreadProcessId ,得到该窗口进程Id,存放在dwProcess中
' 2 OpenProcess,打开该进程(如果失败,可能是权限不够,需要用AdjustTokenPrivileges提升一下当前进程的权限),得到一个该进程的句柄,存放在hProcess中
' 3 IsWindowUnicode,判断下一步应该调用GetWindowLongA 还是GetWindowLongW函数
' 4 VirtualAllocEx,在目标进程中分配一些内存,供我们写入线程函数使用。函数返回的就是分配的内存的起始地址,就是我们的线程函数的起始地址,假设叫fnStartAddr;根据我们上边分析的结果,需要33个字节,另外,线程函数最后要有一个 ret指令,占用一个字节,共需34个字节
' 5 把以上分析的结果写入一个临时的缓冲区里
' 6 调用 WriteProcessMemory,把刚才的结果写入远程进程 fnStartAddr的地址处
' 7 调用 CreateRemoteThread,指定线程函数地址为 fnStartAddr
' 8 进行一个小的消息循环,等待我们的返回结果MSG msg;
' 最后进行一些善后工作,关闭打开的线程句柄、进程句柄,释放分配的远程内存
估计是你的权限没有提升