注册 登录
编程论坛 汇编论坛

汇编崩溃问题 求教解决办法

ch2202111 发布于 2016-05-24 15:14, 4525 次点击
push eax
MOV eax, DWORD_PTR[地址]
MOV eax, DWORD_PTR[eax]
MOV 值, eax
pop eax
这段代码 一碰到不可读的内存程序就崩溃了
哪位老大帮帮我啊 坐等 有没有什么好办法解决
4 回复
#2
AXRZ2016-05-25 01:33
在WINDOWS下如果你想访问其他程序的内存区域要调用OpenProcess(),ReadProcessMemory()等API,而且目标程序的内存区域必须是可读的,否则出错是很正常的

如下代码在WINDOWS下会被视为访问非法区域:
MOV EAX,[0000]
因为你的程序在访问其段选择子外的内容

能不能访问你的那个“地址”的位置, 取决于这个位置在全局描述符表里声明是否是对外可读或可写的

操作系统通过全局描述符表来限制程序能访问的内存区域,若你试图访问其之外的区域会触发中断;在WIN下这个中断会终止程序的运行并显示错误,这么做是出于安全考虑

那么回到你的代码中:
MOV EAX,DWORD PTR [地址]        ;如果此地址是可读的,此代码不会出错
MOV EAX,DWORD PTR [EAX]         ;如果[地址]中存着的地址是可读的,这条指令不会出错

[此贴子已经被作者于2016-5-25 01:35编辑过]

#3
zhulei19782016-05-25 07:39
全局描述符表GDT(Global Descriptor Table)
          GDTR
-----------------------
|32位基地址|16位的界限|
-----------------------
#4
ch22021112016-05-25 10:17
我要怎么查看全局描述表里对应的内存是否可读写?  能不能给个例子 各位大侠们  帮帮忙
#5
AXRZ2016-05-25 11:05
回复 4楼 ch2202111
全局描述符表只能由操作系统访问和管理;因此,在WIN32下检测内存是否可读需要用到系统API(当然有部分系统DLL是对外可读的)
如下用API OpenProcess来检测PID600程序的内存区域是否可读(准确的说是试图获取可读权限):
HANDLE WINAPI OpenProcess(
  _In_ DWORD dwDesiredAccess,
  _In_ BOOL  bInheritHandle,
  _In_ DWORD dwProcessId
);

编译器:NASM

EXTERN OpenProcess
IMPORT OpenProcess kernel32.dll

SEGMENT .CODE USE32
..start:
PUSH DWORD 600        ;dwProcessID=600,进程PID
PUSH DWORD 0          ;bInheritHandle=0,子进程句柄继承,这里不重要
PUSH DWORD 10H        ;dwDesireAccess=PROCESS_VM_READ(10H),试图获取读取权限
CALL [OpenProcess]
TEST EAX,EAX          ;若此API成功,进程内存将可读,返回值为进程基址,反之则返回0
JNZ READABLE
....


1