norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2523回复:15

大脑就要爆掉了~~~虚拟地址转物理地址

楼主#
更多 发布于:2003-06-24 14:25
被Boss逼的没办法了,大家救命哦!!!

问题:  虚拟地址如何转换成物理地址,请简单说一下,或者给我一点资料看看。


多谢,多谢。


PS: 强烈抗议日本蚕食我钓鱼岛!正在筹款准备自费登陆钓鱼岛!!!!
else
驱动小牛
驱动小牛
  • 注册日期2002-10-21
  • 最后登录2004-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-24 14:44
你要把虚拟地址转换成物理地址作什么?

把物理地址转换成虚拟地址还行
norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-24 15:22
虚拟地址---〉物理地址

最近搞到一个驱动程序,可以无限制,更改物理地址。

但是对于一个程序,dll,来说,只有虚拟地址,所以请问怎么把虚拟地址----〉物理地址??
else
驱动小牛
驱动小牛
  • 注册日期2002-10-21
  • 最后登录2004-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-24 16:03
不清楚是不是还有其他的简单的方法。

你可以自己来查表(GDT,LDT)转换过来
(猜想,没有试过)

[编辑 -  6/24/03 by  else]
norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-24 16:09
有没有稍微详细一点的文章^^
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2003-06-24 23:17
建议看看80X86汇编语言程序设计教程.里面详细介绍了了地址转换的方法.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-25 23:30
完全没有必要把虚拟地址改为物理地址,假设你要改相应的虚拟地址,则直接改得了,又假如你要改特定物理地址的内容,则需要做的是将物理地址转化为虚拟地址。
另外,假设有方法能得到虚拟地址当前对应的物理地址,也是没有用的,因为,在保护模式下,所有地址都将被视为虚拟地址,即便你用汇编也如此。所以,假设能够直接操作物理地址,除非转到实模式下,否则,。。。
要修改特定物理地址内容有一个办法是前面提到的,将物理地址转化为虚拟地址,方法有很多
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-06-26 00:37
虚拟地址---〉物理地址

最近搞到一个驱动程序,可以无限制,更改物理地址。

但是对于一个程序,dll,来说,只有虚拟地址,所以请问怎么把虚拟地址----〉物理地址??

即便是这种工具,也应该是将物理地址转化为虚拟地址来让你修改。
norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-26 17:51
感谢大家的帮助,我想我应该说的更详细一些^_^


我要改的是winXp下面的 系统的 dll

大家知道win2000以后的操作系统,每个应用程序好像会自己带上系统dll,  于是我就在自己的应用程序上找到dll的虚拟地址,然后直接用win API函数修改,可是改了之后,我改的那些部分没有起到作用,尽管显示已经成功改变了......TvT


更让我头疼的是,当我把应用程序更改完dll后,然后退出,然后再次运行我的应用程序,程序显示 我本来更改的地方又变回原样了!!!!!!!!!!!!


那我应该怎样解决这个问题?让我更改的内容生效那?TvT
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-26 20:57
这是显然的吗,你修改的是内存,不是磁盘文件,要改dll,直接修改文件的了
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2003-06-26 22:56
在NT内核下,所有的DLL通过共享物理页来达到共享的,一般你不能直接修改系统DLL,因为他们都有COPY ON WRITE属性,所以你改了也没用
不知道其他CPU的情况,一般在X86的RING0中通过将CR0的位16(WP)位置0,然后就可以将修改应用与所有的应用程序,不过一定要在修改好后改回来,不然会死的很惨.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-28 19:00
在NT内核下,所有的DLL通过共享物理页来达到共享的,一般你不能直接修改系统DLL,因为他们都有COPY ON WRITE属性,所以你改了也没用
不知道其他CPU的情况,一般在X86的RING0中通过将CR0的位16(WP)位置0,然后就可以将修改应用与所有的应用程序,不过一定要在修改好后改回来,不然会死的很惨.


所以我就想知道那个dll的物理地址,然后去修改TvT


ps: 在win2000,winXp下面,系统dll是无法修改的,特别是xpSp1
robin12
驱动牛犊
驱动牛犊
  • 注册日期2002-02-11
  • 最后登录2014-03-27
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望63点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-07-05 21:10
假设你的dll virtual address is 0x77de0000,在softice中用phys
0x77de0000,或者page 0x77de0000,能找到物理地址,然后在你的应用程序中再将此物理地址映射成虚拟地址,改之。不过物理地址在内存中是动态映射的,改了也没用,其实你可以截获API不就行乐,另外你也可以自己计算虚拟地址的物理地址如
webcreazy有一偏文章专门将这个问题
norsd
驱动牛犊
驱动牛犊
  • 注册日期2003-03-27
  • 最后登录2016-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-07-05 23:24
