首页
论坛
课程
招聘
[分享]射-->XP/2003/VISTA的简单INLINE HOOK
2008-1-24 19:44 11312

[分享]射-->XP/2003/VISTA的简单INLINE HOOK

2008-1-24 19:44
11312
哈哈,MJ牛放血那么久了,今天才仔细看了看她射的一个帖子. 原来inline hook是如此之方便耶. 当然是简单的.复杂滴还得自己写...

http://www.debugman.com/read.php?tid=670

NTSTATUS
InlineHookFuncXP (
  IN PVOID FuncAddress,
  IN PVOID NewFuncAddress
  )

/*++

Author : MJ0011
User : sudami [xiao_rui_119@163.com]
Time : 08/01/24

参数 :
FuncAddress - [IN] 原函数

NewFuncAddress - [IN] inline hook 函数

返回 :
STATUS_SUCCESS - inline hook 成功

STATUS_UNSUCCESSFUL - 失败

功能 :
在普通函数的开头处简单实现inline hook.XP以上版本适用
btw -- 在新函数执行完后需要跳转到原函数地址 + 2处


直线上的这5字节内容,是在大部分函数头前面.都是nop.这刚好可以
放5字节的跳转: JMP XXXX

|ˉˉˉ| --> 0xe9 (JMP)
|ˉˉˉ|
|ˉˉˉ|
|ˉˉˉ|
|ˉˉˉ| 这4字节存放新函数的地址
ˉˉ |ˉˉˉ|ˉˉ--> 符合inline hook 条件的函数的前5字节一般都是---
|ˉˉˉ| |
↓ˉˉˉˉ
8bff mov edi,edi
故只需要把8bff这2字节换成一个短转移 <-- 55 push ebp
"ebf9" 便会跳转到 FuncAddress -5 处 <-- 8bec mov ebp,esp

<简单inline hook示意图>
--*/

{
    KSPIN_LOCK SDTSpinLock;
    KIRQL      oldIrql;
    NTSTATUS   state;
    
    KeAcquireSpinLock (&SDTSpinLock, &oldIrql);
    
    WPOFF();

    __asm {
        push eax
        push ecx
        lea eax,[FuncAddress]
        mov eax,[eax]
        /* 这几句是判断原函数是否符合这种简单inline hook的条件 */
        cmp byte ptr[eax],0x8b      
        jnz failtohook
        cmp byte ptr[eax+1],0xff  
        jnz failtohook   
        mov ecx,0xffffffff

loopcheck:
        /* 这个循环确保函数头的上面5字节为nop;不是则hook失败 */
        cmp byte ptr[eax+ecx],0x90
        jnz failtohook
        dec ecx
        cmp ecx,0xfffffffa
        jnz loopcheck
        
        /* write the new function header:jmp short funcaddr-5(0x00-0x07) */
        mov byte ptr[eax],0xeb
        mov byte ptr[eax+1],0xf9
        
        /* write 1 byte : jmp xxxx */
        mov byte ptr[eax-5],0xe9

        /* write 4 byte : x xxxx */
        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 state;
}


,大家凑合着用吧

[注意] 欢迎加入看雪团队!base上海,招聘安全工程师、逆向工程师多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (19)
雪    币: 38
活跃值: 活跃值 (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-24 20:05
2
0
呵呵  把7个nop全用掉了  不过这样hook很稳定,不会出现因为覆盖到了正在执行的代码而导致bsod的问题。

btw:精
雪    币: 479
活跃值: 活跃值 (659)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-24 20:36
3
0
mj牛的东西向来好啊
雪    币: 109
活跃值: 活跃值 (134)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-1-24 21:16
4
0
嗯,这个办法曾经看过,有个局限性。需要对于被hook的函数有一个要求,就是其函数体前面要有5个字节的nop。其实它是一个detour的情况,改写函数执行流程。
比较通用的inline hook 是保存函数开头5字节,然后改写开头字节,调到自定义函数执行,在需要执行原函数时,再回填保存的函数开头5字节,让原函数顺利执行。
通常来讲,inline hook用在ring3非常好,不管你是hook 用户定义函数还是api函数。
可是用在ring0就比较冒险。原因因为内核里常有线程切换,如果你把内核API还原,万一自己函数的线程被挂起,而又有线程要调用给API,这就会出现BSOD。
雪    币: 440
活跃值: 活跃值 (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
StarsunYzL 活跃值 2008-1-24 21:27
5
0
哪位权威人士暴一下MJ到底是MM还是GG
雪    币: 479
活跃值: 活跃值 (659)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-1-24 21:51
6
0
嗯,严重同意

mj是一位MM.

牛大婶
雪    币: 8670
活跃值: 活跃值 (777)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2008-1-24 23:58
7
0
MJ是一个MM,我可以作证,大家都来吧~~
这里MM多~~
雪    币: 38
活跃值: 活跃值 (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-25 09:54
8
0
俺现在比较关注ls的性别
雪    币: 440
活跃值: 活跃值 (51)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
StarsunYzL 活跃值 2008-1-25 10:02
9
0
vxk一看到MJ就露头……



想知道vxk的性别就到这里看看吧
http://bbs.driverdevelop.com/htm_data/98/0711/106934.html
雪    币: 38
活跃值: 活跃值 (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
炉子 活跃值 3 2008-1-25 12:29
10
0
那个照片见过  不过也见别人把vxk叫MM过  所以偶乱了 - -!
雪    币: 109
活跃值: 活跃值 (134)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2008-1-25 13:41
11
0
,原来是安全卫士
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
uncledo 活跃值 2008-2-28 03:53
12
0
太销魂了,也谢谢大米兄的整理
雪    币: 217
活跃值: 活跃值 (18)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
foxabu 活跃值 13 2008-2-28 12:10
13
0
难道是传说中的HotPatch?
雪    币: 206
活跃值: 活跃值 (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
鸡蛋壳 活跃值 2008-2-28 13:50
14
0
稳定的方法一般是不会公开的
雪    币: 1835
活跃值: 活跃值 (105)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 活跃值 8 2008-2-28 18:55
15
0
360是一支雄厚且独特的MM队伍。
雪    币: 308
活跃值: 活跃值 (55)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
zhuwg 活跃值 11 2008-2-28 21:06
16
0
太正确了
赞1个
雪    币: 479
活跃值: 活跃值 (659)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 活跃值 25 2008-2-28 21:41
17
0
雄性队伍才是啊
雪    币: 70
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yanxizhen 活跃值 2008-2-29 08:56
18
0
每个函数开头有的都是0xCC...........
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ertyui 活跃值 2008-5-14 18:31
19
0
纯支持下。哈哈
雪    币: 113
活跃值: 活跃值 (90)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 活跃值 2008-7-7 14:34
20
0
支持bughoho的说法........
游客
登录 | 注册 方可回帖
返回