仿照SirCAM病毒控制EXE进程(4)
Chapter
4
将要插入的DLL的制造过程(1)
现在我们制作所需的InjectProcess.DLL。
记得你的DLL一定要短小精悍,不要太大了!
最好不要用Wizard生成,你自己亲手写吧,这样可免除许多不必要代码。
第一个应用自然是给用户进程前面加一个启动封面,这个又好看又实用,而且代码也很简单喔。
首先我们写出ATL DLL的代码,当然你可以用ATL COM Wizard来生成,记住一定要写
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
的实现,否则后面的ATL窗口就不显示了,偶也不知道为什么,喂,那个小孩,砖头是凶器,不要乱扔喔!
然后用ATL Object Wizard加入一个Dialog object,就叫Splasher吧:
记得把那些无用的花花草草都删掉,如OnOK,OnCancel,两个按钮等等。并设置对话框为没有TITLEBAR和SYSTEMMENU!
加几个成员变量:
// Special members:
public:
// Variable that tells us if we want to auto-delete ourselves.
BYTE m_bAutoDelete;
static BOOL m_c_bShowSplasher;
static CSplasher* m_c_pSplasher;
它的构造和析构要这样作:
// Set m_bAutoDelete to TRUE to automatically delete ourselves.
CSplasher(): m_bAutoDelete (TRUE)
{
}
~CSplasher()
{
// Clear the static window pointer.
if( m_c_pSplasher )
{
delete m_c_pSplasher;
m_c_pSplasher = NULL;
}
}
启动封面自然应该位于正中间嘛,当然你要是乐意的话,可以用MoveWindow来边移动边显示,移动的原理大致如此吧:我们设置定时器间隔为100毫秒,并给出TimerProc函数的实现,这样当TimerProc接到了WM_TIMER消息时,就把当前对话框Move一点点,并重画,于是封面就动了起来。我知道有很多人在这方面很有天赋,我就点到为止吧。
下面我们也设置Timer,不过这是为了让封面只显示一段时间就自毁。
在OnInitDialog中,我们来让窗口位于屏幕中间,并设置Timer:
// 让Splash Screen处于屏幕的中间:
CenterWindow();
// 或者MoveWindow(200,200,0,0,TRUE);
SetTimer(SPLASHER_TIMER, SPLASHER_TIME_CHECK);
// SPLASHER_TIME_CHECK不要定义得太长,我觉得750挺好的
给Csplasher的Message Map中加上:
MESSAGE_HANDLER(WM_TIMER, OnTimer)
指定由OnTimer来接收。
OnTimer的实现很简单,只是把对话框关了,并Kill Timer:
// The MESSAGE_HANDLER() entry in the message map essentially tells the ATL windowing
// classes to call the OnTimer() method when a WM_TIMER message arrives.
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// 关闭Splash Screen:
EndDialog(0);
UpdateWindow();
KillTimer(SPLASHER_TIMER);
bHandled = TRUE;
return 0;
}
加入两个方法来启动对话框:
// Operations
public:
static void EnableSplashScreen(BOOL bEnable = TRUE);
static void ShowSplashScreen();
其实现为:
void CSplasher::EnableSplashScreen(BOOL bEnable /*= TRUE*/)
{
m_c_bShowSplasher = bEnable;
}
void CSplasher::ShowSplashScreen()
{
if (!m_c_bShowSplasher || m_c_pSplasher != NULL)
{
return;
}
// Allocate a new splash screen, and create the window.
m_c_pSplasher = new CSplasher;
// 启动对话框,很老土的一种显示方法,大家自由发挥吧:
if ( !m_c_pSplasher->DoModal() )
{
delete m_c_pSplasher;
}
else
{
m_c_pSplasher->UpdateWindow();
}
}
基本上这样就差不多了。
但是如果用户说我不想看你的破封面,说你是在强奸民意,我们也应该给他们一条生路:
用户点击封面窗口或者按键都可以立即杀死该窗口。
具体怎么做呢,请看下回分解。
-----to be continued------