DebugMan - 第8个男人 » 内核 & 漏洞 & 逆向研究 » winbootmgr.cpp
« 1 2» Pages: ( 1/2 total )
本页主题: winbootmgr.cpp 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

MJ0011

头衔:我是乖娃娃 我是乖娃娃
该用户目前在线
级别: RCT成员
精华: 29
发帖: 2189
声望: 80 点
DM币: 5636 元
贡献: 0 点
注册时间:2007-06-04
最后登录:2010-08-01

winbootmgr.cpp

本帖被 xIkUg 执行加亮操作(2008-09-23)
Copy code
// winbootmgr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "winbase.h"
#include "stdio.h"
#include <stdlib.h>


#define BOOT_MGR_TYPE 0x10100002
#define BOOT_MGR_NAME_ELEMENTS 12000004
#define BOOT_MGR_LOCAL 12000005
#define BOOT_MGR_PTR_TO_DEFULT_OS 23000003
#define BOOT_MGR_PTR_TO_DEFULT_REMUSE 23000006
#define BOOT_MGR_BOOT_OS_LIST 24000001
#define BOOT_MGR_PTR_TO_MEMTEST 24000010
#define BOOT_MGR_WAIT_TIME    25000004

#define OS_BOOTLOADER_PATH 12000002
#define OS_NAME 12000004
#define OS_LOCALE_LANGUAGE 12000005
#define OS_SYSTEM_PATH 22000002


// typedef struct BOOT_MGR{
//   
// };

