首页
社区
课程
招聘
[旧帖] [求助]怎么实现自定义的 NtOpenProcess 里面的CALL 指令 0.00雪花
2011-2-28 21:00 894

[旧帖] [求助]怎么实现自定义的 NtOpenProcess 里面的CALL 指令 0.00雪花

2011-2-28 21:00
894
我目的是绕过NtOpenProcess 的inline hook

NtOpenProcess hook前:
nt!NtOpenProcess:
805cc440 68c4000000      push    0C4h
805cc445 68c0b44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e89107f7ff      call    nt!wctomb+0x45 (8053cbe0)
805cc44f 33f6            xor     esi,esi

NtOpenProcess hook后:
nt!NtOpenProcess:
805cc440 68c4000000      push    0C4h
805cc445 68c0b44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x2010 (804db4c0)
805cc44a e8a13dbf2f      call    b01c01f0
805cc44f 33f6            xor     esi,esi

我的解决方案是自己定义一个函数实现NtOpenProcess 的前15个字节, 即前3条指令,先改写原NtOpenProcess 的前5个字节,跳到自定义的MyNtOpenProcess,然后MyNtOpenProcess实现
前3条指令,然后跳回原NtOpenProcess 的第4条指令(xor     esi,esi)那里继续执行

现在的问题是call 指令怎么在自己的MyNtOpenProcess 里实现`现在只会用硬编码实现`求个兼容性好的方法`

关键代码如下:

ULONG GetNtOpenProcessAddress();    //声明GetNtOpenProcessAddress
static ULONG NtOpenProcessAddress=GetNtOpenProcessAddress();
UCHAR Save12Byte[12];
//Save12Byte  是用来保存原NtOpenProcess 前3条指令的2个参数(0C4h和804db4c0)和CALL指令的目地址( 8053cbe0h )

ULONG GetNtOpenProcessAddress()
{
        ULONG NtOpenProcessAddress;
        UNICODE_STRING NtOpenProcessName;
        RtlInitUnicodeString(&NtOpenProcessName,L"NtOpenProcess");
        NtOpenProcessAddress=(ULONG)MmGetSystemRoutineAddress(&NtOpenProcessName);
        return NtOpenProcessAddress;
}

__declspec(naked) VOID MyNtOpenProcess()
{
        _asm
        {
                lea ebx,Save12Byte     //指向Save12Byte     
                mov eax,[ebx]          //取得Save12Byte 前4个字节:c4 00 00 00
                push eax               //push 000000c4h
                mov eax,[ebx+4]        //取得Save12Byte 第5到8个字节:c0 b4 4d 80
                push eax               //push  804db4c0h
                mov eax,0x8053cbe0               
    call eax               //call  8053cbe0h
                mov eax,NtOpenProcessAddress  //原NtOpenProcess函数头地址
                add eax,0xF            //NtOpenProcessAddress + 0xF 即eax指向xor     esi,esi  的地址:805cc44fh

                jmp eax               //跳到 805cc44fh
        }
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回