我想请教如何写自动定时开机程序,声明本人BIOs设置里面没有这一项,我主要是想了解一下CIH病毒的原理,以及有没可能用VB实现!写bios恐怕中国没几人吧。

解决方案 »

  1.   

    VB里嵌入机器码,去写BIOS应该是可以的,但没有测试过。N久前我用GWBASIC在dos下写过286的BIOS
    N久以前我用QB4.5在dos下写486的BIOS转到widnows后没有写过BIOSVB应该写不出CIH一样的病毒,因为它是用汇编写的大小1K左右。
    CIH擦除CMOS是有前提条件的,那就是这CMOS是电可擦写的。VB写底层的东西不是好工具,楼主想玩底层的东西去学汇编、C,VC...
      

  2.   

    你的需求用VB本身完成实在是使错劲了,无外乎是一个Core Driver + 接口dll然后VB调用的问题。换句话说,VB只管界面上的事。
      

  3.   

    (1)cih病毒没有bios的功能,它只是用垃圾数据填充eeprom,破坏bios,之所以能写入eeprom,是因为利用win9x vxd的一个漏洞,将自身提升到特权指令权限。
    (2)bios经过多年的发展,生存下来的只有award ami等几个,一般都是主板厂家拿到award ami的源代码和开发包,结合主板功能做二次开发。
    现在的bios也是很模块化的,个人往bios里面集成一个驱动,或者导入一个开机画面也不是难事。
    (3)如果你想学bios开发,必须对主板自身有研究,而且显然你要有一台rom编程器,一个交叉调试平台(用另一台电脑调试开发主板),你应该懂汇编……这些和VB没有关系。
    个人觉得和修改bios花费的硬件投入还有人工成本比,你直接买一个支持自动开机的主板就很好。大部分主板都是支持的。
      

  4.   


    www.pediy.com
      

  5.   

    见过vb翻译汇编指令到机器码,vb写bios可能用得着。
      

  6.   

    http://www.codeproject.com/KB/IP/WOL-wakeonlanoverinternet.aspx
      

  7.   

    读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;}
      

  8.   

    17楼代码我转来的原作者不详原工程文件名为biossave特意声明下
      

  9.   


    你的这段代码在2k3以后无效,估计在xp sp3下也无效
    这些系统增加了安全性,不允许以物理内存的方式进行引用了。
      

  10.   


    恩恩恩。想想貌似也对。NtDebugControl一类的Native API在SP3下都不好使了
      

  11.   

    读BIOS用你们这么费劲吗?!
    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