首页
社区
课程
招聘
[旧帖] [求助]过一个inline hook老是蓝屏帮我看看谢谢. 0.00雪花
发表于: 2009-8-6 16:32 1921

[旧帖] [求助]过一个inline hook老是蓝屏帮我看看谢谢. 0.00雪花

2009-8-6 16:32
1921
被hook的代码
805c13cb 8d45e0          lea     eax,[ebp-20h]
805c13ce 50              push    eax
805c13cf ff75cc          push    dword ptr [ebp-34h]
805c13d2 ff35b8a75580    push    dword ptr [nt!PsProcessType (8055a7b8)]
805c13d8 56              push    esi
805c13d9 8d8548ffffff    lea     eax,[ebp-0B8h]
805c13df 50              push    eax
805c13e0 ff75c8          push    dword ptr [ebp-38h]
805c13e3 ff75dc          push    dword ptr [ebp-24h]
805c13e6 e80500ffff      call    nt!ObOpenObjectByPointer (805b13f0)<<-这里被hook了,直接跳转,执行完它的代码后返回继续执行
805c13eb 8bf8            mov     edi,eax
805c13ed 8d8548ffffff    lea     eax,[ebp-0B8h]<<-这里是我准备hook的地方
805c13f3 50              push    eax<<-这里是我准备跳回的地方
805c13f4 e873590200      call    nt!SeDeleteAccessState (805e6d6c)
805c13f9 8b4dd0          mov     ecx,dword ptr [ebp-30h]
805c13fc 3bce            cmp     ecx,esi

.code
HookCode proc
        int 3
        lea        eax, [ebp - 20h]
        push        eax
        push    DWORD ptr [ebp-34h]
        mov        eax, 8055a7b8h
        push    DWORD ptr [eax]
        push    esi
        lea     eax,[ebp-0B8h]
        push    eax
        push    DWORD ptr [ebp-38h]
        push    DWORD ptr [ebp-24h]
        mov        eax, 805b13f0h
        call    eax;以上代码就是想重新执行一次ObOpenObjectByPointer
        mov        edi, eax;以下是执行805c13eb到805c13ed处的代码
        lea        eax, [ebp-0B8h]
        mov        eax, 805c13f3h;最后跳回去
        jmp        eax
HookCode endp
       
Hook proc
        mov        eax, offset HookCode
        sub        eax, 805c13edh
        sub        eax, 5    ;获取要跳转的地址
        mov        ebx, 805c13edh
        mov        cl, 0E9h
        mov        BYTE PTR [ebx], cl
        mov        DWORD PTR [ebx + 1], eax
        mov        cl, 90h
        mov        BYTE PTR [ebx + 5], cl ;向805c13edh处写入跳转的指令也就是jmp到HookCode 去执行
        ret
Hook endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
       
        call        Hook
        mov        eax, STATUS_SUCCESS
           ret

DriverEntry endp
end DriverEntry

不懂怎么一加载就蓝屏,调试的时候我看到写进去的内容也都是自己预计的那样,jmp没问题,如果说是HookCode的问题,那我起码也会拦截到一次断点,可是就直接蓝屏了,谁能帮忙看看什么原因

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
说说我的整个思路,免得大家看的累
我想它既然在那里jmp了一下,肯定执行ObOpenObjectByPointer 做过某些处理,那么我就达不到我的目的。我就想在下面也jmp一下然后重新执行一次ObOpenObjectByPointer,然后把他的805c13eb 8bf8  mov  edi,eax返回值给废掉。
2009-8-6 16:39
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
问一下tufuzi,你在写加壳软件吗?
2009-8-6 16:44
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
不是的这个是np保护,学习怎么过他,虽然我看到很多人也提供了其他方法,我觉得这种好像直接点,所以想尝试下
2009-8-6 16:47
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
HIOOK这方面的基本不懂,我说以下我的疑惑哈:
805c13ed 8d8548ffffff    lea     eax,[ebp-0B8h]<<-这里是我准备hook的地方
805c13f3 50              push    eax<<-这里是我准备跳回的地方
805c13f4 e873590200      call    nt!SeDeleteAccessState (805e6d6c)
你HOOK后,我看用了不少寄存器,难道你不
pushfd
pushad  
......
popad
popfd
这样HOOK吗?
因为后面还调用一个函数啊,你随便修改寄存器的值,容易出问题吧。
2009-8-6 16:53
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
要是说是我代码执行的这段期间内出了问题,那么HookCode 开头得到一个断点。。。而且805c13cb这里我也下了一个断点,硬是没断到马上蓝屏,有点搞不懂,而且按照你所说的那样,那也应该是我的代码执行后再次执行NtOpenProcess后面的代码才会出问题吧
2009-8-6 16:58
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
引用:
“而且805c13cb这里我也下了一个断点,硬是没断到马上蓝屏,有点搞不懂”
你下的是硬件断点吗?
     函数调用错误应该不会蓝屏,这应该是个反调试措施。遇见蓝屏,想反复验证是什么问题,不要下CC断点。要用硬件断点。遇上检测硬件断点的,用带反检测硬件断点的插件。要是碰上在R0下检测硬件断点的,估计要自己修改它的代码来跳过检测。
