能力值:
( LV12,RANK:210 )
2 楼
我一直这么认为:只要是内核导出函数,就可以用函数名做变量,(ULONG)导出函数==地址
但是KeInsertQueueApc却不正确呢?到底什么导出函数才可以直接用函数名得到地址?
能力值:
( LV10,RANK:170 )
3 楼
ntddk.h好像没有声名KeInsertQueueApc这个函数吧..
我在当前文件里声明了下.打印出来的地址KdPrint(("%0x",(ULONG)KeInsertQueueApc));
和windbg中反汇编的地址一样的..
lz再试下...
能力值:
( LV12,RANK:210 )
4 楼
我声明了:
BOOLEAN KeInsertQueueApc(PKAPC Apc,PVOID SystemArg1,PVOID SystemArg2,KPRIORITY Increment);
能力值:
( LV12,RANK:210 )
5 楼
还是一样的结果
能力值:
( LV12,RANK:210 )
6 楼
BOOLEAN KeInsertQueueApc(PKAPC Apc,PVOID SystemArg1,PVOID SystemArg2,KPRIORITY Increment);
NTKERNELAPI NTSTATUS ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
KdPrint(("KeInsertQueueApc--0x%x",(ULONG)KeInsertQueueApc));
KdPrint(("ObReferenceObjectByHandle--0x%x",(ULONG)ObReferenceObjectByHandle));
KdPrint(("ZwOpenFile---0x%x",(ULONG)ZwOpenFile));
能力值:
( LV10,RANK:170 )
7 楼
NTKERNELAPI
BOOLEAN
KeInsertQueueApc (
IN PKAPC Apc,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2,
IN KPRIORITY Increment
);
你前面掉了NTKERNELAPI,引入的意思..
否则编译器认为KeInsertQueueApc 是你自己定义的函数..打印出来的地址跟定不是系统的那个KeInsertQueueApc 的地址咯
能力值:
( LV9,RANK:610 )
8 楼
楼上正解~~
能力值:
( LV9,RANK:260 )
9 楼
如果直接打印 KeInsertQueueApc 地址会得到你自己的程序里的一个地址,因为这是你自己声明的函数。其实你的程序会被编译成这样:
山寨_KeInsertQueueApc(){
jmp [导入表中KeInsertQueueApc的位置]
}
而直接打印 KeInsertQueueApc 将得到 山寨_KeInsertQueueApc 的地址。
可以做如下实验:
lkd> u f8bdf49c //山寨_KeInsertQueueApc
f8bdf49c ff2508f5bdf8 jmp dword ptr ds:[0F8BDF508h]
f8bdf4a2 cc int 3
f8bdf4a3 cc int 3
f8bdf4a4 cc int 3
f8bdf4a5 cc int 3
f8bdf4a6 cc int 3
f8bdf4a7 cc int 3
f8bdf4a8 cc int 3
lkd> d f8bdf508
f8bdf508 804e6ccf 8055b000 805bc0b0 00000000
f8bdf518 00000000 00000000 00000000 4a83a094
f8bdf528 00000000 00000002 00000045 0000053c
f8bdf538 0000053c 53445352 51e405bb 41a61c50
f8bdf548 cad3efb9 6271f912 00000001 745c3a63
f8bdf558 64747365 5c327672 636a626f 775f6b68
f8bdf568 785f7078 695c3638 5c363833 74736574
f8bdf578 32767264 6264702e 00000000 00000000
804e6ccf为真实地址
能力值:
( LV12,RANK:210 )
10 楼
明白了 谢了
能力值:
( LV2,RANK:10 )
11 楼
[QUOTE=Fypher;670531]如果直接打印 KeInsertQueueApc 地址会得到你自己的程序里的一个地址,因为这是你自己声明的函数。其实你的程序会被编译成这样:
山寨_KeInsertQueueApc(){
jmp [导入表中KeInsertQueueApc的位置]
}
而直接打印 KeInsert...[/QUOTE]
快上Q
能力值:
( LV12,RANK:210 )
12 楼
那Mm函数不就没有什么意思
能力值:
( LV9,RANK:260 )
13 楼
MmXXX是找函数指针。你在导入函数的声明前面加个NTKERNELAPI,说明是导入的,就可以啦。否则编译器一开始不知道是导入的,会建个函数框架,之后发现是导入的,再加个jmp到函数体中。MmXXX就误找到这个山寨的函数了。
能力值:
( LV12,RANK:210 )
14 楼
MmXXX是找函数指针怎么是找函数指针?
Mm得到的函数地址跟 直接用(ULONG)KeInsertQueueApc是一样的,那么Mm就失业了
能力值:
( LV12,RANK:1010 )
15 楼
你们理解有误.Mm的作用是在ntos*的EAT中找到函数地址, 和自己在EAT中没什么区别, 唯一不同的是它是用
二分查找法 找的.
再者, 若直接调用导出函数,比如KeInsertQueueApc,是直接从你写的驱动的IAT中调用,而此时你的IAT可能被某些程序修改过,比如微点主动防御软件. 此时你的地址便是微点的fake_KeInsertQueueApc的地址; 而用MmGet*得到的函数地址是ntos*导出的地址, 若安全软件没有对ntos*进行EAT HOOK,那么取得的地址是正确的.
这就是区别,所以不能说 Mm无用,失业..
能力值:
( LV6,RANK:80 )
16 楼
微点会修改EXE的IAT函数地址,是他加载的时候就修改了吧,他HOOKEXEIAT做啥?请楼上指点
能力值:
( LV4,RANK:50 )
17 楼
和r3的getprocaddr函数一样
过导入表hook 过不了导出表hook
自己分析原始pe获取函数指针可以过上面的