获得eprocess结构中的进程名偏移
void GetProcessNameOffset()
{
PEPROCESS curproc;
int i;
curproc = PsGetCurrentProcess();
for( i = 0; i < 3*PAGE_SIZE; i++ )
{
if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
{
FileNameoff = i;
}
}
}
//在一段内存缓冲中查找指定字符串的位置,从头开始查找,区分大小写。
char * memstr(const char * strDest, const char * strSrc ,int lenDest,int lenSrc)
{
if ((NULL == strDest) || (NULL == strSrc) || (lenDest <= 0) || (lenSrc <= 0) )
return NULL;
long ls1 = lenDest;
long ls2 = lenSrc;
char *cp = (char *) strDest;
char *s1, *s2;
if ( !*strSrc )
return((char *)strDest);
while (ls1 > 0)
{
s1 = cp;
s2 = (char *) strSrc;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++,ls2--;
if (ls2 <= 0)
return(cp);
cp++;
ls1--;
}
return NULL;
}
//在一段内存中删除字符串,把删除后的字符串返回给strDest
BOOL memdel( char * strDest, char * strSrc ,int lenDest,int lenSrc)
{
if ((NULL == strDest) || (NULL == strSrc) || (lenDest <= 0) || (lenSrc <= 0))
return FALSE;
if ( !*strSrc ) //如果str2指向的是空,直接返回
return FALSE;
long ls1 = lenDest;
long ls2 = lenSrc;
char *cp = (char *) strDest;
char *s1,*s2;
while(lenDest > 0)
{
s1 = cp;
s2 = (char *) strSrc;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++,ls2--;
if (ls2 <= 0) //找到了
{
char * tmp = (char *)malloc(lenDest);
if(tmp != NULL)
{
//删除操作,很简单
memset(tmp,0,lenDest);
memcpy(tmp,strDest,cp-strDest);
memcpy(tmp+(cp-strDest),cp+(lenSrc+1),(strDest+lenDest-1)-(cp+lenSrc));
memset(strDest,0,lenDest);
memcpy(strDest,tmp,lenDest-lenSrc-1);
free(tmp);
return TRUE;
}
else
{
return FALSE;
}
}
cp++;
ls1--;
}
return FALSE;
}
驱动加载顺序
在系统初始化的时候,决定驱动程序在什么时候被载入的信息保存在注册表中。
最早的一批驱动是由ntldr载入内存的(仅仅是载入)
第二批是由IO管理器载入内存的
第三批是由 SCM(Service Control Manager) 载入的
一个驱动在第几批中被载入是由 HKLM\SYSTEM\CurrentControlSet \Services\驱动名\Start 的值来决定。该值为0,第一批被载入。该值为1,第二批被载入。该值为2,第三批被载入。对于同一批驱动中的驱动,按驱动所在组的先后载入。组的先后顺序由 HKLM\SYSTEM\CurrentControlSet\Control \ServiceGroupOrderList 决定。每个驱动的 HKLM\SYSTEM\CurrentControlSet\Services\驱动名\Group 决定了驱动所属的组,如果没有这个 Services驱动名Group ,那么就在所有组之后。对于同一个组中的驱动,按驱动的Tag 的先后载入。Tag的先后顺序由 HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList组名 决定。每个驱动的 HKLM\SYSTEMCurrent\ControlSet\Services\驱动名\Tag 决定了驱动在组中的Tag。 这个Tag值的大小由驱动安装的先后顺序决定,先安装的Tag值小,后安装的Tag值大。
二.驱动调试
下面我介绍下关于驱动的调试,这里以windbg为例:
1.配置windbg双机调试环境,(VMware Workstation)
(1) 创建windbg快捷方式在目标中加上-k com:port=\\.\pipe\com_1,baud=115200,pipe 例如:"E:\Program Files\Debugging Tools for Windows\windbg.exe" -k com:port=\\.\pipe\com_1,baud=115200,pipe
(2) 在虚拟机设置里添加一个串行端口(如图),点击下一步;
(3)点击输出到命名管道:
在高级选中,中轮询时主动放弃CPU占用.然后完成。
(4) 在虚拟机中系统的启动项中添加一个启动项:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug /debugport=com1 /baudrate=115200
(5)我们设置windbg的Symbol path:我的设置如下
C:\MyCodesSymbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols;C:\MyLocalSymbols
这里我把自己的.pdb文件放到C:\MyCodesSymbols下,从微软的符号文件服务器上下载符号文件到C:\MyLocalSymbols中。