[旧帖]
内核编程中RtlCopyMemory函数用windbg无法单步步入调试?
0.00雪花
发表于:
2010-8-17 23:37
8757
[旧帖] 内核编程中RtlCopyMemory函数用windbg无法单步步入调试?
0.00雪花
内核编程中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直播授课