-
-
[求助]重载win7内核出现问题
-
发表于:
2013-8-6 01:30
10640
-
现在的大多资料都是以XP SP2为基础,但我却用win7sp1来做实践。
加载PE镜像就不多说了,重定位暂且全都搞到原内核吧。
偶尔会蓝屏,发现好像是Safe SEH在作怪,虽然XP SP2就已支持,但未使用。
这会导致POOL代码在产生异常时即使有SEH也不会捕获异常,从而蓝屏。
从WRR得知,LDR的结构应该是:
typedef struct _KLDR_DATA_TABLE_ENTRY
{
LIST_ENTRY InLoadOrderLinks;
PVOID ExceptionTable;
ULONG ExceptionTableSize;
PVOID GpValue;
PNON_PAGED_DEBUG_INFO NonPagedDebugInfo;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT __Unused5;
PVOID SectionPointer;
ULONG CheckSum;
PVOID LoadedImports;
PVOID PatchInformation;
}LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
内核异常产生时RtlIsValidHander中检查PsLoadedModuleList,检查EIP属于哪一个模块,再从ExceptionTable里找当前的Exception Hander是否吻合,找不到即不执行此Hander。
好吧,自己添加一个LDR到PsLoadedModuleList,这里算是解决了一个问题。
至此,R0下算是稳定一些了,目前我还没发现蓝屏迹象,但R3程序就不稳定了。
驱动执行后,遨游3浏览器运行即崩溃,代码0xC0000005即内存访问异常,估计是R3下的SEH没有得到正确的处理
忽然想起A盾,打开后执行内核安全模式,遨游3正常,兴冲冲的跑去问V大,答曰:“自己撸”,又答曰:“据说是因为重定位有问题导致的”
拜托,来点有意义的提示啊!看A盾的代码没发现什么特别之处,重定位也是全部搞到原模块。
开着A盾有点事离开一会,回来后发现QQ崩了,莫非A盾在win7的内核重载上也有问题?
还是自己研究研究吧,既然是R3的内存访问异常,那么CPU首先干什么呢?查资料,应该是走系统中断表,索引0x0D,即General Protection(原先以为是PageFault,但看WRK没发现哪里有异常分发),这里就不走KiFastCallEntry了,所以我也没法执行重定向到新内核
不过这不碍事,继续看WRK,一堆参数检查,内存检查,如果是R3出错则转移到用户空间的ntdll!KiUserExceptionDispatcher去执行,此时为FirstChance,因为R3上有SEH,KiUserExceptionDispatcher也获取到了Hander,执行之,返回1,即EXCEPTION_EXECUTE_HANDLER,奇怪的是没有执行ZwContinue,又去找SEH,结果在异常处理中又异常了,无解,程序退出。
在这里我想知道,R0下做到我这样够不够,还是在内核中有东西我没有处理?按道理说R0和R3的辑是代码逻分离的,那么我把内核换了(IDT没换)会不会影响R3的什么东西?再说了,R3内存异常后CPU去找IDT,又没调用sysenter,还是执行的原内核代码,为什么会导致程序崩溃?!
各位小菜、大菜、小鸟、大鸟、小牛、大牛、大犇,知道的帮忙解答一下吧,稍微给点提示也行。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课