driver2008++
驱动牛犊
驱动牛犊
  • 注册日期2007-10-30
  • 最后登录2007-12-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:3619回复:29

整样得到一个函数调用所在线程所对应的模块的地址?

楼主#
更多 发布于:2007-11-05 03:08
一个线程调用了一个函数,我现在想知道这个线程的起始地址,也就是对应的模块的地址?
就是实现 IEXPLORER 中的线程的详细信息的功能!
我得到了线程的ID,TEB
得到了TEB 的TIB结构
typedef struct _NT_TIB
{
     PEXCEPTION_REGISTRATION_RECORD ExceptionList;
     PVOID StackBase;
     PVOID StackLimit;
     PVOID SubSystemTib;
     union
     {
          PVOID FiberData;
          ULONG Version;
     };
     PVOID ArbitraryUserPointer;
     PNT_TIB Self;
} NT_TIB, *PNT_TIB;
我得到了StackBase 这个地址和模块的起始地址有啥关系呢?
还有就是通过ETHREAD 结构能得到线程对应的模块信息吗?
奇怪IEXPLORER就`为何能求出来呢?
驱网无线,快乐无限
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-11-05 08:58
地址查询ZwQueryVirtualMemory
很轻松~~
没有战争就没有进步 X3工作组 为您提供最好的军火
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-11-05 12:19
驱动开发者 呵呵
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-11-05 13:26
引用第2楼WQXNETQIQI于2007-11-05 12:19发表的  :
得到线程起始地址见:
http://hi.baidu.com/mj0011/blog/item/a0517609851efccc3bc763f2.html



这个办法用处不大,因为可以set,ws的线程可以一运行就set成别的值

细节楼主可以参考大牛Nebbett  99年出版的NT/2000 Native API Reference
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2007-11-05 13:48
猥亵的话,什么地址也可以set,只是一个start address而已,对运行又没有影响
微软的tlist就是用这个方法的~标准做法~
驱动开发者 呵呵
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-05 14:01
对,标准做法
这玩意儿不好就因为不用什么驱动什么权限随便自由set,依赖这个值做事心是悬着的
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-11-05 15:20
不解,这个模块调用这个函数一定会创建一个新线程吗?如果是枚举线程,那么你如何知道在这个线程里一定调用了这个函数,如果不是枚举线程,而是拦截函数,该函数的调用堆栈里面不是已经保存了这个函数返回线程后的地址吗?根据各个模块加载的基地址和模块大小,通过比较,推断是那个模块调用这个函数应该不困难吧。不知道楼主的用意是什么?是为了查证一个http请求是那个dll发出的?
如果是在tdi里面做,别忘交流一下,我也想知道一个tcp包究竟是那个模块发出的。
driver2008++
驱动牛犊
驱动牛犊
  • 注册日期2007-10-30
  • 最后登录2007-12-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-05 15:39
谢谢大家的回复!

要分的话再一起给大家把!

"不知道楼主的用意是什么?是为了查证一个http请求是那个dll发出的?" 就是这样的要求

我需要的是在驱动里,知道当前操作的IRP是由应用程序的哪个模快调用的,最好能知道是当前是调用哪个函数!
譬如在TDI FILTER DRIVER 在tdi_connect 中我用 PsGetCurrentThread() 得到当前线程的句柄,这个句柄也是 TEB  的结构
在 TEB 的结构中我得到了 TIB  的结构 TIB 中有 线程堆栈的地址 我现在也把进程的模块地址 大小
线程ID  线程堆栈的地址 都得到了 但还是找不到线程起始地址和模块地址的对应关系

线程的 ETHREAD  和 KTHREAD 结构里有些信息 不知道能不能找出和模块的对应关系呢?
驱网无线,快乐无限
zjan521
驱动牛犊
驱动牛犊
  • 注册日期2002-10-02
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望91点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-05 21:30
先者为王
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2007-11-05 23:36
不想被改掉起始地址,很简单,hook create thread,或者用CreateThreadNotifyRoutine~
不过根本就没必要~
驱动开发者 呵呵
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-11-06 11:07
引用第7楼driver2008++于2007-11-05 15:39发表的  :
谢谢大家的回复!

要分的话再一起给大家把!

"不知道楼主的用意是什么?是为了查证一个http请求是那个dll发出的?" 就是这样的要求
.......

也需要了解这部分的内容,先琢磨一下,楼主有什么进展和收获,贡献一把,也给咱学习学习
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
11楼#
发布于:2007-11-06 13:32
哦弥陀佛~这个目的太明显,显然我看到了猥琐的xxx的影子~
把拦截做在ZwXXXX用CallStack 大法获得ring3的stackcall,然后分析一下最初搞WSAXXX或者xxx的地址是那个模块~
哦弥陀佛~
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
12楼#
发布于:2007-11-06 13:37
因为xxx是我的一个重要的xxx,所以有关xxx的很具体的xxx,我只能以xxxx形式说明~
只能说楼主仔细看看ETHREAD结构和KXXX结构(不是KTHREAD)中的Context地方~
没有战争就没有进步 X3工作组 为您提供最好的军火
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2007-11-06 13:53
xxx大仙又发威了~
驱动开发者 呵呵
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-11-06 14:30
引用第11楼killvxk于2007-11-06 13:32发表的  :
哦弥陀佛~这个目的太明显,显然我看到了猥琐的xxx的影子~
把拦截做在ZwXXXX用CallStack 大法获得ring3的stackcall,然后分析一下最初搞WSAXXX或者xxx的地址是那个模块~
哦弥陀佛~

 sysenter ->call statck
从ntdll->ntoskrnl.exe
是一个分水岭,同一个世界,同一个梦想!
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
15楼#
发布于:2007-11-06 15:04
KiXXX处确实可以获得ZwXXXX的ring3 CallStack的说~
没有战争就没有进步 X3工作组 为您提供最好的军火
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-11-06 16:36
没人回复,内容清空
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-11-06 16:44
没人回复,内容清空
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
18楼#
发布于:2007-11-09 23:42
hook中过滤ZwDeviceIoControlFile的callid,然后走ring3ESP,走之前检查是否是ring3 call syscall,都说到这份上了~~

其实tdi_connect中也可以做另外的文章~~哦弥陀佛~~


无人回复么
没有战争就没有进步 X3工作组 为您提供最好的军火
guaiguaiguan
驱动中牛
驱动中牛
  • 注册日期2003-10-11
  • 最后登录2011-01-12
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望556点
  • 贡献值0点
  • 好评度490点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-11-21 10:32
按照本人的笨脑瓜理解是:
每一个tdi请求,通过调用堆栈回溯,可以发现其最终都是通过调用ZwDeviceIoControlFile函数实现的。不知道上面提到的callid是何物?不过每一个调用都会对应一个IoControlCode和pid。至于后面的“然后走ring3ESP,走之前检查是否是ring3 call syscall,都说到这份上了~~”,仍然没明白。一个sysenter指令把ring3的调用堆栈和ring0的调用堆栈截然分开,井水不犯河水。不知道你怎么走ring3ESP,走之前检查是否是ring3 call syscall。
killvxk如果怕泄露军机,不妨给我发个小窗,让我明白明白
上一页
游客

返回顶部