zhutingxf / InfinityHookPro

InfinityHook 支持Win7 到 Win11 最新版本,虚拟机环境及物理机环境
MIT License
29 stars 10 forks source link

无法与映射搭配使用? #1

Closed BaiFeng666 closed 4 months ago

BaiFeng666 commented 4 months ago

当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏

BaiFeng666 commented 4 months ago

ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY

zhutingxf commented 4 months ago

当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏

看你用什么映射了,如果用的是 KdMapper,由于驱动的 DriverEntry 中使用了传入的两个参数,而 KdMapper 执行驱动入口函数时并没有传入有效的参数,导致指针无效而蓝屏。解决方法可以参考我的文章https://blog.csdn.net/zhuting__xf/article/details/132673437 。 但实际这样修改了仍然不会成功,虽然不会蓝屏,但在驱动用调用 NtTraceControl 会因权限问题导致失败。 如果用的是 KDU,具体操作我这边无法复现。建议直接用证书签名驱动后正常加载,这样就不会出现问题了。

BaiFeng666 commented 4 months ago

当手动映射带有infinityHookPro的驱动时 会在加载成功后一秒内蓝屏

看你用什么映射了,如果用的是 KdMapper,由于驱动的 DriverEntry 中使用了传入的两个参数,而 KdMapper 执行驱动入口函数时并没有传入有效的参数,导致指针无效而蓝屏。解决方法可以参考我的文章https://blog.csdn.net/zhuting__xf/article/details/132673437 。 但实际这样修改了仍然不会成功,虽然不会蓝屏,但在驱动用调用 NtTraceControl 会因权限问题导致失败。 如果用的是 KDU,具体操作我这边无法复现。建议直接用证书签名驱动后正常加载,这样就不会出现问题了。

我在映射前恰巧看了您的这篇文章,都正确设置了,仍然会在驱动入口加载成功之后蓝屏,应该是您说的NtTraceControl调用的问题吧,我稍后尝试一下KDU

BaiFeng666 commented 4 months ago

都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏

zhutingxf commented 4 months ago

都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏

你的 KDU 是下载的代码自己编译的吗,KDU 的实现有些 Bug,需要改一下才能成功加载,我这边改了后测试成功。

BaiFeng666 commented 4 months ago

都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏

你的 KDU 是下载的代码自己编译的吗,KDU 的实现有些 Bug,需要改一下才能成功加载,我这边改了后测试成功。

是的 下载好了自己编译,我使用KDU可以成功加载啊,但是会成功后马上出现蓝屏的毛病

zhutingxf commented 4 months ago

都测试了一下 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。你按照上述的方法修改试试。
    其实还是建议你源码不改,想办法用证书签名后正常加载。
BaiFeng666 commented 4 months ago

都测试了一下 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快一些,舒服~

zhutingxf commented 4 months ago

都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏

你如果只是学习开发并不发布产品的话可以用系统的调试模式呢

BaiFeng666 commented 4 months ago

都测试了一下 kdmapper会NtTraceControl 调用失败 KDU可以加载成功 但是会马上蓝屏

你如果只是学习开发并不发布产品的话可以用系统的调试模式呢

好的大佬