- 1、本文档共22页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
获取进程完整路径方法小结
获取进程完整路径方法小结
By Anglekiss 2011 年 2 月 9 日星期三
最近在做一个主动防御项目,少不了要拦截进程创建.拦截进程创建的方法在这里就不多
说了,免得跑题(其实也就是各种 Hook 的运用).拦截到进程创建后,需要获得进程对应的可执
行文件完整路径, 因为只有进一步分析可执行文件,才能获得更多信息来判断该进程的好坏.
于是有了本文的产生.
很多人对于获取进程的完整路径可能不屑一顾. 以前写过的代码中确实也遇到过,利用
google 几分钟内,你会得到几个Api,例如:GetModuleFileNameEx,GetProcessImageFileName 等.
但对于 Ring3 层提供的 Api,Windows 内核层做了什么,又有多少人很明确的知道?杀毒软件与
病毒木马一直玩着猫和老鼠的游戏,病毒木马稍作手脚,Ring3 获取进程完整路径时就会失败.
只有我们知道这些Api 的本质,才能以不变应万变.下面将从 Windows 内核层分析这些Api 的
本质,并提供几种获取进程完整路径及防止别人获取进程完整路径的方法.
一. 进程内核数据结构中与路径信息相关位置
_EPROCESS-_SE_AUDIT_PROCESS_CREATION_INFO-_OBJECT_NAME_INF
ORMATION
从 上 面 的 截 图 可 以 看 到 , 在 进 程 内 核 对 象 EPROCESS 偏 移 0x1f4 处 存 放 着
_SE_AUDIT_PROCESS_CREATION_INFO 结 构 的 指 针 , 该 指 针 处 又 存 放 着
_OBJECT_NAME_INFORMATION 结构的指针,而该结构中存放着该进程的 NT 式文件路径.
_EPROCESS-_SECTION_OBJECT-_SEGMENT_OBJECT-_CONTROL_AREA-
_FILE_OBJECT:
从上面的截图可以看到进程内核对象偏移 0x138 处存放着指向_SECTION_OBJECT 结构的
指针,而该结构的 0x14 处存放着_SEGMENT_OBJECT 结构指针,_SEGMENT_OBJECT 结构
偏移 0x0 处是_CONTROL_AREA 结构的指针,该结构偏移 0x24 处是_FILE_OBJECT 结构的
指针,利用该结构的_DEVICE_OBJECT,FileName 两个成员和 RtlVolumeDeviceToDosName 函
数可以获取进程文件的 DOS 完整路径
_PEB-_PEB_LDR_DATA-_LDR_DATA_TABLE_ENTRY:
可以看到_PEB 偏移 0xc 处是_PEB_LDR_DATA 数据结构 , 该结构偏移 0xc 处是
_LDR_DATA_TABLE_ENTRY 数据结构.但是需要注意的是,上面的成员获取必须在对应进
程的上下文.
_PEB-_RTL_USER_PROCESS_PARAMETERS:
同样是_PEB 结构,偏移 0x10 处是_RTL_USER_PROCESS_PARAMETERS 结构.同样需要在
目标进程的上下文空间.
上面就是进程内核对象中存放路径的相关位置,当然也许还有其他地方,麻烦知道的大牛
告诉我,谢谢!
二. 微软提供的获取进程路径相关函数分析
1. GetProcessImageFileName 函数:
DWORD GetProcessImageFileName(
HANDLE hProcess ,//目标进程句柄
LPTSTR lpImageFileName ,//提供的空间 ,用于保存获取到的进程路径
DWORD nSize//空间大小
);//返回实际路径长度
上面的函数获取的进程可执行文件 NT 式完整路径. 从前面的分析中我们可以看到,
_EPROCESS-_SE_AUDIT_PROCESS_CREATION_INFO-_OBJECT_NAME_INFORMATI
ON 该处存放的就是 NT 式完整路径.我们来验证下:
0:000 uf PSAPI!GetProcessImageFileNameA
PSAPI!GetProcessImageFileNameA:
76bc3dbd 8b
文档评论(0)