能力值:
( LV2,RANK:10 )
26 楼
支持楼主,感谢楼主分享学习笔记
804e6d1b e8523fffff call nt!KiInsertQueueApc (804dac72)
804e6d20 8ad8 (错误) mov bl,al
特征码就是sp_code1=0x28 sp_code2=0xe8 sp_code3=0xd88a(windbg显示有误,应该是d88a
)
804e6d20 8ad8 (错误) mov bl,al
说说这个,你说是windbg的错误,我不这么认为. 做为 mov bl,al 的机器码 8ad8 windbg并没有显示错误, 而你的 sp_code3=0xd88a . 如果你的 sp_code3 是 WORD 的话.那么你指向这块内存后.应该是 d88a . 要遵循高高低低原则嘛
如果我理解错的话,还请指出.
能力值:
( LV9,RANK:610 )
27 楼
wakaka挺细心啊,看来楼主需要部的东西挺多~
能力值:
( LV4,RANK:50 )
28 楼
LZ 可以再补充下以下方面
HOOK 时可能遇到的 当前环境偏移的一些问题 类似JMP CALL
HOOK FASTCALL类型函数时 需要注意的地方
还有两个程序同时INLINE HOOK一个函数地址 实时检查自身HOOK 等问题
BTW :能用C实现的 建议不要用汇编代替 这样 像我这样的菜鸟 看起来才更易懂
能力值:
( LV12,RANK:210 )
29 楼
多谢大家指出问题
能力值:
( LV12,RANK:300 )
30 楼
Irql=KeRaiseIrqlToDpcLevel();
所谓DpcLevel,并不是这个IRQL级别叫Dpc,而是提高到和Dpc同一个IRQL级别。相应级别其实是DISPATCH_LEVEL,在这DDK里写得很清楚:
The KeRaiseIrqlToDpcLevel routine raises the hardware priority to IRQL = DISPATCH_LEVEL, thereby masking off interrupts of equivalent or lower IRQL on the current processor.
能力值:
( LV12,RANK:210 )
31 楼
能力值:
( LV12,RANK:420 )
32 楼
提高中断级别到DISPATCH_LEVEL,禁止线程切换产生的中断
哎,还是很囧!
能力值:
( LV12,RANK:210 )
33 楼
能力值:
( LV3,RANK:20 )
34 楼
其实也没什么大错误..
感觉不必要为这个咬文嚼字..
一个内核模式的线程..把自己所在的处理器的IRQL提高至IRQL为2的DPC/DISPATCH 级别之后..
CPU的IRQL设置一旦改变(在PCR里面保存着)...则当前处理器.就不会再接受同等级别的请求
和低于此级别的请求(如果有.则插入当前处理器的DPC队列.等候处理)..注意一点: windows的线程调度以及分发工作.也不过是运行在IRQL为2的DPC/DISPATCH级别....所以..线程调度请求.通知当前处理器处理的时候.会被暂时屏蔽(保留起来).或者线程分发器交给其他处理器处理.....如果当前系统是单处理器.则实际上线程调度也就暂时被延迟了....所以不能说是禁止了线程调度产生的中断..(虽然我知道你想表达的也是这个意思)....
说这个了.把那个指令也啰嗦下.虽然大家都知道了..
就是sti 和cli..因为处理器要处理的请求..不仅仅来自软件请求..(比如说那个线程分发).
还有大量的硬件请求..
其中通过INTR引脚或者本地APIC传递到处理器的外部硬件中断都是可屏蔽中断..
为了减少CPU处理事情时候被打扰..这些可屏蔽的硬件中断.适当的使用指令(实质就是修改CPU的EFLAGES寄存器的IF位)屏蔽下也没太大坏处.... 说这么多了..最后把楼主的帖子说一下吧..
其实这一篇写的不错的..毕竟面向的对象不一样..
纵然是天上的天阳般万丈光芒.也不见得会得到所有人的喜欢..
所以..知道自己发帖的目的.和对象即可..不必要过于仅仅计较了..呵呵. 万事物极必反..
我就在后面跟上Anti 这种InLine的办法吧..新手可以用一下..
这种Hook大多针对的对象是那种 函数头前5字节.特别是stdcall约定的函数.
函数头大多喜欢是这样
80820cc1 8bff mov edi,edi
80820cc3 55 push ebp
80820cc4 8bec mov ebp,esp
这样的指令..完全可以自己实现一下这三句
比如写成这样
__declspec(naked)
PVOID
g_Safe_ExAllocatePoolWithTag(
IN POOL_TYPE PoolType,
IN SIZE_T NumberOfBytes,
IN ULONG Tag
)
{
__asm
{
mov edi,edi
push ebp
mov ebp,esp
mov eax,g_ExAllocatePoolWithTag 这里你可以随意按需要修改.就是被挂钩的函数的地址..
add eax,5因为上面自己实现前5字节了.这里直接转移到5子节后执行..也就绕过了那5个字节的Hook.. ..当然了.还有一点切记..有些函数会检查调用者的PreviousMode..注意修改.这两个东西.论坛都有专门的文章解释..就不废话了.
jmp eax
}
}
能力值:
( LV12,RANK:210 )
35 楼
写这篇文章就是为了对刚接触inline,对inline还没概念的读者一个总结,的确修改函数头5个字节早过时了,但是inline的过程是不变的,inline要注意的事项也是通用的。由于个人对操作系统线程调度及底层知识不足,文章出现几大错误,感谢大家指正。
能力值:
( LV2,RANK:10 )
36 楼
不错,总结得很好,虽然不是很懂!
能力值:
( LV2,RANK:10 )
37 楼
下载回来学习。
能力值:
( LV2,RANK:10 )
38 楼
怎么后退转不回去了
能力值:
( LV4,RANK:50 )
39 楼
标记一下 MARK
能力值:
( LV2,RANK:10 )
40 楼
恩。。下来看看先
能力值:
( LV2,RANK:10 )
41 楼
*( (ULONG*)(JmpAddress + 1) ) = (ULONG)DetourMyKiInsertQueueApc - (ULONG)g_KiInsertQueueApc - 5;
*(ULONG *)(JmpAddress+1)=(ULONG)DetourMyObReferenceObjectByHandle-((ULONG)ObReferenceObjectByHandle+5);
这个是你两个例子里的,为什么一个是加一个是减
这样操作对JmpAddress起到什么做用,
这样新函数减原函数起到什么作用,为什么最后JmpAddress是jmp到了新函数
能力值:
( LV12,RANK:210 )
42 楼
看清楚啊 括号去掉就都是减啊
能力值:
( LV2,RANK:10 )
43 楼
天,我犯了一个小学1年级的数学错误,其实还是想问这样减的意思,E9后面的地址这样减为什么能得到新函数的地址
能力值:
( LV2,RANK:10 )
44 楼
竹君.你确定这样减JmpAddress能指向DetourMyObReferenceObjectByHandle的地址?好象减了后JmpAddress的值和DetourMyObReferenceObjectByHandle没什么关系啊,
请帮解惑下
能力值:
( LV3,RANK:30 )
45 楼
说真的,我就一直看到这这位大侠在那儿囧,囧了三四次了,
就是不愿说说真正的理解。真是汗。。
能力值:
( LV3,RANK:30 )
46 楼
楼主写得很好啊,加油加油。
我也是个菜鸟,也最近一个月才真正地理解到INLINEHook
能力值:
( LV2,RANK:10 )
47 楼
[QUOTE=竹君;691973] if( _stricmp((char *)((ULONG)(*Object)+
0x174 ),"notepad.exe")==0)
...[/QUOTE]
请教一下.这个0X174是怎么得来的
能力值:
( LV9,RANK:610 )
48 楼
0x174是个硬编码,自己dt _EPROCESS看一下就知道了~
能力值:
( LV2,RANK:10 )
49 楼
谢谢分享这么好的资料
能力值:
( LV2,RANK:10 )
50 楼
提高优先级可以避免线程切换出错,重入问题呢?