2009-8-6 17:05
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
我是下的cc段吧?int 3 windbg bp下的断点。。。
2009-8-6 17:12
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
其实我现在还没加载np,应该不会有反调试的问题
2009-8-6 17:13
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
那楼主悲剧了,我跟踪几个壳,都检测自身代码的,用自身的一段代码校验值解码,如果不正确就完了。估计你就是被检测到CC断点所以蓝屏了。
如果不想用硬件断点,那你也可以把CC断点下在805c13cb+4h以后的地方。(因为你要HOOK,所以不能下在RETN处)。大家检测CC断点,一般只检测函数地址首字节,现在不少壳学乖了,检测函数首地址前4个字节。(貌似前4个字节不可能出现CC这个机器码)

引用:“其实我现在还没加载np,应该不会有反调试的问题”。看不懂,没明白你意思?难道说你加载EXE文件的时候直接蓝屏?
2009-8-6 17:21
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
不是的,是加载驱动的时候.sys
2009-8-6 18:28
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
12
Hook proc
mov eax, offset HookCode
sub eax, 805c13edh
sub eax, 5 ;获取要跳转的地址
mov ebx, 805c13edh
mov cl, 0E9h
mov BYTE PTR [ebx], cl
mov DWORD PTR [ebx + 1], eax
mov cl, 90h
mov BYTE PTR [ebx + 5], cl ;向805c13edh处写入跳转的指令也就是jmp到HookCode 去执行
ret
Hook endp


做Ring0下的inline hook连禁止写保护和禁止线程调度都没有做,这个蓝就只能说是概率问题了,蓝是道理,不蓝是幸运。
参考http://bbs.pediy.com/showthread.php?t=59127
2009-8-6 18:31
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
我先去看看,谢谢大家的热心帮助。
2009-8-6 18:38
0
雪    币: 444
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
轩辕小聪真是个热心人,很乐意帮助人,赞
看来我连问题都没弄清楚,哎,还是多学点东西再发言。
2009-8-6 18:54
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
你们都比我这无头苍蝇强
2009-8-6 19:41
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
修改了下,我怎么就感觉自己越写越离谱呢不过蓝屏依旧,我是顺着下面的思路来的
1)  IoAllocateMdl ,分配一个mdl,将要hook的函数映射进去。
2)  MmProbeAndLockPages,锁定页面
3)  去掉写保护
4)  保存函数开头机器码到对应的二维数组区,改写开头5个字节,让他跳转到起始地址位于.data:00034E98的跳转表中的对应跳转函数。
5)  恢复写保护
6)  MmUnlockPages
7)  IoFreeMdl

首先是照着combojiang的加了两个函数
Wpoff proc
        local uAttr
        push        eax
        mov        eax, cr0
        mov         uAttr, eax
        and         eax, 0FFFEFFFFh; // CR0 16 BIT = 0
        mov         cr0, eax
        pop         eax
        cli
        mov        eax, uAttr
        add esp, 4
        ret
Wpoff endp

Wpon proc uAttr
        sti
        push         eax
        mov         eax, uAttr; //恢復原有 CR0 屬性
        mov         cr0, eax
        pop         eax
        ret
Wpon endp

