您的位置:首页 > 其它

远程注入线程中一些经常犯的错误

2010-05-19 10:27 603 查看
  作者:韩思远          出处:http://blog.csdn.net/siyuanpc

  

  这是我在CSDN写的第一篇文章!希望大家多支持!谢谢!

  大家可能都知道远程注入的过程,网络上也有很多关于远程注入的文章大体都是写如何注入的过程和API的用法!但却忽视了一些细节的地方!本篇文章结合JEFFREY RICHTER的远程注入线程为背景深入分析这些代码后面容易让初学者犯的一些错误!好言归正传!

  首先大家都知道要给一个远程进程注入我们想运行的代码首先要在远程进程中分配一块内存空间!这块内存空间并不是存放我们的代码而是要存放我们注入到远程进程中DLL的路径名!(这里是个容易出错的地方)

  还有经过我反复研究当在XP下注入的时候不用考虑权限问题!只有你是以系统管理员身份登录!

  而在VISTA或WINDOWS7下要执行注入的时候我们必须选择以管理员方式运行!否则一定注入失败!而且在你运行VS的时候要用以管理员方式启动!这样调试的时候才能注入成功!另外在WINDOWS核心编程中给过一段提权代码!我也研究过 基本没用。。。所以最重要的还是管理员权限!

  下面我按步骤来说明如和实现这个过程以及其中都会出现哪些错误!

   第一步我们要获得我们想要注入的进程句柄!这里我推荐一个我喜欢的方法!

 

HANDLE hProcessHandleg=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  //得到当前所有进程的快照
if(hProcessHandleg==INVALID_HANDLE_VALUE)
{return FALSE;}
//枚举当前所有进程,以得到需要的信息!
::Process32FirstW(hProcessHandleg,&pe32);
do
{

if(wcscmp(pe32.szExeFile,_T("我们想要注入的进程名字(可以通过SPY++获得)"))==0)
{
HWND remotehandle=::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_READ,FALSE,pe32.th32ProcessID);//这里要注意分配给远程进程句柄的访问权限!如果你是WINDWOWS VISTA以上的操作系统 一定不能用PROCESS_ALL_ACCESS权限!
break;
}
}
while(::Process32NextW(hProcessHandleg,&pe32));


 

在获得远程进程句柄以后就可以在远程进程中分配一块空间以存放我们的DLL路径!这里为什么要用红字!我就犯过错误,当时只是简单的传了一个相对路径名(一直写自己程序的DLL写习惯了)所以在后期调试的时候明明已经注入成功但是怎么也不运行DLL中的代码!所以大家一定要注意这里!

 

  
//这里的dllname一定要让你的远程进程找的到!
int cch=10+lstrlenW(dllname);
//cb为DLLNAME的大小
int cb=cch*sizeof(TCHAR);

pbuffer=::VirtualAllocEx(remotehandle,NULL,cb,MEM_COMMIT,PAGE_READWRITE);


 

第三步我们要向远程进程中写入我们DLL的名字 这里一般不会有什么特别难理解的!
::WriteProcessMemory(remotehandle,pbuffer,dllname,cb,NULL)


 

到此准备工作已经全部就绪!该让我那的远程进程只想我们线程函数了!怎么执行!JEFFREY给我提供的方法是把KERNEL32.DLL里面的一个函数LOADLIBRARY改造成我们的线程函数!为什么要用KERNEL32.DLL他给的解释是这个DLL是几乎所有WINDOWS程序都要加载的DLL所以远程进程很容易能找到这个DLL里面的函数地址!另外LOADLIBRARY函数的声明与线程函数的声明很像!尤其是函数的返回值!而且都需要一个参数!这里我贴下线程函数的形式:

DWORD WINAPI ThreadProc(__in  LPVOID lpParameter);


HINSTANCE LoadLibrary( LPCTSTR lpLibFileName );


HINSTANCE其实就是个DWORD!!


接下来我们开始改造函数!这个过程通过GETPROCADDRESS函数完成


PTHREAD_START_ROUTINE pfnThreadRtn=(PTHREAD_START_ROUTINE) ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryW");
[/code]

改造函数后我们就可以创建我们的远程线程了!


remotethread=::CreateRemoteThread(remotehandle,NULL,0,pfnThreadRtn,pbuffer,0,&dwThreadID);
//这里给我们的远程线程函数传递的参数是我们分配到远程进程中的DLL名字所占的内存句柄!
[/code]

好了现在我们的远程线程已经启动了 还要注意的是在编写我们自己DLL的时候要把我们的代码挂接到DLL_PROCESS_ATTACH中!这样我们的远程线程就会在挂接到进程的时候启动!当然我们要让我们的远程线程函数在远程进程在创建一个工作线程!以防止远程进程只执行我们的线程而停止自己的工作!


当我们用完这些远程线程好我们要记得释放我们分配的各种资源!这里我就不在贴代码了!具体的大家看看JEFFERY的代码!


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息