阅读:2523回复:15
大脑就要爆掉了~~~虚拟地址转物理地址
被Boss逼的没办法了,大家救命哦!!!
问题: 虚拟地址如何转换成物理地址,请简单说一下,或者给我一点资料看看。 多谢,多谢。 PS: 强烈抗议日本蚕食我钓鱼岛!正在筹款准备自费登陆钓鱼岛!!!! |
|
沙发#
发布于:2003-06-24 14:44
你要把虚拟地址转换成物理地址作什么?
把物理地址转换成虚拟地址还行 |
|
板凳#
发布于:2003-06-24 15:22
虚拟地址---〉物理地址
最近搞到一个驱动程序,可以无限制,更改物理地址。 但是对于一个程序,dll,来说,只有虚拟地址,所以请问怎么把虚拟地址----〉物理地址?? |
|
地板#
发布于:2003-06-24 16:03
不清楚是不是还有其他的简单的方法。
你可以自己来查表(GDT,LDT)转换过来 (猜想,没有试过) [编辑 - 6/24/03 by else] |
|
地下室#
发布于:2003-06-24 16:09
有没有稍微详细一点的文章^^
|
|
5楼#
发布于:2003-06-24 23:17
建议看看80X86汇编语言程序设计教程.里面详细介绍了了地址转换的方法.
|
|
|
6楼#
发布于:2003-06-25 23:30
完全没有必要把虚拟地址改为物理地址,假设你要改相应的虚拟地址,则直接改得了,又假如你要改特定物理地址的内容,则需要做的是将物理地址转化为虚拟地址。
另外,假设有方法能得到虚拟地址当前对应的物理地址,也是没有用的,因为,在保护模式下,所有地址都将被视为虚拟地址,即便你用汇编也如此。所以,假设能够直接操作物理地址,除非转到实模式下,否则,。。。 要修改特定物理地址内容有一个办法是前面提到的,将物理地址转化为虚拟地址,方法有很多 |
|
|
7楼#
发布于:2003-06-26 00:37
虚拟地址---〉物理地址 即便是这种工具,也应该是将物理地址转化为虚拟地址来让你修改。 |
|
8楼#
发布于:2003-06-26 17:51
感谢大家的帮助,我想我应该说的更详细一些^_^
我要改的是winXp下面的 系统的 dll 大家知道win2000以后的操作系统,每个应用程序好像会自己带上系统dll, 于是我就在自己的应用程序上找到dll的虚拟地址,然后直接用win API函数修改,可是改了之后,我改的那些部分没有起到作用,尽管显示已经成功改变了......TvT 更让我头疼的是,当我把应用程序更改完dll后,然后退出,然后再次运行我的应用程序,程序显示 我本来更改的地方又变回原样了!!!!!!!!!!!! 那我应该怎样解决这个问题?让我更改的内容生效那?TvT |
|
9楼#
发布于:2003-06-26 20:57
这是显然的吗,你修改的是内存,不是磁盘文件,要改dll,直接修改文件的了
|
|
|
10楼#
发布于:2003-06-26 22:56
在NT内核下,所有的DLL通过共享物理页来达到共享的,一般你不能直接修改系统DLL,因为他们都有COPY ON WRITE属性,所以你改了也没用
不知道其他CPU的情况,一般在X86的RING0中通过将CR0的位16(WP)位置0,然后就可以将修改应用与所有的应用程序,不过一定要在修改好后改回来,不然会死的很惨. |
|
|
11楼#
发布于:2003-06-28 19:00
在NT内核下,所有的DLL通过共享物理页来达到共享的,一般你不能直接修改系统DLL,因为他们都有COPY ON WRITE属性,所以你改了也没用 所以我就想知道那个dll的物理地址,然后去修改TvT ps: 在win2000,winXp下面,系统dll是无法修改的,特别是xpSp1 |
|
12楼#
发布于:2003-07-05 21:10
假设你的dll virtual address is 0x77de0000,在softice中用phys
0x77de0000,或者page 0x77de0000,能找到物理地址,然后在你的应用程序中再将此物理地址映射成虚拟地址,改之。不过物理地址在内存中是动态映射的,改了也没用,其实你可以截获API不就行乐,另外你也可以自己计算虚拟地址的物理地址如 webcreazy有一偏文章专门将这个问题 |
|
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. |。。。。 ..................... .................... |
|
14楼#
发布于:2003-07-07 17:12
MmGetPhysicalAddress();看看资料吧,我很奇怪你为什么不去DDK看看。
|
|
|
15楼#
发布于:2003-07-21 00:08
去看看WebCrazy的网站吧,别告诉我你不知道。
|
|