Closed BaiFeng666 closed 4 months ago
ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY
当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏
看你用什么映射了,如果用的是 KdMapper,由于驱动的 DriverEntry 中使用了传入的两个参数,而 KdMapper 执行驱动入口函数时并没有传入有效的参数,导致指针无效而蓝屏。解决方法可以参考我的文章https://blog.csdn.net/zhuting__xf/article/details/132673437 。 但实际这样修改了仍然不会成功,虽然不会蓝屏,但在驱动用调用 NtTraceControl 会因权限问题导致失败。 如果用的是 KDU,具体操作我这边无法复现。建议直接用证书签名驱动后正常加载,这样就不会出现问题了。
当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏
看你用什么映射了,如果用的是 KdMapper,由于驱动的 DriverEntry 中使用了传入的两个参数,而 KdMapper 执行驱动入口函数时并没有传入有效的参数,导致指针无效而蓝屏。解决方法可以参考我的文章https://blog.csdn.net/zhuting__xf/article/details/132673437 。 但实际这样修改了仍然不会成功,虽然不会蓝屏,但在驱动用调用 NtTraceControl 会因权限问题导致失败。 如果用的是 KDU,具体操作我这边无法复现。建议直接用证书签名驱动后正常加载,这样就不会出现问题了。
我在映射前恰巧看了您的这篇文章,都正确设置了,仍然会在驱动入口加载成功之后蓝屏,应该是您说的NtTraceControl调用的问题吧,我稍后尝试一下KDU
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
你的 KDU 是下载的代码自己编译的吗,KDU 的实现有些 Bug,需要改一下才能成功加载,我这边改了后测试成功。
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
你的 KDU 是下载的代码自己编译的吗,KDU 的实现有些 Bug,需要改一下才能成功加载,我这边改了后测试成功。
是的 下载好了自己编译,我使用KDU可以成功加载啊,但是会成功后马上出现蓝屏的毛病
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
KDU 在加载驱动后解析驱动的导入表不完全导致蓝屏,可以按下边的代码进行修改。 sup.cpp 的函数 supResolveKernelImport,原逻辑为
if (ITable->OriginalFirstThunk == 0)
pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->FirstThunk);
else
pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->OriginalFirstThunk);
for (i = 0; pthunk->u1.Function != 0; i++, pthunk++) {
nextthunk = (PULONG_PTR)(Image + ITable->FirstThunk);
if ((pthunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) {
pname = (PIMAGE_IMPORT_BY_NAME)((PCHAR)Image + pthunk->u1.AddressOfData);
nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, pname->Name);
printf_s("[*] %s 0x%llX\r\n", pname->Name, nextthunk[i]);
}
else
nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, (LPCSTR)(pthunk->u1.Ordinal & 0xffff));
}
`` 更改为
while (ITable->Name)
{
if (ITable->OriginalFirstThunk == 0)
pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->FirstThunk);
else
pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->OriginalFirstThunk);
for (i = 0; pthunk->u1.Function != 0; i++, pthunk++) {
nextthunk = (PULONG_PTR)(Image + ITable->FirstThunk);
if ((pthunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) {
pname = (PIMAGE_IMPORT_BY_NAME)((PCHAR)Image + pthunk->u1.AddressOfData);
nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, pname->Name);
printf_s("[*] %s 0x%llX\r\n", pname->Name, nextthunk[i]);
}
else
nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, (LPCSTR)(pthunk->u1.Ordinal & 0xffff));
}
ITable++;
}
然后 DriverEntry 的参数还是要按照之前发的链接的那篇文章,要么不用 DriverEntry的参数,要么用 IoCreateDriver重新创建一个驱动对象。其实用 KernelMapper加载的驱动一般都不卸载,可以不设置 DriverUnload。你按照上述的方法修改试试。
其实还是建议你源码不改,想办法用证书签名后正常加载。
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
KDU 在加载驱动后解析驱动的导入表不完全导致蓝屏,可以按下边的代码进行修改。 sup.cpp 的函数 supResolveKernelImport,原逻辑为
if (ITable->OriginalFirstThunk == 0) pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->FirstThunk); else pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->OriginalFirstThunk); for (i = 0; pthunk->u1.Function != 0; i++, pthunk++) { nextthunk = (PULONG_PTR)(Image + ITable->FirstThunk); if ((pthunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { pname = (PIMAGE_IMPORT_BY_NAME)((PCHAR)Image + pthunk->u1.AddressOfData); nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, pname->Name); printf_s("[*] %s 0x%llX\r\n", pname->Name, nextthunk[i]); } else nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, (LPCSTR)(pthunk->u1.Ordinal & 0xffff)); }
`` 更改为
while (ITable->Name) { if (ITable->OriginalFirstThunk == 0) pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->FirstThunk); else pthunk = (PIMAGE_THUNK_DATA)(Image + ITable->OriginalFirstThunk); for (i = 0; pthunk->u1.Function != 0; i++, pthunk++) { nextthunk = (PULONG_PTR)(Image + ITable->FirstThunk); if ((pthunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { pname = (PIMAGE_IMPORT_BY_NAME)((PCHAR)Image + pthunk->u1.AddressOfData); nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, pname->Name); printf_s("[*] %s 0x%llX\r\n", pname->Name, nextthunk[i]); } else nextthunk[i] = supGetProcAddress(KernelBase, KernelImage, (LPCSTR)(pthunk->u1.Ordinal & 0xffff)); } ITable++; } 然后 DriverEntry 的参数还是要按照之前发的链接的那篇文章,要么不用 DriverEntry的参数,要么用 IoCreateDriver重新创建一个驱动对象。其实用 KernelMapper加载的驱动一般都不卸载,可以不设置 DriverUnload。你按照上述的方法修改试试。 其实还是建议你源码不改,想办法用证书签名后正常加载。
非常感谢,现在已经可以正常加载了!
其实我也不是不想正常加载,实在是臭学生没钱搞证书正常在Windows加载,然后我就想到了用映射驱动来加载无签名的驱动,然后映射的驱动不能用入口的参数来创建IO通讯就导致我只能另外想办法通讯(当时不知道能用IoCreateDriver,现在只能一条路走到黑了) 后来想到办法就是hook内核函数来进行通讯,这个效率反而比IO快一些,舒服~
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
你如果只是学习开发并不发布产品的话可以用系统的调试模式呢
都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏
你如果只是学习开发并不发布产品的话可以用系统的调试模式呢
好的大佬
当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