BIOS级的VB,高手进哟 我想请教如何写自动定时开机程序,声明本人BIOs设置里面没有这一项,我主要是想了解一下CIH病毒的原理,以及有没可能用VB实现!写bios恐怕中国没几人吧。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VB里嵌入机器码,去写BIOS应该是可以的,但没有测试过。N久前我用GWBASIC在dos下写过286的BIOSN久以前我用QB4.5在dos下写486的BIOS转到widnows后没有写过BIOSVB应该写不出CIH一样的病毒,因为它是用汇编写的大小1K左右。CIH擦除CMOS是有前提条件的,那就是这CMOS是电可擦写的。VB写底层的东西不是好工具,楼主想玩底层的东西去学汇编、C,VC... 你的需求用VB本身完成实在是使错劲了,无外乎是一个Core Driver + 接口dll然后VB调用的问题。换句话说,VB只管界面上的事。 (1)cih病毒没有bios的功能,它只是用垃圾数据填充eeprom,破坏bios,之所以能写入eeprom,是因为利用win9x vxd的一个漏洞,将自身提升到特权指令权限。(2)bios经过多年的发展,生存下来的只有award ami等几个,一般都是主板厂家拿到award ami的源代码和开发包,结合主板功能做二次开发。现在的bios也是很模块化的,个人往bios里面集成一个驱动,或者导入一个开机画面也不是难事。(3)如果你想学bios开发,必须对主板自身有研究,而且显然你要有一台rom编程器,一个交叉调试平台(用另一台电脑调试开发主板),你应该懂汇编……这些和VB没有关系。个人觉得和修改bios花费的硬件投入还有人工成本比,你直接买一个支持自动开机的主板就很好。大部分主板都是支持的。 www.pediy.com 见过vb翻译汇编指令到机器码,vb写bios可能用得着。 http://www.codeproject.com/KB/IP/WOL-wakeonlanoverinternet.aspx 读BIOS的C代码,直接在Ring3下读!!!// biossave.cpp : 定义应用程序的入口点。//#define MAX_LOADSTRING 100typedef struct _UNICODE_STRING { USHORT Length;//长度 USHORT MaximumLength;//最大长度 PWSTR Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串"\device\physicalmemory"} UNICODE_STRING,*PUNICODE_STRING;typedef struct _OBJECT_ATTRIBUTES { ULONG Length;//长度 18h HANDLE RootDirectory;// 00000000 PUNICODE_STRING ObjectName;//指向对象名的指针 ULONG Attributes;//对象属性00000040h PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0 PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0} OBJECT_ATTRIBUTES;typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);// 全局变量:HINSTANCE hInst; // 当前实例TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名// 此代码模块中包含的函数的前向声明:int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ // TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable; UNICODE_STRING struniph; OBJECT_ATTRIBUTES obj_ar; ZWOS ZWopenS; ZWMV ZWmapV; ZWUMV ZWunmapV; HANDLE hSection; HMODULE hinstLib; DWORD ba; LARGE_INTEGER so; SIZE_T ssize; so.LowPart=0x000f0000;//物理内存的基址,就是f000:0000 so.HighPart=0x00000000; ssize=0xffff; wchar_t strPH[30]=L"\\device\\physicalmemory"; FILE *f1; // 初始化全局字符串 //变量初始化 ba=0;//联系后的基址将在这里返回 struniph.Buffer=strPH; struniph.Length=0x2c;//注意大小是按字节算 struniph.MaximumLength =0x2e;//也是字节 obj_ar.Attributes =64;//属性 obj_ar.Length =24;//OBJECT_ATTRIBUTES类型的长度 obj_ar.ObjectName=&struniph;//指向对象的指针 obj_ar.RootDirectory=0; obj_ar.SecurityDescriptor=0; obj_ar.SecurityQualityOfService =0;//读入ntdll.dll,得到函数地址 hinstLib = LoadLibrary("ntdll.dll"); ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection"); ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection"); ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");//调用函数,对物理内存进行映射 ZWopenS(&hSection,4,&obj_ar); ZWmapV((HANDLE)hSection,(HANDLE)0xffffffff,&ba,0,0xffff,&so,&ssize,1,0,2); f1=fopen("bios.mem","wb+"); fwrite((void*)ba,65536,1,f1); fclose(f1); MessageBox(NULL,"Bios saved to bios.mem!","Save OK",MB_OK); return 0;} 17楼代码我转来的原作者不详原工程文件名为biossave特意声明下 你的这段代码在2k3以后无效,估计在xp sp3下也无效这些系统增加了安全性,不允许以物理内存的方式进行引用了。 恩恩恩。想想貌似也对。NtDebugControl一类的Native API在SP3下都不好使了 读BIOS用你们这么费劲吗?!c:\>debug-n bios.mem-r bx1-r cx0-w f000:0-qc:\>dir bios.mem2010-06-09 11:33 65,536 BIOS.MEM flyingscv(zlj) 请进来接分..... 如何判断鼠标不动的时间?!!!! 怎么解决OFFICE版本不同而导致数据库导出EXCEL出现的错误? 问数组中含有重复字符串算法。 VOD多媒体视频点播系统 紧急求助!!! 怎么去掉MDIForm中的maxbutton? 数据库存取文件???!!! MDB最多能有多少条记录,文件最大能多大 每 天 加 5 分!!!VB+ADO+ACCESS的问题! 急,请高人指点(特殊号码筛选) VB调用C++标准dll
N久以前我用QB4.5在dos下写486的BIOS转到widnows后没有写过BIOSVB应该写不出CIH一样的病毒,因为它是用汇编写的大小1K左右。
CIH擦除CMOS是有前提条件的,那就是这CMOS是电可擦写的。VB写底层的东西不是好工具,楼主想玩底层的东西去学汇编、C,VC...
(2)bios经过多年的发展,生存下来的只有award ami等几个,一般都是主板厂家拿到award ami的源代码和开发包,结合主板功能做二次开发。
现在的bios也是很模块化的,个人往bios里面集成一个驱动,或者导入一个开机画面也不是难事。
(3)如果你想学bios开发,必须对主板自身有研究,而且显然你要有一台rom编程器,一个交叉调试平台(用另一台电脑调试开发主板),你应该懂汇编……这些和VB没有关系。
个人觉得和修改bios花费的硬件投入还有人工成本比,你直接买一个支持自动开机的主板就很好。大部分主板都是支持的。
www.pediy.com
//
#define MAX_LOADSTRING 100typedef struct _UNICODE_STRING {
USHORT Length;//长度
USHORT MaximumLength;//最大长度
PWSTR Buffer;//缓存指针,访问物理内存时,此处指向UNICODE字符串"\device\physicalmemory"
} UNICODE_STRING,*PUNICODE_STRING;
typedef struct _OBJECT_ATTRIBUTES {
ULONG Length;//长度 18h
HANDLE RootDirectory;// 00000000
PUNICODE_STRING ObjectName;//指向对象名的指针
ULONG Attributes;//对象属性00000040h
PVOID SecurityDescriptor; // Points to type SECURITY_DESCRIPTOR,0
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE,0
} OBJECT_ATTRIBUTES;
typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES;typedef DWORD (__stdcall *ZWOS)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES);
typedef DWORD (__stdcall *ZWMV)(HANDLE,HANDLE,PVOID,ULONG,ULONG,PLARGE_INTEGER,PSIZE_T,DWORD,ULONG,ULONG);
typedef DWORD (__stdcall *ZWUMV)(HANDLE,PVOID);
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
// 此代码模块中包含的函数的前向声明:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
UNICODE_STRING struniph;
OBJECT_ATTRIBUTES obj_ar;
ZWOS ZWopenS;
ZWMV ZWmapV;
ZWUMV ZWunmapV;
HANDLE hSection;
HMODULE hinstLib;
DWORD ba;
LARGE_INTEGER so;
SIZE_T ssize;
so.LowPart=0x000f0000;//物理内存的基址,就是f000:0000
so.HighPart=0x00000000;
ssize=0xffff;
wchar_t strPH[30]=L"\\device\\physicalmemory";
FILE *f1; // 初始化全局字符串
//变量初始化
ba=0;//联系后的基址将在这里返回
struniph.Buffer=strPH;
struniph.Length=0x2c;//注意大小是按字节算
struniph.MaximumLength =0x2e;//也是字节
obj_ar.Attributes =64;//属性
obj_ar.Length =24;//OBJECT_ATTRIBUTES类型的长度
obj_ar.ObjectName=&struniph;//指向对象的指针
obj_ar.RootDirectory=0;
obj_ar.SecurityDescriptor=0;
obj_ar.SecurityQualityOfService =0;
//读入ntdll.dll,得到函数地址
hinstLib = LoadLibrary("ntdll.dll");
ZWopenS=(ZWOS)GetProcAddress(hinstLib,"ZwOpenSection");
ZWmapV=(ZWMV)GetProcAddress(hinstLib,"ZwMapViewOfSection");
ZWunmapV=(ZWUMV)GetProcAddress(hinstLib,"ZwUnmapViewOfSection");
//调用函数,对物理内存进行映射
ZWopenS(&hSection,4,&obj_ar);
ZWmapV((HANDLE)hSection,(HANDLE)0xffffffff,&ba,0,0xffff,&so,&ssize,1,0,2);
f1=fopen("bios.mem","wb+");
fwrite((void*)ba,65536,1,f1);
fclose(f1);
MessageBox(NULL,"Bios saved to bios.mem!","Save OK",MB_OK);
return 0;}
你的这段代码在2k3以后无效,估计在xp sp3下也无效
这些系统增加了安全性,不允许以物理内存的方式进行引用了。
恩恩恩。想想貌似也对。NtDebugControl一类的Native API在SP3下都不好使了
c:\>debug
-n bios.mem
-r bx
1
-r cx
0
-w f000:0
-q
c:\>dir bios.mem
2010-06-09 11:33 65,536 BIOS.MEM