首页
社区
课程
招聘
[求助][已解决]一用到EBX寄存器,在启动驱动服务时候就蓝屏幕,求解
发表于: 2011-1-3 00:54 5829

[求助][已解决]一用到EBX寄存器,在启动驱动服务时候就蓝屏幕,求解

2011-1-3 00:54
5829
本机      :Windows7
测试环境:虚拟机WinXP
就是简单的代码:
.386
.model flat, stdcall
option casemap:none

include Strings.mac
include w2k\ntstatus.inc
include w2k\ntddk.inc
include w2k\ntoskrnl.inc

includelib ntoskrnl.lib
includelib ntdll.lib

;************************************************************************************
;函数定义
DriverEntry proto pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING	
DirverUnload proto pDriverObject:PDRIVER_OBJECT
;************************************************************************************

.data
	ucstShow	UNICODE_STRING	<?>
	szShowLoad		db			"The Dirver has been loaded!",NULL
	szShowUnLoad	db			"The Driver has been Unloaded!",NULL
	dwShow			dd			1990h

.code
DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
	invoke DbgPrint,addr szShowLoad
	invoke DbgPrint,$CTA0("This is the first debug Information.")
	invoke DbgPrint,$CTA0("%s"),$CTA0("This is the second debug Information.")
	invoke DbgPrint,$CTA0("%ws"),$CTW0("This is the third debug Information.")
	invoke DbgPrint,$CTA0("%S"),$CTW0("This is the forth debug Information.")

	invoke RtlInitUnicodeString,addr ucstShow,$CTW0("This is the fifth debug Information.")
	invoke DbgPrint,$CTA0("%wZ"),addr ucstShow

	invoke RtlInitUnicodeString,addr ucstShow,$CTW0("hello,I was born in")
	invoke DbgPrint,$CTA0("%wZ %x"),addr ucstShow,dwShow

	;以下地方使用EBX就会蓝屏
	assume ebx:ptr DRIVER_OBJECT
	mov ebx,[pDriverObject]								
	mov [ebx].DriverUnload,offset DriverUnload
	mov eax,STATUS_SUCCESS
    ret
DriverEntry endp

DriverUnload proc pDriverObject:PDRIVER_OBJECT
	invoke DbgPrint,$CTA0("%s"),addr szShowUnLoad
	mov eax,STATUS_SUCCESS
	ret
DriverUnload endp

end DriverEntry


函数返回后是否有什么地方用到EBX呢?,为什么需要保护EBX呢?

蓝屏信息如下:

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
你可以windbg挂上去看看~
2011-1-3 03:23
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
要自己先保存ebx的值……调用约定的问题~
2011-1-3 08:18
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
4
只有这种情况会出现问题吗?在使用寄存器方面有什么要注意的吗?
或者有什么是一定要保护的~~,有点迷茫~
2011-1-3 14:16
0
雪    币: 258
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
push ebx
    ****
    ****
pop ebx
2011-1-4 16:46
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
保护现场
2011-1-5 23:43
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
esi,edi,ebx,ebp
这几个寄存器一定不能改变
既然你用汇编,建议的做法是定义一个返回值的变量,然后用pushad/popad,示例:
local   dwRet

pushad
mov dwRet,0C0000001h      ;默认返回值

......
......
.if xxxx
    mov dwRet,0                    ;返回成功
.endif

popad
mov eax,dwRet
ret
2011-1-6 09:23
0
雪    币: 216
活跃值: (144)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
8
感谢天杀兄~
2011-1-6 18:54
0
游客
登录 | 注册 方可回帖
返回
//