紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 12352|回复: 21

关于寻找函数地址的问题,憋了我很长时间了,请教

  [复制链接]

90

主题

563

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3261
发表于 2012-3-25 20:09:14 | 显示全部楼层 |阅读模式
请教一个问题,
就是我想查找一个函数的地址
如果这个函数是导出函数,直接用一个函数就能得到
但是如果这个函数不是导出函数
那就用特征码
但是有个问题,怎么找到那个里面含有这个函数的函数呢?
这么问,你可能有点不明白
比如说我要得到KiAttachProcess这个函数的地址
我就要查找KeAttachProcess这个函数
根据特征码从里面找到KiAttachProcess这个函数地址

你们是怎么知道应该从KeAttachProcess这个函数里面找呢?

如果我给你一个新函数,比如DbgkpSetProcessDebugObject这个函数
也是未导出函数,应该从哪个函数里面找呢?


谢谢大家

9

主题

126

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

积分
422
发表于 2012-3-25 20:42:25 | 显示全部楼层

怎么知道 KeAttachProcess 里面有 KiAttachProcess 是因为。 在WINDBG 里面 使用了那么一句 命令:

uf KeAttachProcess .

然后慢慢看 。就发现了。 KiAttachProcess

QQ截图20120325203747.png



另外。 这么声明 KeAttachProcess。 你就能使用了。
  1. NTKERNELAPI
  2. VOID
  3. KeAttachProcess (
  4.     IN PEPROCESS Process
  5. );
复制代码
对于这个 DbgkpSetProcessDebugObject。
找到一个人家写的。根据特征码查找。
  1. ULONG GetFunctionAddress
  2. (
  3. IN ULONG FirstFeature,
  4. IN ULONG SecondFeature,
  5. IN ULONG ThirdFeature,
  6. IN ULONG FourthFeature
  7. )
  8. {
  9. NTSTATUS NtStatus=STATUS_SEVERITY_SUCCESS;
  10. ULONG SystemInformationLength=0;
  11. ULONG Index=0;
  12. ULONG Loop=0;
  13. ULONG ModuleBegin=0;
  14. ULONG ModuleFinish=0;
  15. PULONG SystemInformationBuffer=NULL;
  16. PSYSTEM_MODULE_INFORMATION SystemModulePointer=NULL;
  17. ULONG Value=0;
  18. ZwQuerySystemInformation(SystemModuleInformation,NULL,0,&SystemInformationLength);
  19. SystemInformationBuffer=ExAllocatePool(PagedPool,SystemInformationLength);
  20. if (SystemInformationBuffer==NULL)
  21. {
  22.         return NtStatus;
  23. }
  24. NtStatus=ZwQuerySystemInformation
  25.                                                                 (
  26.                                                                 SystemModuleInformation,
  27.                                                                 SystemInformationBuffer,
  28.                                                                 SystemInformationLength,
  29.                                                                 NULL
  30.                                                                 );
  31. if (!NT_SUCCESS(NtStatus))
  32. {
  33.         ExFreePool(SystemInformationBuffer);
  34.         return NtStatus;
  35. }
  36. if (MmIsAddressValid(SystemInformationBuffer)==False)
  37. {
  38.         ExFreePool(SystemInformationBuffer);
  39.         return NtStatus;
  40. }
  41. SystemModulePointer=(PSYSTEM_MODULE_INFORMATION)(SystemInformationBuffer+1);
  42. for (Index=0;Index<*(ULONG*)SystemInformationBuffer;Index++)
  43. {
  44.         ModuleBegin=(ULONG)SystemModulePointer[Index].Base;
  45.         ModuleFinish=(ULONG)SystemModulePointer[Index].Base+SystemModulePointer[Index].Size;       
  46.         for (Loop=ModuleBeginAddress;Loop<ModuleFinishAddress;Loop++)
  47.         {
  48.                 if
  49.                         (
  50.                         *(ULONG*)(Loop+0)==FirstFeature&&
  51.                         *(ULONG*)(Loop+4)==SecondFeature&&
  52.                         *(ULONG*)(Loop+8)==ThirdFeature&&
  53.                         *(ULONG*)(Loop+12)==FourthFeature
  54.                         )
  55.                 {
  56.                         Value=Loop;
  57.                 }
  58.         }
  59. }
  60. ExFreePool(SystemInformationBuffer);
  61. return Value;
  62. }
