zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
阅读:2425回复:9

真诚请教:如何从内核回溯找到应用层对应的函数地址?

楼主#
更多 发布于:2007-05-29 20:47
我现在在IDT那里挂了一个钩子,假设情况如下:
我捕捉到了一个调用SSDT中的NtOpenFile的动作(实际上我是捕捉到了该函数的对应ID),现在我希望在这个捕捉点开始回溯,找到调用该NtOpenFile的应用层的相关地址,这个地址是独一无二的,也就是说我要的并不是ntdll.dll中对应的函数,而是继续回溯一直到最开始的时候Call某个公共库中的对应打开文件函数的那个call的地址,在我看来只有在这里这个地址才是独一无二的。
那我应该怎么回溯呢?
初步想来是不是就是一直在堆栈中往前找,不过我对函数的堆栈不是很了解,所以现在还不是很清楚过程应该是怎样的,请高手们指点!
谢谢大家!
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-05-30 10:16
补充
如上面这个图所示:
从user program.exe开始call 函数FindNextFile,所以进入了kernel32.dll中的FindNextFile函数代码部分,在这个函数中又Call了NtQueryDirectoryFile,所以就进入了ntdll.dll中的NtQueryDirectoryFile函数代码部分,通过这个函数我们陷入了内核。
而我目前的位置就是在陷入内核的IDT表中,我想在目前位置回溯找到user program.exe中call的地址,应该怎么办呢?
我知道只要对函数调用栈比较清楚的高手应该都能解决这个问题,所以请大家指点一下,我对函数调用栈不是很了解。
谢谢
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-05-30 10:52
内核和应用层不使用一个栈,你怎么回溯都不会找到应用层的说~~
为一个的可能就是拦截sysentry和int 2eh来作~
没有战争就没有进步 X3工作组 为您提供最好的军火
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-05-30 11:12
引用第2楼killvxk于2007-05-30 10:52发表的  :
内核和应用层不使用一个栈,你怎么回溯都不会找到应用层的说~~
为一个的可能就是拦截sysentry和int 2eh来作~

拦截sysenter和int 2eh不是也是在内核里面拦截么?
我就是在内核中把IDT表中的int 2eh那一项替换成我自己的函数了,这样可以回溯么?
不过你的意思是内核和应用层不是同一个栈,我其实也是这么想的 所以不知道怎么办才好
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-05-30 12:30
在NTDLL中拦截吧,一般32位的有堆栈框架的基本可以回溯到原始地址,64位的有所不同,比较麻烦。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
zjxiong7019
驱动牛犊
驱动牛犊
  • 注册日期2006-11-11
  • 最后登录2007-09-28
  • 粉丝0
  • 关注0
  • 积分560分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-30 20:06
引用第4楼wowocock于2007-05-30 12:30发表的  :
在NTDLL中拦截吧,一般32位的有堆栈框架的基本可以回溯到原始地址,64位的有所不同,比较麻烦。
是指在ntdll.dll中把需要关注的函数HOOK成自己的函数然后再回溯对吧?
在内核确实没有办法么?
linfeng1216
驱动小牛
驱动小牛
  • 注册日期2004-03-10
  • 最后登录2008-12-31
  • 粉丝0
  • 关注0
  • 积分818分
  • 威望89点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-06-11 12:25
关注,我也想知道这个问题。
这件事很难
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
7楼#
发布于:2007-06-11 13:39
引用第5楼zjxiong7019于2007-05-30 20:06发表的  :
是指在ntdll.dll中把需要关注的函数HOOK成自己的函数然后再回溯对吧?
在内核确实没有办法么?


...有,就看你有多胆了~
没有战争就没有进步 X3工作组 为您提供最好的军火
zzzevazzz
驱动小牛
驱动小牛
  • 注册日期2002-12-27
  • 最后登录2020-06-29
  • 粉丝0
  • 关注0
  • 积分1008分
  • 威望242点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2007-06-11 13:50
先搞清楚从ring3到ring0时,现场是如何保存的。
再看看源码里KiGetUserModeStackAddress的实现。
应该就知道怎么搞了。
[b][url]http://hi.baidu.com/zzzevazzz[/url][/b]
GoodOnline
驱动小牛
驱动小牛
  • 注册日期2007-04-11
  • 最后登录2009-02-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望204点
  • 贡献值0点
  • 好评度191点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-06-12 10:03
引用第8楼zzzevazzz于2007-06-11 13:50发表的  :
先搞清楚从ring3到ring0时,现场是如何保存的。
再看看源码里KiGetUserModeStackAddress的实现。
应该就知道怎么搞了。


楼上的是一个比较好的思路.

在x86下windows的一个用户线程都有2个堆栈(内核的线程就1个),从R3到 R0或者回来要经过堆栈的切换,但是线程的信息是不会改变的,例如ID。 所以后者你可以做2个hook,用户层和内核层的,然后通过ID或其他信息进行比较了。
游客

返回顶部