首页
社区
课程
招聘
[旧帖] 内核编程中RtlCopyMemory函数用windbg无法单步步入调试? 0.00雪花
发表于: 2010-8-17 23:37 8757

[旧帖] 内核编程中RtlCopyMemory函数用windbg无法单步步入调试? 0.00雪花

2010-8-17 23:37
8757
内核编程中RtlCopyMemory函数用windbg无法单步步入调试?
但是RtlMoveMemory却可以单步步入进到nt!memmove: 这样的空间

kd> t
nt!memmove:
80536df0 55              push    ebp
kd> t
nt!memmove+0x1:
80536df1 8bec            mov     ebp,esp
kd> t
nt!memmove+0x3:
80536df3 57              push    edi
kd> t
nt!memmove+0x4:
80536df4 56              push    esi

而RtlCopyMemory用t命令却直接跳过去了ttest!DriverEntry+0x88:到了这样的空间
走到了for循环了
(注:测试的时候内存区域重叠以及不重叠都测试了都跟不进去,什么原因?我现在想跟进去看看内存区域重叠的时候是怎样操作的为何得到  0000006789  )

kd> g
HelloWorld!
0123456789Breakpoint 1 hit
ttest!DriverEntry+0x6a:
fa0ca55a 8b45d4          mov     eax,dword ptr [ebp-2Ch]
kd> t
ttest!DriverEntry+0x88:
fa0ca578 c745fc00000000  mov     dword ptr [ebp-4],0

以下是测试程序的代码:

#include <ntddk.h>

VOID Unload(IN PDRIVER_OBJECT DriverObject)
{

           DbgPrint("frist : Our Driver is unloading...\r\n");
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
	ULONG test[10];   //定义存放数据的缓冲区
	ULONG i;          //for循环用的标志变量
	NTSTATUS status;   //定义状态变量


	#if DBG
		_asm int 3
	#endif
			DriverObject->DriverUnload = Unload;   //设置驱动卸载函数,设置此函数的目的是为了动态的卸载驱动,无需重启
            status = DbgPrint("HelloWorld!\r\n");  //输出字符串常量
			
			if(!NT_SUCCESS(status))	 //判断执行返回的状态
			{
				return status;  //返回错误状态位
			}
			for(i=0;i<10;i++)	//循环为缓冲区赋值
			{
				test[i]=i;		
				DbgPrint("%d",test[i]);	//输出缓冲区中的内容
			}

			//先用RtlMoveMemory来测试看看移动内存的结果是什么,内存区域不重叠
			//RtlMoveMemory(test+5,test,20);
			//结果是01234567890123401234

			//再用RtlMoveMemory来测试看看移动内存的结果是什么,内存区域重叠
			//RtlMoveMemory(test+1,test,20);
			//结果是01234567890012346789 

			//再用RtlCopyMemory来测试看看移动内存的结果是什么,内存区域不重叠
			RtlCopyMemory(test+5,test,20);
			//结果是01234567890123401234

			//再用RtlCopyMemory来测试看看移动内存的结果是什么,内存区域重叠
		//	RtlCopyMemory(test+1,test,2);

			//果然问题出现了  输出结果是01234567890000006789

			for(i=0;i<10;i++)
			{
				DbgPrint("%d",test[i]);	//输出缓冲区中的内容
			}





				return STATUS_SUCCESS;	//执行完毕,返回成功!
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是吧  这问题这么冷吗?  一天了没人关注啊.......
2010-8-18 21:27
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
RtlCopyMemory应该被编译成了

memcpy或者memset之类的,IDA应该能看

WinDBG我就不清楚了,我也不懂用
2010-8-19 15:47
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
被编译成了memcpy或者memset之类的 就不能跟进去嘛?也应该能跟进去啊
我是下的断点单步步入的啊
RtlMoveMemory被转成了memmove都跟进去了啊.....
我的问题是跟不进去啊....

IDA是静态分析吧  我要跟着调试啊 看看他如何操作内存的啊....
2010-8-19 21:55
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
都写得这么详细了 是没人关注这个问题还是问题太傻了?
有没有人看完帖子试过的?
2010-8-20 23:50
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
IDA自然是不能调试,但可以附加WinDBG,附加方法搜索一下就找到了,我就不细说了
2010-8-21 06:03
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
附加WINDBG和我直接用WINDBG调试有什么区别?
2010-8-21 07:03
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
WinDBG我不懂用,我是说不出有什么区别

我这边用WinDBG单步总是一步几行代码,经常那有一个call,直接被步过了,有时连显示都显示不出来

这是我的情况,不代表你和我一样,我也不知道怎么去改,或者怎么用

反正IDA一样看,跟在用OD一样,你何尝不试试IDA

也许能解决你的问题
2010-8-21 11:25
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
问题我并不知道如何用IDA去调试驱动程序...我只知道用IDA分析普通的PE文件...
2010-8-24 21:46
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
10
windbg你的单步是哪一个?F11吗?F11就是步不进去memcpy里面也没啥吧,差不多就是个rep movsb 啥啥的
2010-8-24 21:56
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
看老H的博客

http://hi.baidu.com/52hmily/blog/item/f119c7ca9584fe8dc917683a.html

注意第一步要先用IDA加载驱动文件,我这不加载调试的时候IDA老出错,不知咋滴
2010-8-25 07:00
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
windbg 单步步入用 "t"    单步步过用 "p"  运行用  "g"  

你看到我程序输出的结果吗 你不觉得奇怪吗  我就是想知道是什么原因导致那个结果的  所以想步进去...

那BLOG我看看去
2010-8-25 07:14
0
游客
登录 | 注册 方可回帖
返回
//