jonny
驱动牛犊
驱动牛犊
  • 注册日期2002-02-04
  • 最后登录2002-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1672回复:4

notifyroutine连接找不到!

楼主#
更多 发布于:2002-05-02 13:50
小弟要使用KeSetSwapContextNotifyRoutine这个例程,他在ntddk.h中有声明,可是build报告说unresolved symbol .....
请问各位大侠我该包含哪个库才能连接成功?
另外,在内和模式下如何才能完成像GetProcAddress的功能?谢谢!

最新喜欢:

linwnlinwn
guard2002
驱动中牛
驱动中牛
  • 注册日期2002-05-21
  • 最后登录2017-03-07
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望65点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-06-24 15:17
pjf的回答和NT Native API的Example B.2有异曲同工之妙
好!
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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吧,看看它有何额外处理,我觉得照它做不会有问题的吧?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于: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方式.


pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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就是你想要的
游客

返回顶部