+ -
当前位置:首页 → 问答吧 → 纠结了几天的一个问题,关于读内存地址的!!

纠结了几天的一个问题,关于读内存地址的!!

时间:2010-12-23

来源:互联网

我写了一个简单程序去查找根指针"RST PTR",程序运行对了,但是结果只有四位而且一点跟内存中的不一样,我debug,但是debug32不能查看32位寄存器,用cv,不管在哪都会跳出cv到dos界面就死机了,是不是段地址那里有问题,哪会会的高手给我提点提点?程序如下:
.model small
.386
.stack 512
.data
 string0 db'RSD PTR :$'
 RSD_PTR1 equ 52534420h
 RSD_PTR2 equ 50545220h

.code
 show_char macro string
  pusha
  lea dx,string
  mov ah,09h
  int 21h
  popa
  endm

start:
  mov ax,@data
  mov ds,ax
  mov ebx,000e0000h ;起始地址
lookfor: 
  cmp dword ptr fs:[ebx],RSD_PTR1 ;比较前四位
  jnz X1 ;不相等则跳转到X1继续查找
  add ebx,4  
  cmp dword ptr fs:[ebx],RSD_PTR2 ;比较后四位
  jz yy ;相等在跳转yy输出
  X1:
  inc ebx
  cmp ebx,000fffffh ;终止地址
  jz exit
  loop lookfor
 yy:
  show_char string0
  xor eax,eax
  mov eax,ebx ;把找到的32位地址传给eax
  mov cl,24 ;按字节输出地址共8位
  ror eax,cl
  call zhuanhuan
  mov dl,al
  call display_
  ror eax,cl
  call zhuanhuan
  mov dl,al
  call display_
  ror eax,cl
  call zhuanhuan
  mov dl,al
  call display_
  ror eax,cl
  call zhuanhuan
  mov dl,al
  call display_
   
 
 exit:
  mov ah,4ch
  int 21h
  display_ proc near ;显示函数
  push ax
  mov ah,2
  int 21h
  pop ax
  ret
  display_ endp
 zhuanhuan proc near ;转换函数
  cmp al,10
  jb lab  
  add al,07h  
 lab:add al,30h  
  ret
  zhuanhuan endp
 end start
  code ends  
结果应该显示RSD PTR :000f8970纠结几天了,拜托大神出现?

作者: zhuyi108   发布时间: 2010-12-23

没碰过这方面的内容。不过,FS 没设置过?loop 指令也没有设置 cx?运行环境是不是有要求,比如纯 dos 还是特定的什么模式?我在 xp 的命令行窗口下,无任何显示;在 vpc 虚拟机的纯 dos 下,显示 RSD PTR :0E06 ?

作者: zara   发布时间: 2010-12-23

debug32查看32位寄存器用r32来查看

作者: masmaster   发布时间: 2010-12-23

引用 1 楼 zara 的回复:
没碰过这方面的内容。不过,FS 没设置过?loop 指令也没有设置 cx?运行环境是不是有要求,比如纯 dos 还是特定的什么模式?我在 xp 的命令行窗口下,无任何显示;在 vpc 虚拟机的纯 dos 下,显示 RSD PTR :0E06 ?


这个程序肯定只能在纯dos下,这个loop 循环是不定次数的,因为不知道要循环多少次就找到了,你后面显示那个就是我显示出来的结果,但是我要的是RSD PTR :000f8970这个结果,就是不知道错在哪了?

作者: zhuyi108   发布时间: 2010-12-23

为什么必是 000f8970,哪里有这方面的资料看看?在 vpc 的纯 dos 下,我这 cv 是可以运行的,但结果和直接运行它还不一样。纯 dos 下的,fs 应该是 0000 吧,这个是你所要的?

作者: zara   发布时间: 2010-12-23

麻烦举个例子,我比如运行了 debug32 111.exe然后 查看全部程序 用u 看到了全部程序或者一部分,然后单步执行用t 看到了第一条指令但是只有前16个bit ,下来怎么看32位的呢?

作者: zhuyi108   发布时间: 2010-12-23

引用 4 楼 zara 的回复:
为什么必是 000f8970,哪里有这方面的资料看看?在 vpc 的纯 dos 下,我这 cv 是可以运行的,但结果和直接运行它还不一样。纯 dos 下的,fs 应该是 0000 吧,这个是你所要的?

  那是肯定的,我有人家做好的软件,现在就是模仿人家的软件来写这部分程序的,知道了原理就是基础知识不行,所以老是出错~

作者: zhuyi108   发布时间: 2010-12-23

引用 5 楼 zhuyi108 的回复:
麻烦举个例子,我比如运行了 debug32 111.exe然后 查看全部程序 用u 看到了全部程序或者一部分,然后单步执行用t 看到了第一条指令但是只有前16个bit ,下来怎么看32位的呢?

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

d:\MASM>debug32
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994


d:\MASM>debug32
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

CPU = ?86, Virtual 8086 Mode, Id/Step = 0FF1, A20 enabled
-a
2B29:0100 66B878563412 mov eax,12345678
2B29:0106 BB1200 mov bx,12
2B29:0109 F7E3 mul bx
2B29:010B
-r32
EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000 EBP=00000000
ESI=00000000 EDI=00000000 FS=2B29 GS=2B29 SS=2B29 ESP=00000000
DS=2B29 ES=2B29 CS=2B29 EIP=00000100 NV UP DI PL NZ NA PO NC
2B29:0100 66B878563412 MOV EAX,12345678h
-t
EAX=12345678 EBX=00000000 ECX=00000000 EDX=00000000 EBP=00000000
ESI=00000000 EDI=00000000 FS=2B29 GS=2B29 SS=2B29 ESP=00010000
DS=2B29 ES=2B29 CS=2B29 EIP=00000106 NV UP DI PL NZ NA PO NC
2B29:0106 BB1200 MOV BX,0012h
Trace Interrupt
-t
EAX=12345678 EBX=00000012 ECX=00000000 EDX=00000000 EBP=00000000
ESI=00000000 EDI=00000000 FS=2B29 GS=2B29 SS=2B29 ESP=00010000
DS=2B29 ES=2B29 CS=2B29 EIP=00000109 NV UP DI PL NZ NA PO NC
2B29:0109 F7E3 MUL BX
Trace Interrupt
-t
EAX=12341470 EBX=00000012 ECX=00000000 EDX=00000006 EBP=00000000
ESI=00000000 EDI=00000000 FS=2B29 GS=2B29 SS=2B29 ESP=00010000
DS=2B29 ES=2B29 CS=2B29 EIP=0000010B OV UP DI PL NZ NA PO CY
2B29:010B E000 LOOPNE 010D ;yes
Trace Interrupt
-

作者: masmaster   发布时间: 2010-12-23