复制代码

90

主题

563

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3261
 楼主| 发表于 2012-3-26 00:55:25 | 显示全部楼层
先谢谢兄弟了

但是这个特征码FirstFeature等是啥呀?

不太明白

90

主题

563

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3261
 楼主| 发表于 2012-3-26 00:57:04 | 显示全部楼层
还有,你怎么知道要知道KiAttachProcess的地址,必须查KeAttachProcess?

而不是查别的函数?

851

主题

3477

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
37093
发表于 2012-3-26 01:09:02 | 显示全部楼层
ok100fen 发表于 2012-3-26 00:57
还有,你怎么知道要知道KiAttachProcess的地址,必须查KeAttachProcess?

而不是查别的函数? ...

除非是比较新的函数,一般的什么函数调用什么函数,查WRK就行了。

用NOTEPAD++载入所有的C文件,然后按下CTRL + F。。。

9

主题

126

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

积分
422
发表于 2012-3-26 02:20:18 | 显示全部楼层
ok100fen 发表于 2012-3-26 00:57
还有,你怎么知道要知道KiAttachProcess的地址,必须查KeAttachProcess?

而不是查别的函数? ...


我敢说 除了 微软设计内核懂之外 没人懂 。KeAttachProcess 里面有 KiAttachProcess。

  好比给你个盒子。 你没打开之前你肯定不懂里面有神马。

现在大家都懂 。是因为大家 打开盒子去看了。

自己 去 u KeAttachProcess 可以看到 。  或者TA说的 。去下载WRK。

WRK。是 微软 据说为了大学生好 。放出来的内核源码。 包括NTOPENPROCESS .READ .WRITE 神马的。都现成的。

  

9

主题

126

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

积分
422
发表于 2012-3-26 02:21:45 | 显示全部楼层
ok100fen 发表于 2012-3-26 00:55
先谢谢兄弟了

但是这个特征码FirstFeature等是啥呀?

自己看下这个:
以PspExitThread为例介绍如何寻找未导出函数的函数地址

90

主题

563

帖子

2

精华

钻石会员

Rank: 6Rank: 6

积分
3261
 楼主| 发表于 2012-3-26 22:05:24 | 显示全部楼层
怎么才能 “用NOTEPAD++载入所有的C文件?”

没找到NOTEPAD++有这个功能啊?

851

主题

3477

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
37093
发表于 2012-3-27 15:40:39 | 显示全部楼层
ok100fen 发表于 2012-3-26 22:05
怎么才能 “用NOTEPAD++载入所有的C文件?”

没找到NOTEPAD++有这个功能啊?

OK大哥你真萌。。。

先搜索WRK目录下所有的C文件,然后把所有C文件拖入NOTEPAD++不就行了。。。

点评

呵呵,这方法有道理,我试一下啊  发表于 2012-3-28 21:56

47

主题

312

帖子

8

精华

核心会员

Rank: 20Rank: 20Rank: 20Rank: 20

积分
10349
发表于 2012-3-29 15:46:15 | 显示全部楼层
本帖最后由 ywledoc 于 2012-3-29 15:51 编辑

先让windbg加载符号~
然后。。。
bp KiAttachProcess(下断)
kd(看堆栈) or kvn。
看调用堆栈,加载到符号后,就会有KeAttachProcess + 0x*h类的字符出来~~~
我一般都这样做。也就是所谓的栈回溯得到函数地址~

至于 怎么加载符号 。我一般是
.reload
x 模块名!*
这样相应模块的符号就进去了。当然要先对symbol所在的目录进行设置~~

点评

这是个好办法,谢谢分享,我试一下  发表于 2012-3-30 22:27
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-3-29 06:26 , Processed in 0.030923 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表