| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1172 人关注过本帖
标题:拥有最高特权级 0后,为何还是不能访问内存空间
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:8 
拥有最高特权级 0后,为何还是不能访问内存空间
我已经把自己的应用程序由特权级 3 提升到最高特权级 0 后,为什么还是不能访问内存空间??
代码如下:VC6 下编译
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

void RaisePrivleges()
{
    HANDLE hToken;
    TOKEN_PRIVILEGES tkp;
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))
    {
        if (LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid))
        {
            AdjustTokenPrivileges(hToken,FALSE,&tkp,0x10,(PTOKEN_PRIVILEGES)NULL,0);
        }
    }
    
    if (hToken)
    {
        CloseHandle(hToken);
    }
}

int main()
{
    unsigned int var = 10;
    unsigned int *ptr1 = &var;
    unsigned int *ptr2 = (unsigned int *)0x0013ffffL;

    printf("*(0x%08x)=",ptr1);
    printf("0x%08x\n",*ptr1);
    RaisePrivleges();  // 提升进程权限 ,使特权级为 0
    printf("*(0x%08x)=",ptr2);
    printf("0x%08x\n",*ptr2);
    return 0;
}

特权级.JPG (45.09 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 特权级 访问内存 
2008-10-13 23:55
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
反汇编 ,或者动态调试, 看401179是哪条指令

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2008-10-14 01:43
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2# 你们都要疼我哦 的帖子
我 知道 就是  printf("0x%08x\n",*ptr2); 这条语句问题

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-14 16:14
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 
ring 0如果这么容易进的话,就不叫ring 0的了,这个应该只是提升系统用户的使用权限吧,如果ring0的话,所有内存是可以访问的,但我所知,ring0的话,一般要用DDK里面的函数,SDK没办法进入ring0,一般在写WDM 或者VixD程序时,权限才是ring0普通程序都是ring3,

2008-10-14 21:38
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
那 上面 这个 RaisePrivleges() 函数提升进程权限是什么意思?
参考:
Windows应用程序捆绑核心编程 张争秋 清华大学出版社 page158

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-10-15 00:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
事实上,就算你真的是提升到ring0,这个代码还是会失败的。因为程序使用的内存地址是虚拟地址,而不是真实地址(你那本书里面肯定提到了),所以引用不存在的内存,肯定会有一个缺页中断,而后果,你已经看见了。

Win32是不会也不可能会让你这么容易读到Raw内存的,事实上,这个是由硬件决定你完全不可能读取到有效地址(EA)的,除非你放弃现在的用户态,而书写8086兼容代码(即核心态),但这样也只能读取前一兆的内存,其实这样也是虚拟地址从0x40000开始,而不是从0开始的根本原因。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-15 07:45
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 6# 的帖子
缺页中断 由两种表现
如果 这个地址在虚拟内存中,操作系统会控制并把这个地址转到 内存 中
这时的 缺页中断  不会产生错误

 书写8086兼容代码(即核心态),好像以前我们学习的 8086汇编语言 就是这种方式吧
记得当时能用 in\out 对输入输出直接操作,很接近底层操作
这些应该在现在这种 ring3 权限下不允许,是这样吗 ?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-01 13:16
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
直接地址硬编码的方式读数据当然没有任何问题,而且任何地址都可以.只不过楼主的代码行不行就不知道了.

至于6楼版主说的线性地址和物理地址的问题...... 只能说 一切皆有可能. MmGetPhysicalAddress就可以,还有其他很多方法.

可以精读 windows驱动开发技术详解 和 天书夜读 这两本书.
最近在看天书夜读,越看越觉得自己啥都不会

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2008-11-02 00:38
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
特权段 gs
刚才按照 大家的建议
我查看了下段的属性(附图)
好像只有  gs 段段的 ring = 0 ,允许特权操作(也就是这cs段其实还是ring = 3的权限)
以前没有关注gs段,不知道是干什么的
如果能把一段执行代码注入到 gs 段,那可能就拥有 ring = 0特权了
只是不知道这个猜想能成立不?

d特权段.JPG (88.12 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-02 15:24
快速回复:拥有最高特权级 0后,为何还是不能访问内存空间
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020207 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved