能力值:
( LV2,RANK:10 )
|
-
-
2 楼
没调用的函数?应该不会啊?你试试在非调试模式安装运行下驱动。
|
能力值:
( LV5,RANK:60 )
|
-
-
3 楼
我在非调试状态和调试状态都不行,所以说太莫名其妙了
|
能力值:
( LV9,RANK:260 )
|
-
-
4 楼
你的意思是说在IoCtrl的派遣历程里调用了某一个你自己定义的函数,驱动就无法加载了?
果然莫名其妙……方便的话放出部分相关代码吧。
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
哪部分的代码?是自定义函数的还是DeviceIoControl的处理代码?
|
能力值:
( LV9,RANK:260 )
|
-
-
6 楼
CTL的定义
DriverEntry中设置DeviceIoControl函数的代码
DeviceIoControl函数中调用自定义函数的地方附近的代码
|
能力值:
( LV5,RANK:60 )
|
-
-
7 楼
代码:
case MY_PROTECTPROCESS_CODE:
{
g_ProcessId = *(ULONG*)in_buffer;
UNICODE_STRING ServiceName_OpenProcess = RTL_CONSTANT_STRING(L"ZwOpenProcess");
LONG ServiceId_OpenProcess = GetServiceId(&ServiceName_OpenProcess);
if(ServiceId_OpenProcess < 0)
{
ntStatus = -1;
break;
}
MySSDTHook(ServiceId_OpenProcess, (ULONG)KrNtOpenProcess, TRUE);
MyHideProcess(*(ULONG*)in_buffer);
ULONG OrgAdress = GetPspTerminateThreadByPointer();
InlineHook(OrgAdress, (ULONG)KrPspTerminateThreadByPointer, 0); //就是这句代码有问题
Irp->IoStatus.Information = 0;
ntStatus = STATUS_SUCCESS;
break;
}
我将MySSDTHook(ServiceId_OpenProcess, (ULONG)KrNtOpenProcess, TRUE);
这句没问题的代码第2个参数改成(ULONG)KrPspTerminateThreadByPointer后也是无法启动,我将InlineHook(OrgAdress, (ULONG)KrPspTerminateThreadByPointer, 0);第2个参数改成(ULONG)KrNtOpenProcess也无法启动,所以都不知道到底是InlineHook函数的问题还是KrTerminateThreadByPointer的问题,但是就算有问题应该也能启动吧??
然后InlineHook的代码:
void NTAPI InlineHook(ULONG OrgAddress, ULONG NewAddress, ULONG HookOffset) //HookOffset是Hook点距离函数头的偏移
{
KIRQL irql;
KeAcquireSpinLock(&g_MyHookListLock, &irql);
if(!g_pInlineHookList)
{
g_pInlineHookList = (PINLINE_HOOK_LIST)::ExAllocatePool(PagedPool, sizeof(INLINE_HOOK_LIST));
::RtlZeroMemory((PVOID)g_pInlineHookList, sizeof(INLINE_HOOK_LIST));
g_pInlineHookList->next = g_pInlineHookList;
}
PINLINE_HOOK_LIST pHookInfo = (PINLINE_HOOK_LIST)::ExAllocatePool(PagedPool, sizeof(INLINE_HOOK_LIST));
::RtlCopyMemory((PVOID)pHookInfo->OrgCode, (PVOID)(OrgAddress + HookOffset), CODE_LENGTH);
pHookInfo->OrgAddress = OrgAddress;
pHookInfo->NewAddress = NewAddress;
pHookInfo->InlineOffset = HookOffset;
//链表为空,即头节点指向自己
if(g_pInlineHookList->next == g_pInlineHookList)
{
pHookInfo->next = NULL;
}
else
{
pHookInfo->next = g_pInlineHookList->next;
}
g_pInlineHookList->next = pHookInfo;
UCHAR bJmpCode[CODE_LENGTH]={ 0xE9, 0, 0, 0, 0 };
PULONG pJmpArg = (PULONG)(bJmpCode+1);
ULONG dwCurrentEIP = ULONG(OrgAddress) + 5;
*pJmpArg = (ULONG)NewAddress - dwCurrentEIP;
__asm
{//去掉内存保护
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
::RtlCopyMemory((PVOID)(OrgAddress + HookOffset), bJmpCode, CODE_LENGTH);
__asm
{ //恢复内存保护
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
KeReleaseSpinLock(&g_MyHookListLock, irql);
}
而且就算我把该函数体全部注释掉也没用,也是启动失败,而且只要那个调用存在,生成的sys会大1k左右
出了这样的问题实在很无奈。。。。。
|
能力值:
( LV9,RANK:260 )
|
-
-
8 楼
我也无奈了……等待楼下高人吧……
加载失败的错误代码是什么?
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
我用的InsDrv,没有错误代码提示,就是启动失败。。。不过还是要谢谢你
|
能力值:
( LV9,RANK:610 )
|
-
-
10 楼
对ZwLoadDriver下断,看看返回值是什么
|
能力值:
( LV9,RANK:610 )
|
-
-
11 楼
再看看你编译好的驱动的导入表导入了哪几个文件
|
能力值:
( LV5,RANK:60 )
|
-
-
12 楼
我下的ntdll的断,eax为c000007a,不知道这个返回值是什么意思,也没这个函数的解释
|
能力值:
( LV12,RANK:420 )
|
-
-
13 楼
很明显是你的驱动写的有问题
C000007A:STATUS_PROCEDURE_NOT_FOUND
LINK了一些不该LINK的DLL就会这样
发驱动文件上来吧
|
能力值:
( LV5,RANK:60 )
|
-
-
14 楼
原来还有这样的错误啊。。。汗,初学驱动不懂这些,已经上传了,谢谢各位啊,帮忙分析下
|
能力值:
( LV12,RANK:420 )
|
-
-
15 楼
一看即知,问题是你LINK了KERNEL32.dll
|
能力值:
( LV12,RANK:420 )
|
-
-
16 楼
引入KERNEL32.dll的原因是由于在gs cookie处理时用了这个函数
具体原因可能是你使用::RtlCopyMemory的缘故~可以试试RtlCopyMemory
|
能力值:
( LV9,RANK:260 )
|
-
-
17 楼
MJ果然强大……
|
能力值:
( LV9,RANK:260 )
|
-
-
18 楼
帮MJ补充,调用了这5个不该调用的函数:
TerminateProcess,GetCurrentProcess,UnhandledExceptionFilter,SetUnhandledExceptionFilter,IsDebuggerPresent
|
能力值:
( LV5,RANK:60 )
|
-
-
19 楼
谢谢大哥,但是我驱动中没用到导入表里的几个函数啊。。。怎么会导入的
|
能力值:
( LV5,RANK:60 )
|
-
-
20 楼
改了,发现kernel32还是被引入了,不知道咋的
|
能力值:
( LV5,RANK:60 )
|
-
-
21 楼
最后没有办法,只能关了“缓冲区安全检查”,但是不知道这样好不好
|
能力值:
( LV5,RANK:60 )
|
-
-
22 楼
再次谢谢各位大大的关注
|
能力值:
( LV12,RANK:420 )
|
-
-
23 楼
用ddk build应该就没这个问题了,不知道你是用什么东西来编译的,不过看来不好使~
|
能力值:
( LV9,RANK:610 )
|
-
-
24 楼
看到你用C++写驱动我就怀疑你的link了不改link的东西,所以让你检查导入表,果然如我所料~~看来主要还是编译环境的问题
|
能力值:
( LV5,RANK:60 )
|
-
-
25 楼
额,我用的VS2005编译链接的,不过改了很多东西啊,但是不知道 缓冲区安全检查 要关闭。。。谢谢MJ了
|
|
|