约有 74 项符合查询结果, 以下是第 6 - 8项。
费时 < 1 秒。
多谢王老师的详细解答!还得加强基本功呀!
请教一下需要从哪些方面入手来加强基础更有效?
Posted in Windows内核调试
by
zyq8709
on 2011-06-17
是否是sysenter不能在ring0下执行?intel手册上媒体到这一点呀!就算它不行,那用int 2e不也是一样的吗?int指令不是任何级别都可调用吗?
Posted in Windows内核调试
by
zyq8709
on 2011-06-16
你没理解我的问题。
代码已经写在上边了,如果在驱动Ring0中回调一个不含API的过程是没有问题的,关键是为何不能回调含有API的过程,发生这一问题的实质原因是什么,导致调用失败的API中的判定代码是哪些,它是如何判定调用非法的呢?我先看过了通过PreviousMode进行参数地址空间越界检查是不会进行的,因为PreviousMode为KernelMode,那么它又是如何判定调用非法而导致失败的呢?
Posted in Windows内核调试
by
zyq8709
on 2011-06-16
你给出的答案我都知道,比较简略。
详细的说一下我的疑问,牵扯到编译连接和载入的详细过程。
关于全局变量初始化的问题:
已初始化的全局变量是放在.data段中的,以汇编的方式就是 变量 dd 数值,那么一般的如果类似于int a=0;
那么就是 a dd 0h,那么关键这是一个导入函数,准确说f的值是本PE文件导入段中的一个函数指针,汇编的形式就是一个存储空间类似于[XXXXXXXX],那么编译器在编译时如何处理呢,根据汇编的规则是不可能出现这样的形式的:d dd ...
Posted in Windows内核调试
by
zyq8709
on 2011-06-16
代码:
typedef void (*F)();
extern void f();
F d=f;
void main()
{
F l=f;
}
其中void f()为一个普通dll导出的函数。
1、请问d的值在编译时如何计算并确定,即在该程序载入之前的静态值是如何计算出来的?
2、l的值经过我的观察并非初始化为导入表中的相对应的地址,而是赋给了0x00000001类似的值,并在载入时进行修改。这是怎么的一个过程?是重定位吗?但是又不对应PE文件中重定位表中表项的定义?请问这到底是怎样的一个过程?
Posted in Windows内核调试
by
zyq8709
on 2011-06-15
我在应用程序中写了一个函数并将它回调给内核驱动,并让内核驱动调用它,而应用程序中的这个函数又调用一个win32 api。开始我用的是MessageBoxW,运行后没有出现消息框,跟踪调试发现他的视线比较复杂,于是换成了CreateFileW,运行发现并未创建任何文件。但是跟踪时发现,CreateFileW执行时系统及记录他的Previous_Mode为KernelMode,所以关于对UserMode时的参数检查全部忽略,并且跟踪执行过程中并未报错和出现异常,一切都正常执行,但就是没有出现想要的结果。书上都说驱动无论是显式还是隐式都不能调用Ring 3下的api。
请问为何驱动无论是显式还是隐式都不能调用Ring ...
Posted in Windows内核调试
by
zyq8709
on 2011-06-14
如果使用NtReadFile读取采用缓冲模式的设备时,最终在isr或Dpc例程中完成了该Irp,即调用IoCompleteRequest。那么在IoCompleteRequest内部将会把系统空间数据复制到用户地址空间。这里就有一个问题,由于isr或Dpc例程属于任意上下文,那么当他们执行时,用户地址空间的映射已有可能改变,那么他们进行复制时能否将数据复制到正确的用户空间缓冲区?
这种情况在鼠标键盘驱动中经常出现,他们是如何保证地址正确的呢?
Posted in Windows内核调试
by
zyq8709
on 2011-06-05
在内核态下用PsCreateSystemThread创建新线程,是不是无论创建的是用户还是系统线程,新线程的当前特权级CPL都是Ring0?
那么要是新线程执行的是用户空间代码也是在Ring0下执行的了,这样是否允许?
Posted in Windows内核调试
by
zyq8709
on 2011-05-31