先贴代码,代码是可以运行的,最后说一下要点,因为前面博文已经具体分析过远程线程注入技术,所以不具体解释。
- #include <Windows.h>
- #include <TlHelp32.h>
- #include <stdio.h>
-
- //////////////////////////////////////////////////////////////////////////
- //
- // 根据进程映像名找到进程ID
- //
- // 返回值:返回-1表示未找到
- // 否则返回的是目标进程的ID
- //
- //////////////////////////////////////////////////////////////////////////
-
- int GetProcessId( char * szProcessName )
- {
- HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPALL , 0 ) ;
- if( NULL == hSnap )
- {
- GetLastError() ;
- return -1 ;
- }
-
- PROCESSENTRY32 ps32 ;
- ps32.dwSize = sizeof( PROCESSENTRY32 ) ;
-
- BOOL bFlag = Process32First( hSnap , &ps32 ) ;
-
- while( bFlag )
- {
- if( strcmp( ps32.szExeFile , szProcessName ) == 0 )
- {
- return ps32.th32ProcessID ;
- }
- bFlag = Process32Next( hSnap , &ps32 ) ;
- }
-
- return -1 ;
- }
- //////////////////////////////////////////////////////////////////////////
- //
- // DLL注入函数
- //
- // 返回值:返回-1,失败
- // 返回1 ,成功
- //
- //
- //////////////////////////////////////////////////////////////////////////
-
- int InjectDll( char * szProcessName , char * szDllName )
- {
- DWORD dwWriteNum = 0 ;
- BOOL bRet ;
-
- char * szFuncName = "LoadLibraryA" ;
-
- int nProcessId = GetProcessId( szProcessName ) ;
- if( -1 == nProcessId )
- {
- return -1 ;
- }
-
- HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS , false , nProcessId ) ;
- if( NULL == hProcess )
- {
- GetLastError() ;
- return -1 ;
- }
-
- int nDllLen = strlen( szDllName ) + 1 ;
-
- PVOID pDllAddr = VirtualAllocEx( hProcess , NULL , nDllLen , MEM_COMMIT , PAGE_READWRITE ) ;
- if( NULL == pDllAddr )
- {
- GetLastError() ;
- CloseHandle( hProcess ) ;
- return -1 ;
- }
-
- bRet = WriteProcessMemory( hProcess , pDllAddr , szDllName , nDllLen , &dwWriteNum ) ;
- if( false == bRet )
- {
- GetLastError() ;
- return -1 ;
- }
-
- printf("%d\n" , dwWriteNum ) ;
-
- FARPROC pFunAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), szFuncName );
- if( pFunAddr == NULL )
- {
- CloseHandle( hProcess ) ;
- return -1 ;
- }
-
- HANDLE hThread = CreateRemoteThread( hProcess , NULL , NULL , ( LPTHREAD_START_ROUTINE)pFunAddr , pDllAddr ,
- NULL , NULL ) ;
- if( NULL == hThread )
- {
- GetLastError() ;
- CloseHandle( hProcess ) ;
- return -1 ;
- }
-
- WaitForSingleObject( hThread , INFINITE ) ;
-
- CloseHandle( hThread ) ;
- CloseHandle( hProcess ) ;
-
- return 1 ;
- }
- //////////////////////////////////////////////////////////////////////////
- //
- // 卸载dll
- //
- // 返回值:返回-1,失败
- // 返回0 , 成功
- //
- //////////////////////////////////////////////////////////////////////////
-
- int UnInjectDll( char * szProcessName , char * szDllName )
- {
- int nProcessId = GetProcessId( szProcessName ) ;
- if( -1 == nProcessId )
- {
- return -1 ;
- }
-
- HANDLE hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE , nProcessId ) ;
- if( NULL == hSnap )
- {
- GetLastError() ;
- return -1 ;
- }
-
- MODULEENTRY32 me32 ;
- me32.dwSize = sizeof( MODULEENTRY32 ) ;
-
- BOOL bFlag = Module32First( hSnap , &me32 ) ;
-
- while( bFlag )
- {
- if( strcmp( szDllName , me32.szExePath ) == 0 )
- {
- break;
- }
- bFlag = Module32Next( hSnap , &me32 ) ;
- }
-
- CloseHandle( hSnap ) ;
-
- char * szFuncName = "FreeLibrary" ;
-
- HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS , false , nProcessId ) ;
- if( NULL == hProcess )
- {
- GetLastError() ;
- return -1 ;
- }
-
- int nLength = strlen( szDllName ) + 1 ;
-
- FARPROC pFuncAddr = GetProcAddress( GetModuleHandle( "kernel32.dll" ) , szFuncName ) ;
- if( NULL == pFuncAddr )
- {
- GetLastError() ;
- return -1 ;
- }
-
- HANDLE hThread = CreateRemoteThread( hProcess , NULL , 0 , (LPTHREAD_START_ROUTINE) pFuncAddr ,
- me32.hModule , 0 , NULL ) ;
- if( NULL == hThread )
- {
- GetLastError() ;
- return -1 ;
- }
-
- WaitForSingleObject( hThread , INFINITE ) ;
-
- CloseHandle( hThread ) ;
- CloseHandle( hProcess ) ;
-
- return 1 ;
- }
- int main()
- {
- while( true )
- {
- int nChoose ;
- printf("Choice:") ;
- scanf( "%d" , &nChoose ) ;
-
- if( 1 == nChoose )
- {
- // 给相对路径,为什么注入不成功呢?
- int nRet = InjectDll( "explorer.exe" , "C:\\Users\\Administrator\\Desktop\\TEST\\TestDll\\Debug\\TestDll.dll") ;
- if( nRet )
- {
- printf("%d\n" , GetProcessId( "explorer.exe" ) ) ;
- printf("注入成功!\n") ;
- }
- else
- {
- printf("注入失败!\n") ;
- }
- }
- else if( 2 == nChoose )
- {
- int nRet = UnInjectDll( "explorer.exe" , "C:\\Users\\Administrator\\Desktop\\TEST\\TestDll\\Debug\\TestDll.dll") ;
- if( nRet )
- {
- printf("%d\n" , GetProcessId( "explorer.exe" ) ) ;
- printf("卸载成功!\n") ;
- }
- else
- {
- printf("卸载失败!\n") ;
- }
-
- }
- else if( 0 == nChoose )
- {
- break ;
- }
- }
-
- return 1 ;
- }


上面运行截图是在我自己编写的DLL的基础上的运行结果,大家在测试的时候也只需要编写简单的提示窗口即可。
在编写过程中需要注意地方:
(1)DLL的路径。DLL的路径需要使用双斜杠隔开,即“\\"。在使用相对路径的时候,我注入失败了,实际上使用绝对路径即可。
(2)提权问题。我注入的是资源管理器的程序explorer.exe,我使用的权限是PROCESS_ALL_ACCESS,有些程序的注入可能需要提权。
(3)在注入过程肯定会被360报毒,所以最好先关了杀毒软件。提示几次之后360就把程序当做木马了。
|