- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
项目工程类经典参考学习文献
项目工程类经典参考学习文献
标题:【总结】获取内核ntoskrnl.exe基地址的几种常见办法
作者:combojiang
时间:2008-01-17,09:38
链接::showthread.php?t=58447
如果大家写过shellcode一定还记得,shellcode中开头要找kernel32.dll模块的内存加载地址。
同样,如果大家要写一个内核的类似东东的话,第一步也是要找出ntoskrnl.exe模块的内存加载位置。有三种常见办法在这里咱们大体描述下:
1。利用ZwQuerySystemInformation?来检索加载的模块,从加载模块里面搜索出ntoskrnl.exe模块。例子如::showthread.php?t=58199
在开头部分就是利用ZwQuerySystemInformation?来检所ntoskrnl.exe模块的内存加载位置。
2。通过驱动DriverEntry函数的第一个参数,即DriverObject。在DriverObject结构体中有一项
???DriverSection成员指向LDR_DATA_TABLE_ENTRY结构,通过遍历这张表得到ntoskrnl的基址和大小。例子如::showthread.php?t=56042
3。通过驱动DriverEntry函数的返回地址,根据系统布局图,如下:
??
?因此,我们可以在开始的位置搜索ntosknrl。我们的驱动程序就是加载在系统布局图到a0000000h的区间中。
完整代码如下:
.386
.model?flat,?stdcall
option?casemap:none
include?GetKernelBase.inc
.code
GetKernelBase?proc?uses?esi?edi?ebx?dwSomewhereInKernel:DWORD
??xor?edi,?edi??????;?assume?error
??mov?eax,?MmSystemRangeStart
??mov?eax,?[eax]
??mov?eax,?[eax]??????????????????;?eax?=
;??#define?PAGE_SHIFT??????12
;??#define?PAGE_SIZE???????(1UL??PAGE_SHIFT)??4k为单位
??.if?dwSomewhereInKernel?=?eax
????mov?esi,?dwSomewhereInKernel
????and?esi,?not?(PAGE_SIZE-1)??????;?start?down-search?from?here
????mov?ebx,?esi
????sub?ebx,?eax??????????;?????-?MmSystemRangeStart
????shr?ebx,?PAGE_SHIFT????????;?Number?of?pages?to?search
????.while?ebx
??????invoke?MmIsAddressValid,?esi
??????.break?.if?al?==?FALSE???????;?bad
??????mov?eax,?[esi]
??????.if?eax?==?00905A4Dh??????;?MZ?signature
????????mov?edi,?esi
????????.break
??????.endif
??????sub?esi,?PAGE_SIZE????????;?next?page?down
??????dec?ebx????????????;?next?page
????.endw
??.endif
??mov?eax,?edi
??ret
GetKernelBase?endp
DriverEntry?proc?pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
????????lea?ecx,?[ebp][4]??????;?得到DriverEntry返回地址
??push?ecx
??invoke?MmIsAddressValid,?ecx
??pop?ecx
??.if?al
????mov?ecx,?[ecx]??????????;?Get?return?address?from?stack
????invoke?GetKernelBase,?ecx
????.if?eax?!=?0
??????invoke?Dbg
原创力文档


文档评论(0)