阅读:1670回复:4
notifyroutine连接找不到!
小弟要使用KeSetSwapContextNotifyRoutine这个例程,他在ntddk.h中有声明,可是build报告说unresolved symbol .....
请问各位大侠我该包含哪个库才能连接成功? 另外,在内和模式下如何才能完成像GetProcAddress的功能?谢谢! |
|
最新喜欢:![]() |
沙发#
发布于:2002-05-02 17:13
KeSetSwapContextNotifyRoutine就是由ntoskrnl.exe导出,有ntoskrnl.lib就行了。你不行的原因可能是申明原型有问题,加上NTAPI试一下。
至于GetProcAddress举个例子: PVOID FindNtoskrnl() { ULONG n; ZwQuerySystemInformation(SystemModuleInformation,&n,0,&n); PULONG q =PULONG(ExAllocatePool(PagedPool,n)); ZwQuerySystemInformation(SystemModuleInformation,q,n *sizeof *q,0); PSYSTEM_MODULE_INFORMATION p=PSYSTEM_MODULE_INFORMATION(q +1); PVOID ntoskrnl=0; for (ULONG i =0;i <*q;i++) if (_stricmp(p.ImageName +p.ModuleNameOffset,\"ntoskrnl.exe\")==0) ntoskrnl =p .Base; ExFreePool(q); return ntoskrnl; } PVOID FindFunc(PVOID Base,PCSTR Name) { PIMAGE_DOS_HEADER dos =PIMAGE_DOS_HEADER(Base); PIMAGE_NT_HEADERS nt =PIMAGE_NT_HEADERS(PCHAR(Base)+dos->e_lfanew); PIMAGE_DATA_DIRECTORY expdir=nt->OptionalHeader.DataDirectory +IMAGE_DIRECTORY_ENTRY_EXPORT; ULONG size =expdir->Size; ULONG addr =expdir->VirtualAddress; PIMAGE_EXPORT_DIRECTORY exports=PIMAGE_EXPORT_DIRECTORY(PCHAR(Base)+addr); PULONG functions =PULONG(PCHAR(Base)+exports->AddressOfFunctions); PSHORT ordinals =PSHORT(PCHAR(Base)+exports->AddressOfNameOrdinals); PULONG names =PULONG(PCHAR(Base)+exports->AddressOfNames); PVOID func =0; for (ULONG i =0;i< exports->NumberOfNames;i++){ ULONG ord =ordinals [i ]; if (functions[ord]<addr || functions[ord] >=addr +size){ if (strcmp(PSTR(PCHAR(Base)+names),Name)==0) func =PCHAR(Base)+functions[ord]; } } return func; } FindFunc就是你想要的 |
|
板凳#
发布于:2002-05-02 17:41
pjf的回答.
相当精彩. 以前遇到同样的问题,没耐心干下去, 就想办法绕了. 用你的方法再来试试看. 顺便问个稍微深一点的问题. 在2K下, 比如我实现自己的ZwReadVirtualMemory, 我按照下面的方法做, 可以有效成功. (代码本身当然和系统实现一样) _asm{ lea eax, mycall mov ZwReadVirtualMemory, eax; jmp realstart mycall: mov eax, 0xa4 lea edx, [esp+0x4] int 0x2e ret; } 这个东西工作正常, 并且有效. 在XP下,INT 2E没有了, 使用SYSENTER. _asm{ lea eax, mycall mov ZwReadVirtualMemory, eax; jmp realstart mycall: mov eax, 000000BA lea 7FFE0300 call edx ret; } 而7FFE0300的实效代码不过是个SYSENTER. 这样被初始化的ZwReadVirtualMemory一旦被调用,就一定失败. 不明白的是原因? 用pjf的方法自己定位,当然也就迎刃而解,但为何XP下失败?想确定原因. 具体为什么要做这种事情, 原因很简单, 一个文件系统DRIVER不能依赖于NTDLL.DLL. 而ZwReadVirtualMemory却在NTDLL中. 具体RET 还是0X14不要认真, 我声明ZwReadVirtualMemory用的不是NTAPI, 使用的是CDCEL方式. |
|
地板#
发布于:2002-05-02 21:49
FindFunc虽然常常用,不过最早是Gary Nebbett说的,可不是我的方法,呵呵。
2000下ntoskrnl.exe导出的Zw*函数也是用int2E实现的,我们的确可简单照办。不巧我的系统是2000,没XP,凭空猜猜吧:估计整个系统调用的体系架构不会变,所需变动的是将KiSystemService的地址存于MSR中,应保存返回的地址(多半在寄存器?),其余的查SSDT、SSPT再CALL应该不会更动了。在2000中即可从ntdll中找到SeviceID再利用int2E,用可直接从SeviceTable中找到服务地址模仿KiSystemService直接CALL之;看来在XP中仅可采用后者(照windows的描述符表设置似乎sysexit仅能返回至Ring3代码,除非人为修改),你似乎用的就是这方法吧。我猜XP系统调用的流程就这样,你跟踪一下XP下的KiSystemService吧,看看它有何额外处理,我觉得照它做不会有问题的吧? |
|
地下室#
发布于:2002-06-24 15:17
pjf的回答和NT Native API的Example B.2有异曲同工之妙
好! |
|