void    DisplayOSNodeInfo(HKEY hkeyObjects ,
                          LPCSTR OsGUIDName)
{
    ULONG xret ;

        CHAR xxName[100];
       
        HKEY hkeyOS ;
        sprintf(xxName , "%s\\Elements\\%u" , OsGUIDName , OS_BOOTLOADER_PATH );


        xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );

        if (xret != ERROR_SUCCESS)
        {
            printf("error open Key :%s , err = %u\n" , xxName , xret);


        }
        else
        {


            ULONG Type , retlen = 100;
            CHAR OSBootLoaderPath[100];

            xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OSBootLoaderPath , &retlen );
            if (xret != ERROR_SUCCESS)
            {
                printf("error query value key , err = %u\n", xret);
            }
            else
            {
                printf("OsBootLoader Path :%s\n" , OSBootLoaderPath);

            }
            RegCloseKey(hkeyOS);
        }
        sprintf(xxName , "%s\\Elements\\%u" , OsGUIDName , OS_NAME  );
       
       
        xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error open Key :%s , err = %u\n" , xxName , xret);
           
           
        }
        else
        {
            ULONG Type , retlen = 100;
            CHAR OsName[100];
           
            xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsName , &retlen );
            if (xret != ERROR_SUCCESS)
            {
                printf("error query value key , err = %u\n", xret);
            }
            else
            {
                printf("OS Name :%s\n" , OsName);
               
            }
            RegCloseKey(hkeyOS);
        }
        sprintf(xxName , "%s\\Elements\\%u" , OsGUIDName , OS_LOCALE_LANGUAGE  );
       
       
        xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
       
        if (xret != ERROR_SUCCESS)
        {
            //printf("error open Key :%s , err = %u\n" , xxName , xret);
            printf("Locale Language : N/A\n");
           
        }
        else
        {
            ULONG Type , retlen = 100;
            CHAR OsLocale[100];
           
            xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsLocale , &retlen );
            if (xret != ERROR_SUCCESS)
            {
                printf("error query value key , err = %u\n", xret);
            }
            else
            {
                printf("Os Locale Language :%s\n" , OsLocale);
               
            }
            RegCloseKey(hkeyOS);
        }
        sprintf(xxName , "%s\\Elements\\%u" , OsGUIDName , OS_SYSTEM_PATH    );
       
       
        xret = RegOpenKey(hkeyObjects , xxName , &hkeyOS );
       
        if (xret != ERROR_SUCCESS)
        {
        //    printf("error open Key :%s , err = %u\n" , xxName , xret);
            printf("Os System Path :N/A\n");   
           
        }
        else
        {
            ULONG Type , retlen = 100;
            CHAR OsSystemPath[100];
           
            xret = RegQueryValueEx(hkeyOS , "Element" , 0 , &Type , (LPBYTE)OsSystemPath , &retlen );
            if (xret != ERROR_SUCCESS)
            {
                printf("error query value key , err = %u\n", xret);
            }
            else
            {
                printf("Os System Path :%s\n\n" , OsSystemPath);
               
            }
            RegCloseKey(hkeyOS);
        }
        return ;
}
BOOL    ConnectBootMgr()
{
    HKEY hkey ;
    ULONG xret ;

    xret = RegOpenKey(HKEY_LOCAL_MACHINE , "BCD00000000" , &hkey);

    if (xret != ERROR_SUCCESS)
    {
        printf("open bcd main key failed , err = %u\n" , xret);
        return 3 ;
    }

    ULONG Index = 0 ;
    CHAR KeyName[100] = "";
    ULONG uret = ERROR_SUCCESS ;
    BOOL    bFind = FALSE ;

    while(uret == ERROR_SUCCESS)
    {
        if (!stricmp(KeyName , "Objects"))
        {
            bFind = TRUE ;
            break ;
        }
        uret = RegEnumKey(hkey , Index , KeyName , 100) ;
        Index ++ ;
    }


    if (!bFind)
    {
        RegCloseKey(hkey);
        printf("cannot found BCDMgr->Objects!\n");
        return FALSE ;
    }
   
    HKEY hkeyObject ;
    xret = RegOpenKey(hkey , KeyName , &hkeyObject) ;
   
    if (xret != ERROR_SUCCESS)
    {
        printf("error open BCDMgr->Objects! err = %u\n" , xret);
        RegCloseKey(hkey);
        return FALSE;
    }

    Index = 0 ;
    uret = ERROR_SUCCESS ;
    bFind = FALSE ;

    RegCloseKey(hkey);

    while(uret == ERROR_SUCCESS)
    {
        uret = RegEnumKey(hkeyObject , Index , KeyName , 100) ;
        if (uret == ERROR_SUCCESS)
        {
            CHAR DescObject[100];
            HKEY hkeyDesc ;

            sprintf(DescObject , "%s\\%s" , KeyName , "Description");

            xret = RegOpenKey(hkeyObject , DescObject , &hkeyDesc)  ;
            if ( xret != ERROR_SUCCESS)
            {
                printf("error open Object Description , err = %u\n" , xret);
                RegCloseKey(hkeyObject);
                RegCloseKey(hkey);
                return FALSE ;

            }

            ULONG value ,type ,retlen = sizeof(ULONG);

            xret = RegQueryValueEx(hkeyDesc , "Type" , 0 , &type ,  (LPBYTE)&value , &retlen) ;

            if (xret  !=ERROR_SUCCESS)
            {
                printf("error query object description type err = %u\n" , xret);
                RegCloseKey(hkeyDesc);
                RegCloseKey(hkeyObject);
                RegCloseKey(hkey);
                return FALSE ;
            }

            if (value == BOOT_MGR_TYPE)
            {
                printf("BootMgr Object GUID = %s\n\n" , KeyName);
                bFind = TRUE ;
                           
                break ;

            }
            else
            {
                RegCloseKey(hkeyDesc);

            }
        }

        Index ++ ;
    }


    CHAR ElementName[100];
    HKEY htemp ;

    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_NAME_ELEMENTS);

    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_NAME_ELEMENTS Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        CHAR BootMgrName[100];
        ULONG size = 100 , Type ;

        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)BootMgrName , &size) ;

        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_NAME_ELEMENTS  err= %u\n" , xret);
        }
        else
        {
            printf("BootMgr Name : %s\n\n" , BootMgrName);
        }
        RegCloseKey(htemp);

    }


    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_LOCAL);
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_LOCAL Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        CHAR Local[100];
        ULONG size = 100 , Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)Local , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_LOCAL  err= %u\n" , xret);
        }
        else
        {
            printf("Locale Language : %s\n\n" , Local);
        }
        RegCloseKey(htemp);
       
    }   

    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_PTR_TO_DEFULT_OS );
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_PTR_TO_DEFULT_OS  Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        CHAR DefaultOS[100];
        ULONG size = 100 , Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)DefaultOS , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_PTR_TO_DEFULT_OS  err= %u\n" , xret);
        }
        else
        {
            printf("DefaultOS GUID : %s\n\n" , DefaultOS);
        }
        RegCloseKey(htemp);
       
    }
    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_PTR_TO_DEFULT_REMUSE );
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_PTR_TO_DEFULT_REMUSE  Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        CHAR DefaultResume[100];
        ULONG size = 100 , Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)DefaultResume , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_PTR_TO_DEFULT_REMUSE  err= %u\n" , xret);
        }
        else
        {
            printf("Default Resume GUID : %s\n\n" , DefaultResume);
            DisplayOSNodeInfo(hkeyObject , DefaultResume);
        }
        RegCloseKey(htemp);
       
    }

    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_BOOT_OS_LIST  );
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_BOOT_OS_LIST  Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        BYTE OSList[1000];
        PBYTE lpOsList = OSList ;
        ULONG size = 1000 , Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)OSList , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_BOOT_OS_LIST    err= %u\n" , xret);
        }
        else
        {
            LPCSTR OsGUIDName  = (LPCSTR)lpOsList ;
            ULONG OsIndex = 0 ;
            printf("SystemOS List:\n\n");

            while((ULONG)OsGUIDName+1 < (ULONG)lpOsList + size)
            {
                printf("OS[%u] : GUID = %s\n\n", OsIndex , OsGUIDName);

                DisplayOSNodeInfo(hkeyObject , OsGUIDName )    ;
                OsGUIDName = (LPCSTR)((ULONG)OsGUIDName + strlen(OsGUIDName) + 1 );
                OsIndex ++ ;
            }
           
        }
        RegCloseKey(htemp);
       
    }

    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_PTR_TO_MEMTEST  );
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_PTR_TO_MEMTEST  Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        CHAR MemTest[100];
        ULONG size = 100 , Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)MemTest , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_PTR_TO_MEMTEST    err= %u\n" , xret);
        }
        else
        {
            printf("BootMemTest GUID : %s\n\n" , MemTest);
            DisplayOSNodeInfo(hkeyObject , MemTest);
        }
        RegCloseKey(htemp);
       
    }
    sprintf(ElementName , "%s\\Elements\\%u" , KeyName , BOOT_MGR_WAIT_TIME  );
   
    xret = RegOpenKey(hkeyObject , ElementName , &htemp );
    if (xret != ERROR_SUCCESS)
    {
        printf("error open Elements:BOOT_MGR_WAIT_TIME  Key :%s , err = %u\n" , ElementName , xret);
    }
    else
    {
        LARGE_INTEGER WaitTime;
        ULONG size = 8, Type ;
       
        xret= RegQueryValueEx(htemp , "Element" , 0 , &Type ,(LPBYTE)&WaitTime , &size) ;
       
        if (xret != ERROR_SUCCESS)
        {
            printf("error query element value of BOOT_MGR_WAIT_TIME    err= %u\n" , xret);
        }
        else
        {
            printf("Boot Menu Wait Time : %I64u second(s)\n\n" , WaitTime.QuadPart);
        }
        RegCloseKey(htemp);
       
    }

    RegCloseKey(hkeyObject);
    RegCloseKey(hkey);

