日期:2014-05-17  浏览次数:20732 次

线程注入的问题
最近在学习线程注入技术 
现在要把一个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;
' 最后进行一些善后工作,关闭打开的线程句柄、进程句柄,释放分配的远程内存



估计是你的权限没有提升