总结一下由对象名得到对象地址的方法
来源:互联网 发布:网络危机公关处理案例 编辑:程序博客网 时间:2024/05/29 04:33
总结一下由对象名得到对象地址的方法
by flyingkisser 06.11.26
Dedicated to my mm,it's been 3 years,thanks
方法一、ObReferenceObjectByName
声明:
NTKERNELAPI
NTSTATUS
ObReferenceObjectByName(
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
);
参数说明:
1.名称的UNICODE_STRING结构的地址
2.对象属性,如OBJ_CASE_INSENSITIVE
3. 一般设置为0
4.访问属性,如:GENERIC_READ GENERIC_WRITE
5.对象类型,是内核导出的变量,通过windbg我找到了这些:
IoControllerObjectType 805519ec
IoDriverObjectType 805519e0
IoFileObjectType 805519d8
IoDeviceHandlerObjectType 805519dc
IoDeviceObjectType 805519e4
IoAdapterObjectType 805519f0
IoCompletionObjectType 805519e8
后面的地址是这些变量的地址,实际调用时用此地址处的值进行调用
6. 常量KernelMode
7.一般设置为0
8.用于接收返回对象地址的变量的地址
如:
mov ecx,IoDriverObjectType
mov ecx,dword ptr [ecx]
mov ecx,dword ptr [ecx]
invoke ObReferenceObjectByName,addr szDevLow,OBJ_CASE_INSENSITIVE,0,0,/
ecx,KernelMode,0,addr @lpDevObj
补充:并不是所有类型的对象都能正常返回,像Device类型的对象,就不能用这个函数来得到其对象
方法二、ObOpenObjectByName()-->ObReferenceObjectByHandle()
声明:
NTKERNELAPI
NTSTATUS
ObOpenObjectByName(
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN OUT PVOID ParseContext OPTIONAL,
OUT PHANDLE Handle
);
参数说明
1.OBJECT_ATTRIBUTES类型的结构体的地址
2.见ObReferenceObjectByName参数5的说明,这里我发现设置0也能正常返回
3.常量KernelMode
4.一般设置为0
5.期望获得的权限,如GENERIC_READ GENERIC_WRITE
6.一般设置为0
7.用来接收返回句柄的变量的地址
如: mov eax,_lpObjName
mov @stOA.ObjectName,eax
mov @stOA._Length,sizeof OBJECT_ATTRIBUTES
mov @stOA.Attributes,OBJ_CASE_INSENSITIVE
invoke ObOpenObjectByName,addr @stOA,0,KernelMode,0,GENERIC_READ or GENERIC_WRITE,0,addr @hObj
.if !eax
;打开成功,得到句柄,下面找到对象地址
invoke ObReferenceObjectByHandle,@hObj,0,0,KernelMode,addr @lpObj,0
;--句柄不要了,关掉
invoke ZwClose,@hObj
.endif
和第一种方法的限制一样,并不是所有类型的对象都能正常返回,像Device类型的对象,就不能用
此方法得到其对象
方法三、ZwCreateFile()-->ObReferenceObjectByHandle()
如:
mov eax,_lpObjName
mov @stOA.ObjectName,eax
mov @stOA._Length,sizeof OBJECT_ATTRIBUTES
invoke ZwCreateFile,addr @hObj,GENERIC_WRITE,addr @stOA,addr @stISB,0,/
FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,0,0
这种方法很容易,也没什么限制,是推荐使用的
- 总结一下由对象名得到对象地址的方法
- 总结一下由对象名得到对象地址的方法
- 由String得到XML中Document对象的一种方法代码
- 由类名创建对象
- 四种得到java对象的方法
- 四种得到java对象的方法
- 根据包名,从一个activity跳到另一个activity。Intent对象通过PackageManger.getLaunchIntentForPackage的方法得到。
- 由一个url地址创建一个标准的NSURL对象
- 动态2:由类名创建对象
- 由类名创建对象(转)
- 动态2:由类名创建对象
- String对象的方法总结
- Scanner对象的方法总结
- Servlet的方法对象总结
- 在stutst2里面的action得到内置对象的方法
- 由PID得到进程名
- 如何得到浏览器 DOM 对象的所有属性和方法
- jquery 循环中得到jquery对象的 方法
- 关于一个c++程序,帮忙,运行总是有2个错误
- VC++,掀起你的盖头来——谈VC++对象模型
- Java网络聊天服务器端
- linux 开机自动运行
- nyquist曲线
- 总结一下由对象名得到对象地址的方法
- strcpy等库函数的用法
- MFC框架程序
- C++ 指针与数组的关系及运算
- 在C#程序中使用系统热键的整个过程
- Add n number of working days to date
- 关于云计算的crawler
- IE与Firefox在JavaScript上的7个不同句法
- 如何使IE的后退按钮无效