本论坛为只读模式,仅供查阅,不能注册新用户,不能发帖/回帖,有问题可发邮件 xikug.xp (^) gmail.com
查看: 27107|回复: 34

晚上再放血,XP/2003/VISTA的简单INLINE HOOK [复制链接]

Rank: 5Rank: 5

发表于 2007-10-29 21:54:14 |显示全部楼层
利用HOTPATCH CODE~
XP SP2以上才可以用


//By MJ0011 2007-6-24
KSPIN_LOCK SDTSpinLock;
void WPOFF();
VOID WPON();
ULONG g_uCr0 = 0;

void WPOFF()
{
   
    ULONG uAttr;
   
    _asm
    {
        push eax;
        mov eax, cr0;
        mov uAttr, eax;
        and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
        mov cr0, eax;
        pop eax;
        cli
    };
   
    g_uCr0 = uAttr; //保存原有的 CRO ?傩?
   
}

VOID WPON()
{
   
    _asm
    {
        sti
            push eax;
        mov eax, g_uCr0; //恢?驮?有 CR0 ?傩?
        mov cr0, eax;
        pop eax;
    };
   
}
NTSTATUS InlineHookFuncXP(IN PVOID FuncAddress,
                          IN PVOID NewFuncAddress)
{
//FuncAddress:orignal function address
//NewFuncAddress:new function address to hook
//if function successed,the old function which the hook function will jump to
//is the FuncAddress+2

KIRQL OldIrql ;
NTSTATUS stat;

    KeAcquireSpinLock( &SDTSpinLock, &OldIrql );

    WPOFF();
    //进dpc

    __asm
    {
        push eax
        push ecx
        lea eax,[FuncAddress]
        mov eax,[eax]
        cmp byte ptr[eax],0x8b
        jnz failtohook
        cmp byte ptr[eax+1],0xff
        jnz failtohook
        mov ecx,0xffffffff
loopcheck:
        cmp byte ptr[eax+ecx],0x90
        jnz failtohook
        dec ecx
        cmp ecx,0xfffffffa
        jnz loopcheck
        
        ;check function header if "mov edi,edi"
        mov byte ptr[eax],0xeb
        mov byte ptr[eax+1],0xf9
        ;write the new function header:jmp short funcaddr-5(0x00-0x07)
        mov byte ptr[eax-5],0xe9
        ;write 1 byte :jmp xxxxx
        mov ecx,[NewFuncAddress]
        sub ecx,eax
        mov dword ptr[eax-4],ecx
        jmp hookok
failtohook:
        mov stat,0xc0000001
        jmp end
hookok:
        mov stat,0
end:
        pop ecx
        pop eax


    }
    WPON();
            KeReleaseSpinLock( &SDTSpinLock, OldIrql );

    return stat;
}

Rank: 2

发表于 2007-10-29 22:01:56 |显示全部楼层
当初Xp Sp2在函数前面加上mov edi,edi就是为了凑够5字节,升级补丁时不用重启,结果让Hooker捡便宜了。

Rank: 5Rank: 5

发表于 2007-10-29 22:03:44 |显示全部楼层
MmHotpatchRoutine其实就是这么做的嘛,,
微软给自己的hooker留的后门

Rank: 1

发表于 2007-10-30 00:49:56 |显示全部楼层
看懂了楼主的代码 xp简直是hook的天堂

Rank: 1

发表于 2007-10-30 01:08:36 |显示全部楼层
请问,此代码是不是只能hook以下两个条件的函数:
1。函数开头必须是mov edi, edi
2。函数开头前的五个字节是nop

Rank: 5Rank: 5

发表于 2007-10-30 01:27:20 |显示全部楼层
绝大多数系统函数都具备这么个条件,,当然有个别没有~

Rank: 1

发表于 2007-10-30 01:29:45 |显示全部楼层
谢谢,MJ大姐的眼力真好,一般都知道函数开头是mov edi, edi,但注意5个nop的人不多

Rank: 1

发表于 2007-10-30 13:28:43 |显示全部楼层
   inline hook

Rank: 5Rank: 5

发表于 2007-10-30 14:10:06 |显示全部楼层
还是反汇编,移动,再汇编的好~呵呵修正偏移xxx,这种比较适合标准化规范化的hook~~比如内核detour呵呵~

Rank: 2

发表于 2007-10-30 23:33:24 |显示全部楼层
真是好方法,不用存储前的N字节了.回来时,直接跳就可以了,爽鸭!

Rank: 1

发表于 2008-1-2 18:05:17 |显示全部楼层
学习

Rank: 1

发表于 2008-1-13 18:56:14 |显示全部楼层
不错 :)

Rank: 4

发表于 2008-1-24 22:41:35 |显示全部楼层
支持MJ牛.

哈哈.短小精悍耶.收藏之

Rank: 1

发表于 2008-2-22 15:12:47 |显示全部楼层
好东西

Rank: 1

发表于 2008-2-29 00:24:19 |显示全部楼层
看不懂呀````- -

Rank: 3Rank: 3

发表于 2008-7-3 16:19:13 |显示全部楼层
只是对于用户态dll文件。

Rank: 5Rank: 5

发表于 2008-7-3 16:22:41 |显示全部楼层
谁告诉你的,内核态也一样

Rank: 3Rank: 3

发表于 2008-7-3 17:45:54 |显示全部楼层
引用第16楼MJ0011于2008-07-03 13:22发表的  :
谁告诉你的,内核态也一样


crzlvb ASK......................
请问,此代码是不是只能hook以下两个条件的函数:
1。函数开头必须是mov edi, edi
2。函数开头前的五个字节是nop

MJ0011 Answer............
绝大多数系统函数都具备这么个条件,,当然有个别没有~

你可别说kernel下是 cc cc cc cc cc,你的代码只能跑9090909090

kd> u ntdll!ntcreatefile-5
ntdll!ZwCreateFile:
7c90d67d 90               nop
7c90d67e 90               nop
7c90d67f 90               nop
7c90d680 90               nop
7c90d681 90               nop
ntdll!ZwCreateFile:
7c90d682 b825000000       mov     eax,0x25
7c90d687 ba0003fe7f       mov     edx,0x7ffe0300
7c90d68c ff12             call    dword ptr [edx]
kd> u nt!ntcreatefile-10 l0x30
nt!IoConfigureCrashDump+0x96:
8056d13c 4d               dec     ebp
8056d13d 805f5e8b         sbb     byte ptr [edi+0x5e],0x8b
8056d141 c3               ret
8056d142 5b               pop     ebx
8056d143 5d               pop     ebp
8056d144 c20400           ret     0x4
8056d147 cc               int     3
8056d148 cc               int     3
8056d149 cc               int     3
8056d14a cc               int     3
8056d14b cc               int     3
nt!NtCreateFile:
8056d14c 8bff             mov     edi,edi

Rank: 5Rank: 5

发表于 2008-7-3 18:09:13 |显示全部楼层
部分带SEH的函数不可以,例如Nt*函数,其他大部分内核函数都可以

Rank: 1

发表于 2008-7-8 18:55:54 |显示全部楼层
没看懂啊。晕了
您需要登录后才可以回帖 登录 | 立即加入

Archiver|手机版|第8个男人 - 论坛为只读模式,仅供查阅

GMT+8, 2019-7-21 23:49 , Processed in 0.038623 second(s), 8 queries .

Design by pvo.cn

© 2011 Pvo Inc.

回顶部