首页
社区
课程
招聘
[原创]SoftICE Internals (2) - startsi.exe
2006-8-5 20:26 6100

[原创]SoftICE Internals (2) - startsi.exe

2006-8-5 20:26
6100
【原创】SoftICE Internals (2) - 启动
        By TnTTools. Enjoy it.

    在XP下,使用者常遇到的问题有
无法启动SoftICE
按下Ctrl+D,无法调出SoftICE
进入SoftICE后,查看内存,或执行命令时忽然死机(重启)
无法设断点

    也许还有,跟贴吧!

    有用的解决方法有:
                 I.

    调用设置Setting程序
"C:\Program Files\Compuware\DriverStudio\Common\Bin\DSConfig.exe"

    在SoftICE Initialization -> Troubleshooting中选中所有项目。

                II.

    安装补丁
    重新安装
    升级至最新版的Driver Studio
   

                III.

    更新OSI数据文件

OSI - Operating System Information

ftp://ftp.compuware.com/pub/driverstudio/outgoing/OsInfo/OSINFO.DAT
ftp://ftp.compuware.com/pub/driverstudio/outgoing/OsInfo/OSINFOb.DAT

用文本编辑器打开*.dat,第二行就是文件的发布日期和时间。

                IV.

    用Symbol Retriever更新系统文件的NMS文件,如ntoskrnl.nms, hal.nms, ntdll.nms。
其中ntoskrnl.nms尤其重要。

    也许还有吧,请跟贴。

    SoftICE的启动按照系统服务的分法,可分为四个时间段:
SERVICE_BOOT_START equ 00000000h       Boot
SERVICE_SYSTEM_START equ 00000001h     System
SERVICE_AUTO_START equ 00000002h       Auto
SERVICE_DEMAND_START equ 00000003h     Manual

(   如果有人知道那个“early boot mode”和Boot有何不同,请指点一二。
多谢!)

                 who load                               who initialize
boot             NTLDR                                   I/O manager
system           I/O manager                             I/O manager
automatic        services.exe                            services.exe
manual           services.exe by user's demmand          services.exe

    其实这种启动方案只是单指NTICE服务,
在NTICE启动之前,还必需启动的服务有:
siwvid,bootcfg,nmfilter。没有它们,NTICE什么事也做不了。

    不管是I/O manager还是services.exe初始化NTICE.sys,启动不了的问题可能出现在I/O manager或是service.exe,只是它们出现的机率比较小。

    以启动softice的程序startsi.exe为例。
"C:\Program Files\Compuware\DriverStudio\SoftICE\startsi.exe"

    可以看出来,返回的错误代码可能来自于OpenSCManager(), OpenService(),StartService(),而根本与NTICE.sys无!直接!关系。

    顺便说一下net start的实现代码与StartService()类似,你可以在程序里面直接使用哦。

/*
    startsi.c by tnttools, enjoy it.
*/

/*
    it will be peacefully when you use DDK and SDK to compile it.
*/

/*
    Environment:
    ANSI, x86
*/

/*
    Command-Line
cl /I C:\misc\xpddk\inc\crt startsi.c /link  /DEFAULTLIB:user3
2.lib /DEFAULTLIB:ADVAPI32.LIB /LIBPATH:C:\misc\xpddk\lib\wxp\i386
*/

#include "windows.h"
#include "winsvc.h"

char PleaseCheckEV[]="Please check the Event Viewer for more information.";

char MsgTextFormat[] = "Error code %d\n%s\n%s";

int
StartupService(char *Service, int* pErrorCode)
{

    int retvalue = 0x0;
    SC_HANDLE hSCMDB;
        SC_HANDLE hService;
    SERVICE_STATUS ServiceStatus;
    int i;

    *pErrorCode = ERROR_SUCCESS;
   
/* open the active db on the local computer */
    hSCMDB = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);   
    if ( !hSCMDB )
    {
        *pErrorCode = GetLastError();
    }
    else                              /* success */
    {

        hService = OpenService(hSCMDB,Service,SERVICE_ALL_ACCESS);
        if ( !hService )
        {
            *pErrorCode = GetLastError();
        }
        else
        {
            if ( StartService(hService,0x0,NULL) )
            {

                 Sleep(0x3E8);

                 i = 10;
                 do
                 {
                    if ( QueryServiceStatus(hService,&ServiceStatus) )
                    {
                        if ( ServiceStatus.dwCurrentState != SERVICE_START_PENDING  )
                            break;

                        Sleep(0x3E8);
                    }
                    else
                        break;
                 }while(i);
                 
                if ( ServiceStatus.dwCurrentState == SERVICE_RUNNING  )
                    retvalue = 1;
            }
            else
            {
                *pErrorCode = GetLastError();
            }

            CloseServiceHandle(hService);
        }

        CloseServiceHandle(hSCMDB);
    }

    return retvalue;
}

int
wmain(int argc, char* argv[], char* envb[])
{

    char* pErrorMsg;
    int ErrorCode;
    int i;
    char* pMsgText;
   
    if ( StartupService("NTICE",&ErrorCode) )    /* success */
        return TRUE;
    else
    {
    /*
        if NTICE has not been started, tell us why...
    */
        if (  FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ErrorCode,LANG_SYSTEM_DEFAULT,&pErrorMsg,0x0,NULL)  )
        {
            i = strlen(PleaseCheckEV);
            i += strlen(pErrorMsg);
            i += 0x30;      /* large for avoiding overflow */

            pMsgText = malloc(i);
            wsprintf(pMsgText,MsgTextFormat,ErrorCode,pErrorMsg,PleaseCheckEV);
            MessageBox(NULL, pMsgText, "SoftICE Start Failure",MB_OK);
            free(pMsgText);
            LocalFree(pErrorMsg);
         }

        return FALSE;
    }

}

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞7
打赏
分享
最新回复 (2)
雪    币: 625
活跃值: (1047)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 1 2006-8-6 16:21
2
0
好文!!!!
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
ForEver 20 2006-8-6 22:47
3
0
学习!
游客
登录 | 注册 方可回帖
返回