//    strcpy(BootName ,KeyName);

    return TRUE ;







}


int main(int argc, char* argv[])
{

    HKEY hkey ;

    if (RegOpenKey(HKEY_LOCAL_MACHINE,"BCD00000000" , &hkey) != ERROR_SUCCESS)
    {
        MessageBox(GetDesktopWindow() , "Need admin privilege!" , "Error" , MB_OK|MB_ICONWARNING);
        return 0;

    }
    RegCloseKey(hkey);

    printf("Windows Vista BootMgr Demo\n"
        "By MJ0011 2008-7-15\n"
        "\n1.Display BootMgr config\n\n");

    ULONG id = 0 ;

    fflush(stdin);
    scanf("%u" , &id);


    if (id == 1 )
    {
        ConnectBootMgr();
        system("pause");
    }

    return 0 ;

}






[ 此贴被MJ0011在2008-09-23 17:54重新编辑 ]
本帖最近评分记录:
  • 声望:+1(diyhack) 原创内容
  • 我是乖娃娃
    顶端 Posted: 2008-09-23 17:38 | [楼 主]
    MJ0011

    头衔:我是乖娃娃 我是乖娃娃
    该用户目前在线
    级别: RCT成员
    精华: 29
    发帖: 2189
    声望: 80 点
    DM币: 5636 元
    贡献: 0 点
    注册时间:2007-06-04
    最后登录:2010-08-01

    用之前先要把BCD挂上去
    我是乖娃娃
    顶端 Posted: 2008-09-23 17:39 | 1 楼
    xIkUg

    头衔:护花后护法 护花后护法
    该用户目前在线
    级别: 管理员
    精华: 8
    发帖: 2590
    声望: 75 点
    DM币: 131811 元
    贡献: 0 点
    注册时间:2006-04-01
    最后登录:2010-08-01

    学习。。。
    为人民服务
    顶端 Posted: 2008-09-23 17:52 | 2 楼
    diyhack

    头衔:管理员 管理员
    该用户目前不在线
    级别: 核心会员
    精华: 6
    发帖: 674
    声望: 33 点
    DM币: 2147433707 元
    贡献: 0 点
    注册时间:2007-05-06
    最后登录:2010-08-01

    学习。。。
    顶端 Posted: 2008-09-23 18:06 | 3 楼
    boyaka



    该用户目前不在线
    级别: RCT成员
    精华: 2
    发帖: 40
    声望: 5 点
    DM币: 47483649 元
    贡献: 0 点
    注册时间:2008-01-10
    最后登录:2010-06-25

    学习
    顶端 Posted: 2008-09-23 18:13 | 4 楼
    xss517



    该用户目前不在线
    级别: 初级会员
    精华: 0
    发帖: 23
    声望: 0 点
    DM币: 71 元
    贡献: 0 点
    注册时间:2008-02-22
    最后登录:2010-06-05

    若若的问一声,这个东西有什么用??
    顶端 Posted: 2008-09-23 18:47 | 5 楼
    ayarei

    该用户目前不在线
    级别: 核心会员
    精华: 2
    发帖: 151
    声望: 4 点
    DM币: 486986 元
    贡献: 0 点
    注册时间:2008-01-06
    最后登录:2010-06-24

    学习
    SoftRCE.net - Software Reverse Code Engineering
    顶端 Posted: 2008-09-23 18:51 | 6 楼
    dayed

    该用户目前不在线
    级别: 普通会员
    精华: 1
    发帖: 199
    声望: 8 点
    DM币: 2147482604 元
    贡献: 0 点
    注册时间:2008-05-23
    最后登录:2010-07-29

    学习
    --Damit
    顶端 Posted: 2008-09-23 20:31 | 7 楼
    KiSSinGGer

    头衔:被国家领导人 被国家领导人
    该用户目前不在线
    级别: VIP会员
    精华: 2
    发帖: 73
    声望: 21 点
    DM币: 0 元
    贡献: 0 点
    注册时间:2007-08-05
    最后登录:2010-07-31

    牛逼有三,有码为大......
    少壮不努力,老大Ctrl-C
    顶端 Posted: 2008-09-23 23:30 | 8 楼
    Aleaxander



    该用户目前不在线
    级别: 初级会员
    精华: 0
    发帖: 6
    声望: 0 点
    DM币: 18 元
    贡献: 0 点
    注册时间:2008-09-08
    最后登录:2009-02-16

    顶起!
    顶端 Posted: 2008-10-21 00:43 | 9 楼
    « 1 2» Pages: ( 1/2 total )
    DebugMan - 第8个男人 » 内核 & 漏洞 & 逆向研究