然后这里保护了下堆栈平衡
Hook proc
        pushad
        mov        eax, offset HookCode
        sub        eax, 805c13edh
        sub        eax, 5
        mov        ebx, 805c13edh
        mov        cl, 0E9h
        mov        BYTE PTR [ebx], cl
        mov        DWORD PTR [ebx + 1], eax
        mov        cl, 90h
        mov        BYTE PTR [ebx + 5], cl
        popad
        ret
Hook endp

修改的最多的就是入口了
DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
        invoke IoAllocateMdl, addr HookCode, 32h, FALSE, FALSE, NULL
        .if        !eax
                mov        eax, 1
                ret
        .endif
        push        eax;mdl
        invoke MmProbeAndLockPages, eax, 0, 2
        call        Wpoff
        push        eax;传参相当于是Wpoff中的uAttr
        call        Hook
        call        Wpon
        add        esp, 4
        pop        eax
        push        eax
        invoke MmUnlockPages, eax
        pop        eax
        invoke IoFreeMdl, eax
        mov        eax, STATUS_SUCCESS
           ret
DriverEntry endp
请问哪里出了问题呢?
2009-8-6 23:16
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
.code
Wpoff proc ;关闭写保护
        local uAttr
        push        eax
        mov        eax, cr0
        mov         uAttr, eax
        and         eax, 0FFFEFFFFh; // CR0 16 BIT = 0
        mov         cr0, eax
        pop         eax
        cli
        mov        eax, uAttr
        add        esp, 4
        ret
Wpoff endp

Wpon proc uAttr ;开启写保护
        sti
        push         eax
        mov         eax, uAttr; //恢復原有 CR0 屬性
        mov         cr0, eax
        pop         eax
        ret
Wpon endp

HookCode proc;jmp;后要执行的代码
        lea        eax, [ebp - 20h]
        push        eax
        push    DWORD ptr [ebp-34h]
        mov        eax, 8055a7b8h
        push    DWORD ptr [eax]
        push    esi
        lea     eax,[ebp-0B8h]
        push    eax
        push    DWORD ptr [ebp-38h]
        push    DWORD ptr [ebp-24h]
        mov        eax, 805b13f0h
        call    eax
        mov        edi, eax
        lea        eax, [ebp-0B8h]
        mov        eax, 805c13f3h
        jmp        eax
HookCode endp
       
Hook proc;把jmp指令写进去后面跟一个nop因为原先的指令长度是6
        pushad
        mov        eax, offset HookCode
        sub        eax, 805c13edh
        sub        eax, 5
        mov        ebx, 805c13edh
        mov        cl, 0E9h
        mov        BYTE PTR [ebx], cl
        mov        DWORD PTR [ebx + 1], eax
        mov        cl, 90h
        mov        BYTE PTR [ebx + 5], cl
        popad
        ret
Hook endp

DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING
;        invoke IoAllocateMdl, addr HookCode, 32h, FALSE, FALSE, NULL
;        .if        !eax
;                mov        eax, 1
;                ret
;        .endif
;        push        eax;mdl
;        invoke MmProbeAndLockPages, eax, 0, 2

        call        Wpoff
        push        eax;uAttr
        invoke KeRaiseIrqlToDpcLevel;提升IRQL中断级
        push        eax;Irql
;        push        eax;传参相当于是Wpoff中的uAttr
        call        Hook
        call KeLowerIrql;恢复Irql
        call        Wpon;打开写保护
        add        esp, 4
;        pop        eax
;        push        eax
;        invoke MmUnlockPages, eax
;        pop        eax
;        invoke IoFreeMdl, eax

        mov        eax, STATUS_SUCCESS
           ret
DriverEntry endp
end DriverEntry

蓝屏了,错误信息PAGE_FAULT_IN_NONPAGED_AREA,调试过程中,堆栈是平衡的,跳转指令写进去了,而且位置也是正确的,不过KeRaiseIrqlToDpcLevel返回一个0。感觉上和人家写的思路差不多。为啥子蓝屏呢。。。麻烦给看看,谢谢。绿色代码表示被注释掉了,无效。。。
2009-8-7 12:42
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习下
2009-8-7 13:43
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
慢慢找问题,异常出现在ExpWorkerThread
2009-8-7 14:09
0
雪    币: 159
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
发现了如果我自己hook这个地方,就不蓝屏,hook下面就蓝屏
2009-8-7 16:50
0
游客
登录 | 注册 方可回帖
返回
//