分享

远程线程注入DLL技术实战分析

 昵称y8F2YCzG 2015-04-29

先贴代码,代码是可以运行的,最后说一下要点,因为前面博文已经具体分析过远程线程注入技术,所以不具体解释。

  1. #include <Windows.h>  
  2. #include <TlHelp32.h>  
  3. #include <stdio.h>  
  4.   
  5. //////////////////////////////////////////////////////////////////////////  
  6. //  
  7. // 根据进程映像名找到进程ID  
  8. //  
  9. // 返回值:返回-1表示未找到  
  10. //         否则返回的是目标进程的ID  
  11. //  
  12. //////////////////////////////////////////////////////////////////////////  
  13.   
  14. int GetProcessId( char * szProcessName )  
  15. {  
  16.     HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPALL , 0 ) ;  
  17.     if( NULL == hSnap )  
  18.     {  
  19.         GetLastError() ;  
  20.         return -1 ;  
  21.     }  
  22.   
  23.     PROCESSENTRY32 ps32 ;  
  24.     ps32.dwSize = sizeof( PROCESSENTRY32 ) ;  
  25.   
  26.     BOOL bFlag = Process32First( hSnap , &ps32 ) ;  
  27.   
  28.     while( bFlag )  
  29.     {  
  30.         if( strcmp( ps32.szExeFile , szProcessName ) == 0 )  
  31.         {  
  32.             return ps32.th32ProcessID ;  
  33.         }  
  34.         bFlag = Process32Next( hSnap , &ps32 ) ;  
  35.     }  
  36.   
  37.     return -1 ;  
  38. }  


  1. //////////////////////////////////////////////////////////////////////////  
  2. //  
  3. //  DLL注入函数  
  4. //  
  5. //  返回值:返回-1,失败  
  6. //         返回1 ,成功  
  7. //  
  8. //  
  9. //////////////////////////////////////////////////////////////////////////  
  10.   
  11. int InjectDll( char * szProcessName , char * szDllName )  
  12. {  
  13.     DWORD dwWriteNum = 0 ;  
  14.     BOOL  bRet ;  
  15.   
  16.     char * szFuncName = "LoadLibraryA" ;  
  17.   
  18.     int nProcessId = GetProcessId( szProcessName ) ;  
  19.     if( -1 == nProcessId )  
  20.     {  
  21.         return -1 ;  
  22.     }  
  23.   
  24.     HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS , false , nProcessId ) ;  
  25.     if( NULL == hProcess )  
  26.     {  
  27.         GetLastError() ;  
  28.         return -1 ;  
  29.     }  
  30.   
  31.     int nDllLen = strlen( szDllName ) + 1 ;  
  32.   
  33.     PVOID pDllAddr = VirtualAllocEx( hProcess , NULL , nDllLen , MEM_COMMIT , PAGE_READWRITE ) ;  
  34.     if( NULL == pDllAddr )  
  35.     {  
  36.         GetLastError() ;  
  37.         CloseHandle( hProcess ) ;  
  38.         return -1 ;  
  39.     }  
  40.   
  41.     bRet = WriteProcessMemory( hProcess , pDllAddr , szDllName , nDllLen , &dwWriteNum ) ;  
  42.     if( false == bRet )  
  43.     {  
  44.         GetLastError() ;  
  45.         return -1 ;  
  46.     }  
  47.   
  48.     printf("%d\n" , dwWriteNum ) ;  
  49.   
  50.     FARPROC pFunAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), szFuncName );  
  51.     if( pFunAddr == NULL )  
  52.     {  
  53.         CloseHandle( hProcess ) ;  
  54.         return -1 ;  
  55.     }  
  56.   
  57.     HANDLE hThread = CreateRemoteThread( hProcess , NULL , NULL , ( LPTHREAD_START_ROUTINE)pFunAddr , pDllAddr ,  
  58.         NULL , NULL ) ;  
  59.     if( NULL == hThread )  
  60.     {  
  61.         GetLastError() ;  
  62.         CloseHandle( hProcess ) ;  
  63.         return -1 ;  
  64.     }  
  65.   
  66.     WaitForSingleObject( hThread , INFINITE ) ;  
  67.   
  68.     CloseHandle( hThread ) ;  
  69.     CloseHandle( hProcess ) ;  
  70.   
  71.     return 1 ;  
  72. }  

  1. //////////////////////////////////////////////////////////////////////////  
  2. //  
  3. //  卸载dll  
  4. //  
  5. //  返回值:返回-1,失败   
  6. //          返回0 , 成功  
  7. //    
  8. //////////////////////////////////////////////////////////////////////////  
  9.   
  10. int UnInjectDll( char * szProcessName , char * szDllName )   
  11. {  
  12.     int nProcessId = GetProcessId( szProcessName ) ;  
  13.     if( -1 == nProcessId )  
  14.     {  
  15.         return -1 ;  
  16.     }  
  17.   
  18.     HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE , nProcessId ) ;  
  19.     if( NULL == hSnap )  
  20.     {  
  21.         GetLastError() ;  
  22.         return -1 ;  
  23.     }  
  24.   
  25.     MODULEENTRY32 me32 ;  
  26.     me32.dwSize = sizeof( MODULEENTRY32 ) ;  
  27.   
  28.     BOOL bFlag = Module32First( hSnap , &me32 ) ;  
  29.   
  30.     while( bFlag )  
  31.     {  
  32.         if( strcmp( szDllName , me32.szExePath ) == 0 )   
  33.         {  
  34.             break;   
  35.         }  
  36.         bFlag = Module32Next( hSnap , &me32 ) ;  
  37.     }  
  38.   
  39.     CloseHandle( hSnap ) ;  
  40.   
  41.     char * szFuncName = "FreeLibrary" ;  
  42.   
  43.     HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS , false , nProcessId ) ;  
  44.     if( NULL == hProcess )  
  45.     {  
  46.         GetLastError() ;  
  47.         return -1 ;  
  48.     }  
  49.   
  50.     int nLength = strlen( szDllName ) + 1 ;  
  51.   
  52.     FARPROC pFuncAddr = GetProcAddress( GetModuleHandle( "kernel32.dll" ) , szFuncName ) ;  
  53.     if( NULL == pFuncAddr )  
  54.     {  
  55.         GetLastError() ;  
  56.         return -1 ;  
  57.     }  
  58.   
  59.     HANDLE hThread = CreateRemoteThread( hProcess , NULL , 0 , (LPTHREAD_START_ROUTINE) pFuncAddr ,  
  60.         me32.hModule , 0 , NULL ) ;  
  61.     if( NULL == hThread )  
  62.     {  
  63.         GetLastError() ;  
  64.         return -1 ;  
  65.     }  
  66.   
  67.     WaitForSingleObject( hThread , INFINITE ) ;  
  68.   
  69.     CloseHandle( hThread ) ;  
  70.     CloseHandle( hProcess ) ;  
  71.   
  72.     return 1 ;    
  73. }  

  1. int main()  
  2. {  
  3.     while( true )  
  4.     {  
  5.         int nChoose ;  
  6.         printf("Choice:") ;  
  7.         scanf( "%d" , &nChoose ) ;   
  8.   
  9.         if( 1 == nChoose )  
  10.         {  
  11.             // 给相对路径,为什么注入不成功呢?  
  12.             int nRet = InjectDll( "explorer.exe" , "C:\\Users\\Administrator\\Desktop\\TEST\\TestDll\\Debug\\TestDll.dll") ;  
  13.             if( nRet )  
  14.             {  
  15.                 printf("%d\n" , GetProcessId( "explorer.exe" ) ) ;  
  16.                 printf("注入成功!\n") ;  
  17.             }  
  18.             else  
  19.             {  
  20.                 printf("注入失败!\n") ;  
  21.             }     
  22.         }  
  23.         else if( 2 == nChoose )  
  24.         {  
  25.             int nRet = UnInjectDll( "explorer.exe" , "C:\\Users\\Administrator\\Desktop\\TEST\\TestDll\\Debug\\TestDll.dll") ;  
  26.             if( nRet )  
  27.             {  
  28.                 printf("%d\n" , GetProcessId( "explorer.exe" ) ) ;  
  29.                 printf("卸载成功!\n") ;  
  30.             }  
  31.             else  
  32.             {  
  33.                 printf("卸载失败!\n") ;  
  34.             }     
  35.   
  36.         }  
  37.         else if( 0 == nChoose )  
  38.         {  
  39.             break ;  
  40.         }  
  41.     }  
  42.   
  43.     return 1 ;  
  44. }  

上面运行截图是在我自己编写的DLL的基础上的运行结果,大家在测试的时候也只需要编写简单的提示窗口即可。


在编写过程中需要注意地方:

(1)DLL的路径。DLL的路径需要使用双斜杠隔开,即“\\"。在使用相对路径的时候,我注入失败了,实际上使用绝对路径即可。

(2)提权问题。我注入的是资源管理器的程序explorer.exe,我使用的权限是PROCESS_ALL_ACCESS,有些程序的注入可能需要提权。

(3)在注入过程肯定会被360报毒,所以最好先关了杀毒软件。提示几次之后360就把程序当做木马了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多