阅读:2425回复:9
真诚请教:如何从内核回溯找到应用层对应的函数地址?
我现在在IDT那里挂了一个钩子,假设情况如下:
我捕捉到了一个调用SSDT中的NtOpenFile的动作(实际上我是捕捉到了该函数的对应ID),现在我希望在这个捕捉点开始回溯,找到调用该NtOpenFile的应用层的相关地址,这个地址是独一无二的,也就是说我要的并不是ntdll.dll中对应的函数,而是继续回溯一直到最开始的时候Call某个公共库中的对应打开文件函数的那个call的地址,在我看来只有在这里这个地址才是独一无二的。 那我应该怎么回溯呢? 初步想来是不是就是一直在堆栈中往前找,不过我对函数的堆栈不是很了解,所以现在还不是很清楚过程应该是怎样的,请高手们指点! 谢谢大家! |
|
沙发#
发布于:2007-05-30 10:16
补充
如上面这个图所示:从user program.exe开始call 函数FindNextFile,所以进入了kernel32.dll中的FindNextFile函数代码部分,在这个函数中又Call了NtQueryDirectoryFile,所以就进入了ntdll.dll中的NtQueryDirectoryFile函数代码部分,通过这个函数我们陷入了内核。 而我目前的位置就是在陷入内核的IDT表中,我想在目前位置回溯找到user program.exe中call的地址,应该怎么办呢? 我知道只要对函数调用栈比较清楚的高手应该都能解决这个问题,所以请大家指点一下,我对函数调用栈不是很了解。 谢谢 |
|
板凳#
发布于:2007-05-30 10:52
内核和应用层不使用一个栈,你怎么回溯都不会找到应用层的说~~
为一个的可能就是拦截sysentry和int 2eh来作~ |
|
|
地板#
发布于:2007-05-30 11:12
引用第2楼killvxk于2007-05-30 10:52发表的 : 拦截sysenter和int 2eh不是也是在内核里面拦截么? 我就是在内核中把IDT表中的int 2eh那一项替换成我自己的函数了,这样可以回溯么? 不过你的意思是内核和应用层不是同一个栈,我其实也是这么想的 所以不知道怎么办才好 |
|
地下室#
发布于:2007-05-30 12:30
在NTDLL中拦截吧,一般32位的有堆栈框架的基本可以回溯到原始地址,64位的有所不同,比较麻烦。
|
|
|
5楼#
发布于:2007-05-30 20:06
引用第4楼wowocock于2007-05-30 12:30发表的 :是指在ntdll.dll中把需要关注的函数HOOK成自己的函数然后再回溯对吧? 在内核确实没有办法么? |
|
6楼#
发布于:2007-06-11 12:25
关注,我也想知道这个问题。
|
|
|
7楼#
发布于:2007-06-11 13:39
引用第5楼zjxiong7019于2007-05-30 20:06发表的 : ...有,就看你有多胆了~ |
|
|
8楼#
发布于:2007-06-11 13:50
先搞清楚从ring3到ring0时,现场是如何保存的。
再看看源码里KiGetUserModeStackAddress的实现。 应该就知道怎么搞了。 |
|
|
9楼#
发布于:2007-06-12 10:03
引用第8楼zzzevazzz于2007-06-11 13:50发表的 : 楼上的是一个比较好的思路. 在x86下windows的一个用户线程都有2个堆栈(内核的线程就1个),从R3到 R0或者回来要经过堆栈的切换,但是线程的信息是不会改变的,例如ID。 所以后者你可以做2个hook,用户层和内核层的,然后通过ID或其他信息进行比较了。 |
|