zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1663回复:11

notifyroutine连接找不到! (续)

楼主#
更多 发布于:2002-05-10 20:35
这是

http://www.driverdevelop.com/forum/viewthread.php?tid=12387&PHPSESSID=a3e9aa6664df603ad6db2b79f93991a9

那个话题的继续.

首先感谢pjf给了一个提示性的回答.
我以次为出发点对XP进行了进一步的调试. 发现即使使用Gary Nebbett(2K NATIVE API)的做法也是一样不行.原因大约和PJF的分析相同. 就是在XP下zwProtectVirtualMemory, ZwReadVirtualMemory, ZwWriteVirtualMemory 事实上只支持RING3来的调用. 也就是说是和2K(RING3 和RING0 PASSIVE LEVEL支持)是完全不同的.估计无论做多少努力都会失败, 我想弄清一个问题就是如果RING0上没有zwProtectVirtualMemory,ZwReadVirtualMemory, ZwWriteVirtualMemory 的支持了,那么同样的技能会在什么地方?不支持VIRTUAL MEMORY无论如何也不能想象的.

以前我说过我曾饶过去这个问题, 使用方法不过就是非ORIGNAL CONTEXT的调用不再处理而已. 要求不严格的时候可以敷衍了事, 但大约不能长此下去的.

 :mad:

[编辑 -  5/11/02 by  zdhe]

最新喜欢:

flyfoxflyfox
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-05-12 15:43
in XP. for ZwReadVritualMemory, ZwWriteVirtualMemory, use KeAttachProcess seems work well in PASSIVE LEVEL.

how about ZwProtectVirtualMemory? Of course we can use asm temporary disable memory protection for a while (in LU0 page, there is simple sample), if I don\'t what to use this hard CPU level method, any idea?
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-12 22:17
不管系统调用用何种方式从Ring3进入Ring0,处理程序总会从服务表与参数表(若此二表未变)获取信息后调用服务,调服务时仍然是Ring0程序转移到Ring0程序,所以服务表中存在的服务似乎就应能在驱动中成功调用(因为总可以获取服务地址,只要明白处理程序还做了什么预处理等等)。首先可以看看XP的KiSystemService做了什么,可能是拷拷参数、做做检查等等加上什么关键的东西;再看看Ring3程序调ZwProtectVirtualMemory时进程环境怎样(可能挺麻烦)。Ring3进入Ring0时转移到ZwProtectVirtualMemory与在开始在Ring0直接转ZwProtectVirtualMemory有何区别呢?这是关键吧。我觉得似乎只应与进程虚拟空间之类的东西有关,用了KeAttachProcess再做KiSystemService的额外处理再转到ZwProtectVirtualMemory应该可行吧?
---------------------------------------------------------------------
Of course we can use asm temporary disable memory protection for a while (in LU0 page, there is simple sample), if I don\'t what to use this hard CPU level method, any idea?
----------------------------------------------------------------------
写个个人版本的KiSystemService也难满足Hard无关,其实不同CPU写不同版本也改动不多嘛。
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-05-13 00:10
可能我的写法不好吧, 老兄误解了我的说明.

for ZwReadVritualMemory, ZwWriteVirtualMemory, use KeAttachProcess seems work well in PASSIVE LEVEL.

的意思是因为我SWITCH了PROCESS CONTEXT, 我没有必要再去处理ZWREADVIRTUALMEMORY, ZWWRITEVIRTUALMEMORY了.


我找便了HAL.DLL, NTOKKERNL.EXE的没有发现老兄是否给个明示? 我倒不介意篡改一下系统的一个具体SERVICE. 只要不是直接 修改TSS, GDT, PTE就行.

有些不求甚解了,实在不行就限定处理器了.  

呵第一次问问题连怎么给分都不知道.


[编辑 -  5/13/02 by  zdhe]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-13 11:05
开始我没理解错呀,我的意思是转移到ZwProtectVirtualMemory服务例程之前或许也要SWITCH一下才行。

--------------------------------------------------
我找便了HAL.DLL, NTOKKERNL.EXE的没有发现
--------------------------------------------------
发现什么呀?是不是ZwProtectVirtualMemory的导出地址?本来它就没在HAL、NTOSKRNL导出嘛。

