能力值:
( LV3,RANK:30 )
|
-
-
2 楼
说说我的整个思路,免得大家看的累
我想它既然在那里jmp了一下,肯定执行ObOpenObjectByPointer 做过某些处理,那么我就达不到我的目的。我就想在下面也jmp一下然后重新执行一次ObOpenObjectByPointer,然后把他的805c13eb 8bf8 mov edi,eax返回值给废掉。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
问一下tufuzi,你在写加壳软件吗?
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
不是的这个是np保护,学习怎么过他 ,虽然我看到很多人也提供了其他方法,我觉得这种好像直接点,所以想尝试下
|
能力值:
( 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吗?
因为后面还调用一个函数啊,你随便修改寄存器的值,容易出问题吧。
|
能力值:
( LV3,RANK:30 )
|
-
-
6 楼
要是说是我代码执行的这段期间内出了问题,那么HookCode 开头得到一个断点。。。而且805c13cb这里我也下了一个断点,硬是没断到马上蓝屏,有点搞不懂,而且按照你所说的那样,那也应该是我的代码执行后再次执行NtOpenProcess后面的代码才会出问题吧
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
引用:
“而且805c13cb这里我也下了一个断点,硬是没断到马上蓝屏,有点搞不懂”
你下的是硬件断点吗?
函数调用错误应该不会蓝屏,这应该是个反调试措施。遇见蓝屏,想反复验证是什么问题,不要下CC断点。要用硬件断点。遇上检测硬件断点的,用带反检测硬件断点的插件。要是碰上在R0下检测硬件断点的,估计要自己修改它的代码来跳过检测。
|
能力值:
( LV3,RANK:30 )
|
-
-
8 楼
我是下的cc段吧?int 3 windbg bp下的断点。。。
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
其实我现在还没加载np,应该不会有反调试的问题
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
那楼主悲剧了,我跟踪几个壳,都检测自身代码的,用自身的一段代码校验值解码,如果不正确就完了。估计你就是被检测到CC断点所以蓝屏了。
如果不想用硬件断点,那你也可以把CC断点下在805c13cb+4h以后的地方。(因为你要HOOK,所以不能下在RETN处)。大家检测CC断点,一般只检测函数地址首字节,现在不少壳学乖了,检测函数首地址前4个字节。(貌似前4个字节不可能出现CC这个机器码)
引用:“其实我现在还没加载np,应该不会有反调试的问题”。看不懂,没明白你意思?难道说你加载EXE文件的时候直接蓝屏?
|
能力值:
( LV3,RANK:30 )
|
-
-
11 楼
不是的,是加载驱动的时候.sys
|
能力值:
( 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
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
我先去看看,谢谢大家的热心帮助。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
轩辕小聪真是个热心人,很乐意帮助人,赞
看来我连问题都没弄清楚,哎,还是多学点东西再发言。
|
能力值:
( LV3,RANK:30 )
|
-
-
15 楼
你们都比我这无头苍蝇强
|
能力值:
( 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
请问哪里出了问题呢?
|
能力值:
( 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。感觉上和人家写的思路差不多。为啥子蓝屏呢。。。麻烦给看看,谢谢。绿色代码表示被注释掉了,无效。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
学习下
|
能力值:
( LV3,RANK:30 )
|
-
-
19 楼
慢慢找问题,异常出现在ExpWorkerThread
|
能力值:
( LV3,RANK:30 )
|
-
-
20 楼
发现了如果我自己hook这个地方,就不蓝屏,hook下面就蓝屏
|
|
|