首页
社区
课程
招聘
未解决 [求助]inlin Hook 一个内核 PspUserThreadStartup 疑惑 win10 1803
发表于: 2020-9-11 19:56 2593

未解决 [求助]inlin Hook 一个内核 PspUserThreadStartup 疑惑 win10 1803

2020-9-11 19:56
2593

打算直接hook 函数头 前15个字节
图片描述

 

现在已经把前15个字节替换,这里ret 过去的是自己申请的虚拟地址

 

图片描述

 

这里执行一遍被破坏的指令就直接ret了 返回地址也是fffff801`2c3290ef
图片描述

 

蓝屏错误 说是 一个 Virtual address for the attempted execute.
内核inlin hook 不能用虚拟地址吗?
图片描述

插入代码
VOID HOOKPspUserThreadStartup()
{

    PVOID pHookaddr = (PVOID)GetPspUserThreadStartup();

    DbgPrint("pHookaddr:%p\n", pHookaddr);

    /*   
push rax
MOV RAX, 0x9090909090909090
PUSH RAX
RET
*/
    BYTE HookCode[] =
    {
        0x50,0x48, 0xB8, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x50, 0xC3,0x90,0x90
    };
    //50 48 B8 90 90 90 90 90 90 90 90 50 C3
    BYTE JMPBackCode[] =
    {
        0x58,0x68, 0x90, 0x90,0x90, 0x90
    };
    BYTE JMPBackCode2[] =
    {
        0xC7, 0x44, 0x24, 0x04, 0x90, 0x90, 0x90, 0x90
    };

    BYTE JMPBackCode3[] =
    {
        0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0xC3
    };

//58 68 - - - - C7 44 24 04 - - - - C3


    //DbgPrint("pHookaddr -->%p\n", pHookaddr);


    cs = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, 'cs');
    RtlSecureZeroMemory(cs, PAGE_SIZE);

    PVOID Nexaddr = (PVOID)((ULONG64)pHookaddr + 15);

    *(PINT64)(HookCode + 3) = (INT64)cs;
    *(PINT64)(JMPBackCode + 2) = 0x2C3290EF;//((INT64)Nexaddr >> 32) << 32;
    * (PINT64)(JMPBackCode2 + 4) = 0xFFFFF801;//(INT)Nexaddr << 32;
    //DbgPrint("Nexaddr: %p\n", (INT64)Nexaddr);
    //DbgPrint("高Nexaddr>>32: %p\n", ((INT64)Nexaddr >>32)<<32);
    //DbgPrint("低Nexaddr<<32: %p\n", (INT64)Nexaddr << 32);
    //DbgPrint("JMPCode:-->%p\n", (INT64)&NewPspUserThreadStartup - (ULONG64)pHookaddr + 5);
    //


    __debugbreak();
    KIRQL  irql=WPOFFx64();
    memcpy(cs, pHookaddr, 15);//保存
    memcpy((PVOID)((ULONG64)cs+15), JMPBackCode, 6);//回跳
    memcpy((PVOID)((ULONG64)cs + 21), JMPBackCode2, 8);//回跳 测试
    memcpy((PVOID)((ULONG64)cs + 29), JMPBackCode3, 9);//回跳 测试
    memcpy(pHookaddr, &HookCode,15);
    DbgPrint("cs-->%p\n", cs);
    __debugbreak();
    WPONx64(irql);


}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-9-11 19:58 被叽叽‘and1=1编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12364
活跃值: (5889)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
两个槽点:代理函数所在页不可执行;代理函数破坏了堆栈,就算成功执行,PspUserThreadStartup执行完照样BSOD
2020-9-11 21:08
0
雪    币: 446
活跃值: (595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hhkqqs 两个槽点:代理函数所在页不可执行;代理函数破坏了堆栈,就算成功执行,PspUserThreadStartup执行完照样BSOD[em_1]
我看我就用了一个rax做一个中转  所以在进入前push 了一下,跳出来的时候也pop了一下~~ ,难道要跳到代理函数的第一件事就是把全部寄存器push 一次?
2020-9-11 22:32
0
雪    币: 12364
活跃值: (5889)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
叽叽‘and1=1 我看我就用了一个rax做一个中转 所以在进入前push 了一下,跳出来的时候也pop了一下~~ ,难道要跳到代理函数的第一件事就是把全部寄存器push 一次?
pop rax放在你复制的原函数头前面就对了,不然你后面pop了 保存的rbx从rsp+8跑到rsp+0,原函数不知道你这么搞,恢复rbx的时候还是从rsp+8取  还有64位系统exallocatepool的内存默认不可执行,建议把代理函数放进可执行区段,最简单的方法是给驱动加个rwe的区段,比如
#define MODIFIABLE_TEXT_SECTION __declspec(allocate(".modtext"))
#pragma section(".modtext",read,write,execute)
MODIFIABLE_TEXT_SECTION void HookProcedure();
2020-9-11 22:41
1
雪    币: 446
活跃值: (595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好的 感谢
2020-9-11 23:13
0
雪    币: 211
活跃值: (193)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2020-9-12 01:05
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很明显的堆栈不平衡
2020-9-12 11:47
0
雪    币: 446
活跃值: (595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
yy虫子yy 很明显的堆栈不平衡
恩 是的 把pop rax 放在前面就好了
2020-9-12 13:37
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
过了pg?
2020-9-12 14:00
0
雪    币: 446
活跃值: (595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
fengyunabc 过了pg?
还没。但不影响
2020-9-12 15:53
0
游客
登录 | 注册 方可回帖
返回
//