要得到服务例程地址可按下面步骤:
1、用Gary Nebbett的办法找出(从NTDLL.DLL中)函数服务号,其实在Ring3用GetProcAddress就行。举个例子:
NtCreateFile = (PCHAR) GetProcAddress( GetModuleHandle( _T(\"NTDLL.DLL\") ),\"NtCreateFile\" );
NtCreateFileIndex = *(PDWORD) &NtCreateFile[1];//这是在2000下的,因为2000下ntdll封装函数开始总是 Mov eax,* ,*就是服务号。XP中具体怎样得你去看看了。

2、得到ServiceDescriptorTable,大家都了解。不过若找出ServiceDescriptorShadowTable的话Gary Nebbett的办法太麻烦(当然这里没用),其实当前使用Table的地址就在ETHREAD里,比如可以:
a=(unsigned long)Irp->Tail.Overlay.Thread;
table=(ServiceDescriptorTableEntry_t*)((PULONG)a)[0xdc/4];//a[0xdc/4]就是PEThread->Tcb.ServiceDescriptorTable。

3、得出服务地址:
NtCreateFile=(NTCREATEFILE)table->ServiceTableBase[NtCreateFileIndex];

之后的就照原先说的试试吧。可能这次我才理解错你的意思了吧?呵呵
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-05-13 11:15
老兄非要我贴SOURCE吗, 你提到的所有的事情我都已经做过.
如果有时间的话,真正动手试试如何?
你想要什么版本的XP? 远东所有的版本我都有,需要的话我给你放在网上.

问题不是我找不到SERVICE的地址. 是一CALL NTDLL.DLL里EXPORT出来的SERVICE,PROCESS就不行了.



[编辑 -  5/13/02 by  zdhe]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-13 11:29
了解,不好意思拉。
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-05-13 11:43
别这么说. 不是没有办法(从PTE入手就可以),只是想找一个好的解决方法而已.

这问题确实就是有些强人所难.

我从MS的NEWS里得出一个结论, 现在的框架处理有问题,我不能也没有必要在MJ_WRITE里处理处理这种事情.

我放在
http://61.193.161.104:10080/里的东西八成害人不浅, 有时间赶紧
改掉.
呵呵 :D
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-13 13:45
是一CALL NTDLL.DLL里EXPORT出来的SERVICE,PROCESS就不行了
-----------------------------------------------------------
是不是写错啦,call了NTDLL.DLL里EXPORT出来的函数?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2002-05-13 14:03
是不是写错啦,call了NTDLL.DLL里EXPORT出来的函数

-----------------------
call了NTDLL.DLL里EXPORT出来的函数的对应的SERVICE入口. 在2K下,和你写的
NtCreateFile=(NTCREATEFILE)table->ServiceTableBase[NtCreateFileIndex];
是同样一个函数POINTER.

在XP中,结果也是一样. 我确认过取得的POINTER里面的内容.
U ADDRESS
和 U ZWPROTECTVIRTUALMEMORY一模一样.


问题不是取得SERVICE对不对的问题, 是取得后执行结果的问题.

在2K下, 执行NtProtectVirtualMemory只要IRQL正确,没问题.
在XP下, CALLER被杀.对系统其他部分没有影响.

按我的理解,SYSENTER 用来从RING3-> RING0,如果我现在就是RING0, SYSENTER产生异常,然后OS就杀我的CALLER了.

该确认的我都确认过.无论是DATA还是CODE.包括UNASM的代码. 死心了就安心使用ASM自己处理PTE,PAGE PROTECT就是.



大概的结论是在2K下,NTDLL可以在RING3 和RING0(有限制)使用,在XP下, NTDLL只提供给RING3使用.


[编辑 -  5/13/02 by  zdhe]

[编辑 -  5/13/02 by  zdhe]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-22 18:26
在2000下服务返回附近亦有sysexit,只是因ntdll中用了int2e,所以从没运行到sysexit。由此我觉得XP内核应该基本没变,采用什么形式的syscall应由ntdll使用的方式决定。所以可能XP上一样可用int2e(对没sysenter的老机器是当然的,对已在用sysenter的系统也应保留了此功能)。
好不容易找了台XP机器,试了试,似乎没问题,你再试试:
__declspec(naked)DWORD __stdcall
ZwProtectVirtualMemory(
IN HANDLE ProcessHandle,
IN OUT PVOID *BaseAddress,
IN OUT PULONG ProtectSize,
IN ULONG NewProtect,
OUT PULONG OldProtect)
{
_asm{
mov eax,089h
lea edx,[esp+4]
int 2eh
ret 14h
}
}

在驱动的dispatch例程中调上面的函数。为了在各版本都能用,服务号还是用前面说的办法获取吧。
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-05-22 21:14
首先谢谢你还记得此事。

我有另外一个贴子。值50分,你去看一看,能给些建议最好,没有头绪就随便写几个字吧。
http://www.driverdevelop.com/forum/html_13674.html?1022072880

具体int2e在xp上的实现,大概没有那么简单。
开始我说不行的时候,同样的方法是测试过的。不行才会去分析。
我错了的可能性很大。我会再次确认。

我只做过PENTium4上的确认。






[编辑 -  5/22/02 by  zdhe]
游客

返回顶部