【原创】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漏洞挖掘与利用;代码审计。