感谢,请问你说的是这文章吗?

小议Windows NT/2000分页机制
                     WebCrazy(tsu00@263.net)
    内存管理是操作系统最重要的一部分,其决定了操作系统的性能。Intel X86采用分
段、分页的内存机制,Windows NT/2000充分利用了此项先进的机制。段内IA-32体系使
用页目录(Page Directory)与页表(Page Table,SoftICE中Page命令可以显示出页目录与
页表等)形成对4G地址的寻址能力。文中未特别说明,均讨论运行平台为Intel 32位处理
器的Windows NT/2000,所提及的Windows也仅指Windows NT/2000。Windows中不管用户
态与核心态的代码段、数据段与堆栈段基址均为0,文中提到的逻辑地址(由段基址与偏
移量两部分组成)与线性地址值是相等的。由于对于用户来说线性地址是其可见的,若我
未特别指出物理地址,所说的地址也仅指线性地址。
    页目录(PDE)由1024项组成,每项均指向一页表(PTE),每一页表也由1024个页组成
,IA-32体系每页大小为4K,所以可寻址范围为4G(1024*1024*4K)。Windows中每个进程
都拥有其各自的进程地址空间,即拥有其各自的页目录与页表。每个进程均使用线性地
址C0300000H指向其特定的页目录所在的地址,而页目录中每项(即页表)均依次排列在线
性地址C0000000H处,每个页表均占用4K(1024*4)字节,如第一个页表位于C0000000H处
,而第二个页表位于C0000000+1000H(4K),即C0001000中,依次类推,计算公式即为C0
000000H+页目录偏移值(线性地址的高10位)*1000H,在下面我将利用此公式。当然以上
描述的前提是每个页表均位于物理内存中(由页目录中每项中的P位指定),这也是为什么
IA-32使用两级页表的原因,否则每个进程除其代码与数据等外还额外需要4M(4*1024*1
024)的存储器。
    上面的机制即实现了物理地址寻址,也就实现了在Windows NT/2000中物理地址与线
性地址的相互转换(虽然CPU在对内存操作时只需要线性地址转换成物理地址,但我们在
分析程序代码等仍需要物理地址转换成线性地址)。照例先看看SoftICE的分析吧:
    // addr explorer命令后以下操作将只在进程explorer的私有进程空间进行
    :addr explorer
    // 显示explorer进程页目录所在物理地址,即进程切换至explorer后PDBR(CR3)中
的值
    :addr
    CR3     LDT Base:Limit KPEB Addr PID  Name
            .
            .
            .
    00C10000               FF9FC920  036C explorer
            .
            .
            .
    /*
        线性地址的格式:0-11位对应1页(4096字节)的偏移量
        12-21位对当前页表中1024项中寻址
        22-31位对页目录进行寻址
        高20位(12-31位)又称为桢
        根据上面提及的公式,即可以得到物理地址高20位的值,再加上线性地址页表
偏移(作为物理
        地址的低12位),即实现了线性地址转化为物理地址,用公式表示为:
         @(C0000000h+PDE*1000h+PTE*4)&0fffff000h+PO
        =@(C0000000h+4*(PDE*400h+PTE))&0fffff000h+PO
        =@(C0000000h+(PDE>>10d+PTE)<<2d)&0fffff000h+PO
        =@(C0000000h+(LA>>12d)<<2d)&0fffff000h+PO
        =@(C0000000h+(LA&0xFFFFF000)>>10d)&0fffff000h+PO
            上式中用PDE与PTE分别代表Page Directory与Page Table的偏移值,用LA
代表给定的线性
        地址,用PO代表LA的低12位,用h与d分别代表16/10进制,@后表示取后地址指
针中的内容。
        如此分析后,线性地址C0300000所对应的页目录为300h,页表为300h,偏移量
为0
        则 C0000000h+PD*1000h+PT*4+PO=C0000000+300h*1000h+300h*4+0
    */
    :dd c0000000+300*1000+300*4 l 4
    0010:C0300C00 00C10063 01A31063 00000000 0141F163 c...c.......c.A.
                     |。。。。
.....................
....................
siteddy
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2005-02-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-07-07 17:12
MmGetPhysicalAddress();看看资料吧,我很奇怪你为什么不去DDK看看。
teddy
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-07-21 00:08
去看看WebCrazy的网站吧,别告诉我你不知道。
游客

返回顶部