社区
ASP
帖子详情
win2000上安装一个软件后泄载后再安装,总是提示"“0x616c7567"指令引用的“0x616c7567"内存。该内存不能为“read"",有什么方法可以解决吗?.
perli
2001-12-30 05:27:29
...全文
116
13
打赏
收藏
win2000上安装一个软件后泄载后再安装,总是提示"“0x616c7567"指令引用的“0x616c7567"内存。该内存不能为“read"",有什么方法可以解决吗?.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
csdn_study
2002-01-04
打赏
举报
回复
我也碰到過,不過不是win2000的問題,很可能是應用軟件的問題,雙方說你安裝其它的軟件就沒有這樣的問題
violet_gj
2002-01-04
打赏
举报
回复
不是中毒,我刚装完机器就出现这个问题,大概是2000的问题
CityHost
2002-01-04
打赏
举报
回复
这种问题在用解霸2001时,播放列表超过30个就会有同样的问题。
llyyrr
2002-01-03
打赏
举报
回复
应该中毒了
CityHost
2002-01-02
打赏
举报
回复
我怀疑这是Win2K的后门,我用的是WIN2K Ad Server(买服务器时购买的正版),在用雷鸟的PC机上经常出现这个问题,用BORLAND的软件必然出错(尤其是把mdm.exe由MS的换为其他的)。我手里有从PC100-PC166的KingMax和KingStong的各种批号的内存条,都换过都不行,估计这是MS故意放的代码。
mikespook
2002-01-01
打赏
举报
回复
不是病毒,我的也一样。特别是在使用DREAMWEAVER和BCB时!
gopark
2002-01-01
打赏
举报
回复
我也遇到过,换条内存就好了。
perli
2002-01-01
打赏
举报
回复
我觉的不是病毒了,因为我新装的系统也是一样
ssm1226
2001-12-31
打赏
举报
回复
重装系统吧,肯定先让病毒给搞的。
异想天开的妄想狂
2001-12-31
打赏
举报
回复
重安装系统,是win2000的问题。。。。
是不是这样的:http://hooyke.xacol.com/pic/error.GIF
mkiss
2001-12-31
打赏
举报
回复
不是病毒!我也有这个毛病,是系统的问题!建议重新安装操作系统
haiznan
2001-12-30
打赏
举报
回复
是的你种了~~病毒感染~~~~~~
我还告诉你中的是现在最留行的“尼古打”
25475360
2001-12-30
打赏
举报
回复
病毒感染
游戏画面就弹出
内存
不能
为
read
修复工具
出现这个现象有方面的,一是硬件,即
内存
方面有问题,二是
软件
,这就有多方面的问题了。 一:先说说硬件: 一般来说,电脑硬件是很不容易坏的。
内存
出现问题的可能性并不大(除非你的
内存
真的是杂牌的一塌徒地),主要方面是:1。
内存
条坏了(二手
内存
情况居多)、2。使用了有质量问题的
内存
,3。
内存
插在主板上的金手指部分灰尘太多。4。使用不同品牌不同容量的
内存
,从而出现不兼容的情况。5。超频带来的散热问题。你可以使用MemTest 这个
软件
来检测一下
内存
,它可以彻底的检测出
内存
的稳定度。 二、如果都没有,那就从
软件
方面排除故障了。 先说原理:
内存
有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果
内存
分配成功,函数就会将所新开辟的
内存
区地址返回给应用程序,应用程序就可以通过这个地址使用这块
内存
。这就是“动态
内存
分配”,
内存
地址也就是编程中的“光标”。
内存
不是永远都招之即来、用之不尽的,有时候
内存
分配也会失败。当分配失败时系统函数会返回
一个
0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的
一个
通知,告知出现了错误。作为应用程序,在每一次申请
内存
后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用光标,继续在之后的执行中使用这块
内存
。真正的0地址
内存
区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如
Win
dows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的
内存
不能
为“
read
”错误,并指出被
引用
的
内存
地址为“0x00000000“。
内存
分配失败故障的原因很多,
内存
不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,
安装
了多种应用程序(包括无意中“
安装
”的病毒程序),更改了大量的系统参数和系统档案之后。 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的
内存
,但不知为什么,这个预料中可用的光标已经失效了。有可能是 “忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块
内存
而“没有留意”等等。注销了的
内存
被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定
总是
0,因此错误
提示
中的
内存
地址也不一定为 “0x00000000”,而是其它随机数字。 首先建议: 1、 检查系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2、 更新操作系统,让操作系统的
安装
程序重新拷贝正确版本的系统档案、修正系统参数。有时候操作系统本身也会有BUG,要注意
安装
官方发行的升级程序。 3、 尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。 4、 删除然后重新创建
Win
ntSystem32WbemRepository 文件夹中的文件:在桌面上右击我的电脑,然后单击管理。在"服务和应用程序"下,单击服务,然后关闭并停止
Win
dows Management Instrumentation 服务。 删除
Win
ntSystem32WbemRepository 文件夹中的所有文件。(在删除前请创建这些文件的备份副本。)打开"服务和应用程序",单击服务,然后打开并启动
Win
dows Management Instrumentation 服务。当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINESOFTWAREMicrosoftWBEMCIMOMAutorecover MOFs 下面搜集几个例子给大家分析: 例一:IE浏览器出现“0x0a8ba9ef”
指令
引用
的“0x03713644”
内存
,或者“0x70dcf39f”
指令
引用
的“0x00000000”
内存
。该
内存
不能
为“
read
”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中
一个
窗口即将关闭”的信息框,关闭该
提示
信息后,IE浏览器也被关闭。
解决
方法
: 1、 开始-运行窗口,输入“regsvr32 actxprxy.dll”回车,接着会出现
一个
信息对话 框“DllRegisterServer in actxprxy.dll succeeded”,确定。再依次运行以下命令。(这个
方法
有人说没必要,但重新注册一下那些.dll对系统也没有坏处,反正多方下手,能
解决
问题就行。) regsvr32 shdocvw.dll regsvr32 oleaut32.dll regsvr32 actxprxy.dll regsvr32 mshtml.dll regsvr32 msjava.dll regsvr32 browseui.dll regsvr32 urlmon.dll 2、 修复或升级IE浏览器,同时打上系统补丁。看过其中
一个
修复
方法
是,把系统还原到系统初始的状态下。建议将IE升级到了6.0。 例二:有些应用程序错误: “0x7cd64998”
指令
参考的 “0x14c96730”
内存
。该
内存
不能
为 “
read
”。
解决
方法
:
Win
XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每
一个
应用程序的前几次启动情况进行分析,然后新增
一个
描述套用需求的虚拟“
内存
映像”,并把这些信息储存到
Win
dowsPrefetch文件夹。一旦建立了映像,应用
软件
的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用
软件
启动的信息。建议将虚拟
内存
撤换,删除
Win
dowsPrefetch目录下所有*.PF文件,让
win
dows重新收集程序的物理地址。 例三:在XP下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”
指令
引用
的“0x00000078”
内存
。该
内存
不能
为“written”,要终止程序,请单击“确定”,而在
Win
dows 98里运行却正常。
解决
方法
:这可能是系统的兼容性问题,
win
XP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“
Win
dows 98/Me”。
win
2000
如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:
win
ntapppatchslayerui.dll。右键,属性,也会出现兼容性的选项。 例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”
指令
引用
的“0xffffffff”
内存
。该
内存
不能
为 “
read
” 的
提示
。
解决
方法
:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来
解决
这个问题。 例五:我的豪杰超级解霸自从上网后就
不能
播放了,每次都
提示
“0x060692f6”(每次变化)
指令
引用
的“0xff000011”
内存
不能
为 “
read
”,终止程序请按确定。
解决
方法
:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。 例六:双击
一个
游戏的快捷方式,“0x77f5cd0”
指令
引用
“0xffffffff”内 存,该
内存
不能
为“
read
” ,并且
提示
Client.dat程序错误。
解决
方法
:重装显卡的最新驱动程序,然后下载并且
安装
DirectX9.0。 例七:
一个
朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”
指令
引用
的“0x00303033”
内存
,该
内存
不能
为 “written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。
解决
方法
:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 该
内存
不能
为
read
或written的
解决
方案关键词: 该
内存
不能
为"
read
" 该
内存
不能
为"written" 从网上搜索来的几篇相关文章. 【文章一】 使用
Win
dows操作系统的人有时会遇到这样的错误信息: 「“0X????????”
指令
引用
的“0x00000000”
内存
,该
内存
不能
为“
read
”或“written”」,然后应用程序被关闭。 如果去请教一些「高手」,得到的回答往往是「
Win
dows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是
Win
dows不稳定造成的。本文就来简单分析这种错误的一般原因。 一、应用程序没有检查
内存
分配失败 程序需要一块
内存
用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果
内存
分配成功,函数就会将所新开辟的
内存
区地址返回给应用程序,应用程序就可以通过这个地址使用这块
内存
。这就是「动态
内存
分配」,
内存
地址也就是编程中的「光标」。
内存
不是永远都招之即来、用之不尽的,有时候
内存
分配也会失败。当分配失败时系统函数会返回
一个
0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的
一个
通知,告知出现了错误。作为应用程序,在每一次申请
内存
后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的「健壮性」。若应用程序没有检查这个错误,它就会按照「思维惯性」认为这个值是给它分配的可用游标,继续在之后的执行中使用这块
内存
。真正的0地址
内存
区储存的是计算机系统中最重要的「中断描述符表」,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如
Win
dows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的「写
内存
」错误,并指出被
引用
的
内存
地址为「0x00000000」。
内存
分配失败故障的原因很多,
内存
不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,
安装
了多种应用程序(包括无意中「
安装
」的病毒程序),更改了大量的系统参数和系统档案之后。 二、应用程序由于自身BUG
引用
了不正常的
内存
光标 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试突读写一块「应该可用」的
内存
,但不知为什么,这个预料中可用的光标已经失效了。有可能是「忘记了」向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块
内存
而「没有留意」等等。注销了的
内存
被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图「违法」的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定
总是
0,因此错误
提示
中的
内存
地址也不一定为「0x00000000」,而是其它随机数字。如果系统经常有所提到的错误
提示
,下面的建议可能会有说明 : 1.检视系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统, 从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2.更新操作系统,让操作系统的
安装
程序重新拷贝正确版本的系统档案、修正系统参数。 有时候操作系统本身也会有BUG,要注意
安装
官方发行的升级程序。 3.试用新版本的应用程序。 Mode: 将虚拟
内存
撤换 答案: 目前为止是肯定的,也就是如在下次冷天到来时亦没再发生,就代表这是主因 追加: 如果你用 Ghost 恢复 OS 后建议 删除
WIN
DOWS\PREFETCH目录下所有*.PF文件因为需让
win
dows重新收集程序的物理地址 有些应用程序错误 "0x7cd64998"
指令
参考的 "0x14c96730"
内存
。该
内存
不能
为 "
read
"推论是此原因 源由:
Win
XP的「预读取」技术 这种最佳化技术也被用到了应用
软件
上,系统对每
一个
应用
软件
的前几次启动情况进行分析,然后新增
一个
描述套用需求的虚拟「
内存
映像」,并把这些信息储存到
WIN
DOWSPREFETCH数据夹。一旦建立了映像,应用
软件
的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用
软件
启动的信息。 后叙: 目前此
方法
亦是独步网络的(其码自己针对此问题查了许久),也是常见问题,原本几乎每天睡前关闭
软件
时一些程序都会发生...
read
... 现在就没发生了。 【文章二】 运行某些程序的时候,有时会出现
内存
错误的
提示
(0x后面内容有可能不一样),然后该程序就关闭。 “0x????????”
指令
引用
的“0x????????”
内存
。该
内存
不能
为“
read
”。 “0x????????”
指令
引用
的“0x????????”
内存
,该
内存
不能
为“written”。 不知你出现过类似这样的故障吗? 一般出现这个现象有方面的,一是硬件,即
内存
方面有问题,二是
软件
,这就有多方面的问题了。 下面先说说硬件: 一般来说,
内存
出现问题的可能性并不大,主要方面是:
内存
条坏了、
内存
质量有问题,还有就是2个不同牌子不同容量的
内存
混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。你可以使用MemTest 这个
软件
来检测一下
内存
,它可以彻底的检测出
内存
的稳定度。 假如你是双
内存
,而且是不同品牌的
内存
条混插或者买了二手
内存
时,出现这个问题,这时,你就要检查是不是
内存
出问题了或者和其它硬件不兼容。 如果都没有,那就从
软件
方面排除故障了。 先简单说说原理:
内存
有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间,就会发生溢出现象。举个例子:
一个
桶子只能将一斤的水,当你放入两斤的水进入时,就会溢出来。而系统则是在屏幕上表现出来。这个问题,经常出现在
win
dows
2000
和XP系统上,
Win
dows
2000
/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似
Win
dows 98里的非法操作,系统为保持稳定,就会出现上述情况。另外也可能是硬件设备之间的兼容性不好造成的。 下面我从几个例子给大家分析: 例一:打开IE浏览器或者没过几分钟就会出现"0x70dcf39f"
指令
引用
的"0x00000000"
内存
。该
内存
不能
为“
read
”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中
一个
窗口即将关闭”的信息框,关闭该
提示
信息后,IE浏览器也被关闭。
解决
方法
:修复或升级IE浏览器,同时打上补丁。看过其中
一个
修复
方法
是,
Win
2000
自升级,也就是
Win
2000
升级到
Win
2000
,其实这种
方法
也就是把系统还原到系统初始的状态下。比如你的IE升级到了6.0,自升级后,会被IE5.0代替。 例二:在
win
dows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”
指令
引用
的“0x00000078”
内存
。该
内存
不能
为 “written”,要终止程序,请单击“确定”,而在
Win
dows 98里运行却正常。
解决
方法
:这可能是系统的兼容性问题,
win
XP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“
Win
dows 98/Me”。
win
2000
如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:
win
ntapppatchslayerui.dll。右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”
指令
引用
的“0xffffffff”
内存
。该
内存
不能
为 “
read
” 的
提示
。
解决
方法
:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来
解决
这个问题。 例四:我的豪杰超级解霸自从上网后就
不能
播放了,每次都
提示
“0x060692f6”(每次变化)
指令
引用
的“0xff000011”
内存
不能
为 “
read
”,终止程序请按确定。
解决
方法
:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。 例五:双击
一个
游戏的快捷方式,“0x77f5cd0”
指令
引用
“0xffffffff”内 存,该
内存
不能
为“
read
” ,并且
提示
Client.dat程序错误。
解决
方法
:重装显卡的最新驱动程序,然后下载并且
安装
DirectX9.0。 例六:
一个
朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”
指令
引用
的“0x00303033”
内存
,该
内存
不能
为 “written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。
解决
方法
:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。 【原因
解决
方法
】 1
内存
条坏了 更换
内存
条 2 双
内存
不兼容 使用同品牌的
内存
或只要一条
内存
3
内存
质量问题 更换
内存
条 4 散热问题 加强机箱内部的散热 5
内存
和主板没插好或其他硬件不兼容 重插
内存
或换个插槽 6 硬件有问题 更换硬盘 7 驱动问题 重装驱动,如果是新系统,应先
安装
主板驱动 8
软件
损坏 重装
软件
9
软件
有BUG 打补丁或更新到最新版本 10
软件
和系统不兼容 给
软件
打上补丁或是试试系统的兼容模式 11
软件
和
软件
之间有冲突 如果最近
安装
了什么新
软件
,卸载了试试 12
软件
要使用其他相关的
软件
有问题 重装相关
软件
,比如播放某一格式的文件时出错,可能是这个文件的解码器有问题 13 病毒问题 杀毒 14 杀毒
软件
与系统或
软件
相冲突 由于杀毒
软件
是进入底层监控系统的,可能与一些
软件
相冲突,卸载试试 15 系统本身有问题 有时候操作系统本身也会有BUG,要注意
安装
官方发行的更新程序,象SP的补丁,最好打上.如果还不行,重装系统,或更换其他版本的系统。 〔又一说〕 在控制面板的添加/删除程序中看看你是否
安装
了微软NET.Framework,如果已经
安装
了,可以考虑卸载它,当然如果你以后在其它程序需要NET.Framework时候,可以再重新
安装
。 另外,如果你用的是ATI显卡并且你用的是SP2的补丁(一些ATI的显卡驱动需要在NET.Framework正常工作的环境下)。这种情况你可以找一款不需要NET.Framework支持的ATI显卡驱动。 如果以上两种
方法
并
不能
完全
解决
问题,你试着用一下“IE修复”
软件
,并可以查查是否有病毒之类的。 〔微软NET.Framework升级到1.1版应该没问题了〕 〔还有一说〕
方法
一: 微软新闻组的朋友指点:开始--运行:regsvr32 jscript.dll 开始--运行:regsvr32 vbscript.dll 不过没
解决
---但提供了路子-----一次运行注册所有dll 搜索查找到
方法
如下: 运行 输入cmd 回车在命令
提示
符下输入 for %1 in (%
win
dir%system32*.dll) do regsvr32.exe /s %1 这个命令老兄你慢慢输 输入正确的话会看到飞快地滚屏 否则……否则失败就是没这效果。回车后慢慢等(需要点时间1-2分钟) 都运行完再打开看
方法
二: 这是个典型问题~~~~~引起这个问题的原因很多。一般来讲就是给系统打上补丁和更换
内存
、给
内存
换个插槽这3种
方法
来
解决
。[系统补丁只要到Microsoft Update网站在线更新就可以了] 造成这种问题的原因很多,
不能
单纯的下结论,尽量做到以下几点可能对你有帮助: 1。确保使用的是未修改过的
软件
(非汉化、破解版) 2。使用改
软件
时尽量不要运行其他
软件
。(这是个临时文件,可能某些
软件
也在使用临时文件夹,所以产生干扰) 3。把那些什么桌面工具,
内存
整理工具通通关掉(你至少有2个类似的工具在运行)” 处理
方法
: 运行regedit进入注册表, 在HKEY_LOCAL_MACHINESOFTWAREMicrosoft
Win
dowsCurrentVersionExplorerShellExecuteHooks 下,应该只有
一个
正常的键值"{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。 〔我个人的最后
解决
和看法〕 我今天尝试了多种办法,最后我发现问题出在微软的NET.Framework上面。我升级了这个
软件
,并打齐了补丁,短暂平安后,有出现“
内存
不能
为
read
”的情况。后来我受上面文章的启发,卸载了微软的NET.Framework1.0和1.1,世界太平了。 另外:如果是打开“我的电脑”、“我的文档”等的时候出现上述情况,还有一种可能,就是你的右键菜单太臃肿了,此时只要清理右键菜单问题就
解决
了。 -------------------------------------------------------------------------------- 〔试验的结果〕 上面的
方法
,最管用、最彻底的
方法
是这个: 运行 输入cmd 回车在命令
提示
符下输入 for %1 in (%
win
dir%system32*.dll) do regsvr32.exe /s %1 【技巧】如果怕输入错误的话,可以复制这条
指令
,然后在命令
提示
框点击左上角的c:,使用下面的“编辑-粘贴”功能就不容易输错了。在飞速滚屏完全静止之后,别着急启动其他程序,先耐心等一会儿,因为此时dll们还在找位置。直到你的指示灯不闪了再做别的。 其他建议 使用
Win
dows操作系统的人有时会遇到这样的错误信息:“0X????????
指令
引用
的0x00000000
内存
,该
内存
不能
written”,然后应用程序被关闭。如果去请教一些“高手”,得到的回答往往是“
Win
dows就是这样不稳定”之类的义愤和不屑。其实,这个错误并不一定是
Win
dows不稳定造成的。本文就来简单分析这种错误的常见原因。 一、应用程序没有检查
内存
分配失败 程序需要一块
内存
用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果
内存
分配成功,函数就会将所新开辟的
内存
区地址返回给应用程序,应用程序就可以通过这个地址使用这块
内存
。这就是“动态
内存
分配”,
内存
地址也就是编程中的“指针”。
内存
不是永远都招之即来、用之不尽的,有时候
内存
分配也会失败。当分配失败时系统函数会返回
一个
0值,这时返回值“0”已不表示新启用的指针,而是系统向应用程序发出的
一个
通知,告知出现了错误。作为应用程序,在每一次申请
内存
后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。 若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用指针,继续在之后的运行中使用这块
内存
。真正的0地址
内存
区保存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即死机,而在健壮的操作系统中,如
Win
dows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的“写
内存
”错误,并指出被
引用
的
内存
地址为“0x00000000”。
内存
分配失败故障的原因很多,
内存
不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,
安装
了多种应用程序(包括无意中“
安装
”的病毒程序),更改了大量的系统参数和系统文件之后。 二、应用程序由于自身BUG
引用
了不正常的
内存
指针 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的
内存
,但不知为什么,这个预料中可用的指针已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己
0x00000000
内存
不能
为
read
修复工具
该
内存
不能
为“
read
”或“written
解决
方案 运行某些程序的时候,有时会出现
内存
错误的
提示
,然后该程序就关闭。 “0x????????”
指令
引用
的“0x????????”
内存
。该
内存
不能
为“
read
”。 “0x????????”
指令
引用
的“0x????????”
内存
,该
内存
不能
为“written”。 一般出现这个现象有方面的,一是硬件,即
内存
方面有问题,二是
软件
,这就有多方面的问题了。 故障分析 硬件方面: 一般来说,
内存
出现问题的可能性并不大,主要方面是:
内存
条坏了、
内存
质量有问题,还有就是 2 个不 同牌子不同容量的
内存
混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。你 可以使用MemTest 这个
软件
来检测一下
内存
,它可以彻底的检测出
内存
的稳定度。 假如是双
内存
,而且是不同品牌的
内存
条混插或者买了二手
内存
时,出现这个问题,这时,就要检查是不 是
内存
出问题了或者和其它硬件不兼容。
软件
方面: 先简单说说原理:
内存
有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间, 就会发生溢出现象。举个例子:
一个
桶子只能将一斤的水,当放入两斤的水进入时,就会溢出来。而系统 则是在屏幕上表现出来。这个问题,经常出现在
win
dows
2000
和 XP 系统上,
Win
dows
2000
/XP 对硬件的 要求是很苛刻的,一旦遇到资源死锁、溢出或者类似
Win
dows 98 里的非法操作,系统为保持稳定,就会出 现上述情况。另外也可能是硬件设备之间的兼容性不好造成的。 几个例子 例一:打开 IE 浏览器或者没过几分钟就会出现"0x70dcf39f"
指令
引用
的"0x00000000"
内存
。该
内存
不能
为 “
read
”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中
一个
窗口即将关闭”的信息框,关闭该
提示
信息后,IE浏览器也被关闭。
解决
方法
:修复或升级 IE 浏览器,同时打上补丁。看过其中
一个
修复
方法
是,
Win
2000
自升级,也就是
Win
2000
升级到
Win
2000
,其实这种
方法
也就是把系统还原到系统初始的状态下。比如你的IE升级到了6.0, 自升级后,会被IE5.0代替。 例二:在
win
dows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”
指令
引用
的“0x00000078”内 存。该
内存
不能
为“written”,要终止程序,请单击“确定”,而在
Win
dows 98里运行却正常。
解决
方法
:这可能是系统的兼容性问题,
win
XP 的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用 兼容模式运行这个程序”项选择上,并选择“
Win
dows 98/Me”。
win
2000
如果打了SP的补丁后,只要开始, 运行,输入:regsvr32 c:\
win
nt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”
指令
引用
的 “0xffffffff”
内存
。该
内存
不能
为“
read
” 的
提示
。
解决
方法
:当使用的输入法为微软拼音输入法 2003,并且隐藏语言栏时(不隐藏时没问题)关闭 RealOne 就会出现这个问题,因此在关闭 RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来解 决这个问题。 例四:我的豪杰超级解霸自从上网后就
不能
播放了,每次都
提示
“Ox060692f6”(每次变化)
指令
引用
的 “Oxff000011”
内存
不能
为“
read
”,终止程序请按确定。
解决
方法
:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好 换就用别的播放器试试了。 例五:双击
一个
游戏的快捷方式,“Ox77f5cdO”
指令
引用
“Oxffffffff”
内存
,该
内存
不能
为“
read
” ,并且
提示
Client.dat程序错误。
解决
方法
:重装显卡的最新驱动程序,然后下载并且
安装
DirectX9.0。 例六:
一个
朋友发信息过来,我的电脑便出现了错误信息:“0*772b548f”
指令
引用
的“0*00303033”
内存
,该
内存
不能
为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。
解决
方法
:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本, 就没事了。 例七:我的笔记本电脑用的XP系统,有时关闭网页时会弹出tbrowser.exe遇到问题需要关闭,然后有弹出 0x03e7c738
指令
引用
的0x03e7c738
内存
,该
内存
不能
为
read
,请问是怎么回事?
解决
方法
:先查杀一下病毒,另外如果你
安装
了浏
内存
不为
read
的修复工具
首先建议: 1、 检查系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。 2、 更新操作系统,让操作系统的
安装
程序重新拷贝正确版本的系统档案、修正系统参数。有时候操作系统本身也会有BUG,要注意
安装
官方发行的升级程序。 3、 尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。 4、 删除然后重新创建
Win
nt\System32\Wbem\Repository 文件夹中的文件:在桌面上右击我的电脑,然后单击管理。在"服务和应用程序"下,单击服务,然后关闭并停止
Win
dows Management Instrumentation 服务。 删除
Win
nt\System32\Wbem\Repository 文件夹中的所有文件。(在删除前请创建这些文件的备份副本。)打开"服务和应用程序",单击服务,然后打开并启动
Win
dows Management Instrumentation 服务。当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs 下面搜集几个例子给大家分析: 例一:IE浏览器出现“0x0a8ba9ef”
指令
引用
的“0x03713644”
内存
,或者“0x70dcf39f”
指令
引用
的“0x00000000”
内存
。该
内存
不能
为“
read
”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中
一个
窗口即将关闭”的信息框,关闭该
提示
信息后,IE浏览器也被关闭。
解决
方法
: 1、 开始-运行窗口,输入“regsvr32 actxprxy.dll”回车,接着会出现
一个
信息对话 框“DllRegisterServer in actxprxy.dll succeeded”,确定。再依次运行以下命令。(这个
方法
有人说没必要,但重新注册一下那些.dll对系统也没有坏处,反正多方下手,能
解决
问题就行。) regsvr32 shdocvw.dll regsvr32 oleaut32.dll regsvr32 actxprxy.dll regsvr32 mshtml.dll regsvr32 msjava.dll regsvr32 browseui.dll regsvr32 urlmon.dll 2、 修复或升级IE浏览器,同时打上系统补丁。看过其中
一个
修复
方法
是,把系统还原到系统初始的状态下。建议将IE升级到了6.0。 例二:有些应用程序错误: “0x7cd64998”
指令
参考的 “0x14c96730”
内存
。该
内存
不能
为 “
read
”。
解决
方法
:
Win
XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每
一个
应用程序的前几次启动情况进行分析,然后新增
一个
描述套用需求的虚拟“
内存
映像”,并把这些信息储存到
Win
dows\Prefetch文件夹。一旦建立了映像,应用
软件
的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用
软件
启动的信息。建议将虚拟
内存
撤换,删除
Win
dows\Prefetch目录下所有*.PF文件,让
win
dows重新收集程序的物理地址。 例三:在XP下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”
指令
引用
的“0x00000078”
内存
。该
内存
不能
为 “written”,要终止程序,请单击“确定”,而在
Win
dows 98里运行却正常。
解决
方法
:这可能是系统的兼容性问题,
win
XP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“
Win
dows 98/Me”。
win
2000
如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\
win
nt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。 例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”
指令
引用
的“0xffffffff”
内存
。该
内存
不能
为 “
read
” 的
提示
。
解决
方法
:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne 之前可以显示语言栏或者将任意其他输入法作为当前输入法来
解决
这个问题。 例五:我的豪杰超级解霸自从上网后就
不能
播放了,每次都
提示
“0x060692f6”(每次变化)
指令
引用
的“0xff000011”
内存
不能
为 “
read
”,终止程序请按确定。
解决
方法
:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。 例六:双击
一个
游戏的快捷方式,“0x77f5cd0”
指令
引用
“0xffffffff”内 存,该
内存
不能
为“
read
” ,并且
提示
Client.dat程序错误。
解决
方法
:重装显卡的最新驱动程序,然后下载并且
安装
DirectX9.0。 例七:
一个
朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”
指令
引用
的“0x00303033”
内存
,该
内存
不能
为 “written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。
解决
方法
:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。
win
dows用户称拦截api
Win
dows用户层下拦截api的原理与实现(附源码) (2008-03-29 16:15:07)转载▼ 标签: computer 杂谈 声明:本页所发布的技术文章及其附件,供自由技术传播,拒绝商业使用。本页文章及其附件的所有权归属本文作者,任何使用文档中所介绍技术者对其后果自行负责,本文作者不对其承担任何责任。 Email:redcoder163.com 目录 1 摘要 2
win
2000
和xp的
内存
结构和进程地址空间 3 函数堆栈的一些知识 4 关于拦截的整体思路 5 附件代码下载以及说明 一:摘要 拦截api的技术有很多种,大体分为用户层和内核层的拦截.这里只说说用户层的拦截(内核层也可以用,关键是让你的拦截程序获得ring0特权).而用户层也分为许多种:修改PE文件导入表,直接修改要拦截的api的
内存
(从开始到最后,使程序跳转到指定的地址执行).不过大部分原理都是修改程序流程,使之跳转到你要执行的地方,然后再返回到原地址.原来api的功能必须还能实现.否则拦截就失去作用了.修改文件导入表的
方法
的缺点是如果用户程序动态加载(使用LoadLibrary和GetProcAddress函数),拦截将变得复杂一些.所以这里介绍一下第二种
方法
,直接修改api,当然不是全局的.(后面会说到) 需要了解的一些知识: 1.
win
dows
内存
的结构属性和进程地址空间 2.函数堆栈的一些知识 二:
win
2000
和xp的
内存
结构和进程地址空间
win
dows采用4GB平坦虚拟地址空间的做法。即每个进程单独拥有4GB的地址空间。每个进程只能访问自己的这4GB的虚拟空间,而对于其他进程的地址空间则是不可见的。这样保证了进程的安全性和稳定性。但是,这4GB的空间是
一个
虚拟空间,在使用之前,我们必须先保留一段虚拟地址,然后再为这段虚拟地址提交物理存储器。可是我们的
内存
大部分都还没有1GB,那么这4GB的地址空间是如何实现的呢?事实上
win
dows采用的
内存
映射这种
方法
,即把物理磁盘当作
内存
来使用,比如我们打开
一个
可执行文件的时候,操作系统会为我们开辟这个4GB的地址空间:0x00000000--0xffffffff。其中0x00000000--0x7fffffff是属于用户层的空间.0x80000000--0xffffffff则属于共享内核方式分区,主要是操作系统的线程调度,
内存
管理,文件系统支持,网络支持和所有设备驱动程序。对于用户层的进程,这些地址空间是不可访问的。任何访问都将导致
一个
错误。开辟这4GB的虚拟地址空间之后,系统会把磁盘上的执行文件映射到进程的地址空间中去(一般是在地址0x00400000,可以通过修改编译选项来修改这个地址)而
一个
进程运行所需要的动态库文件则一般从0x10000000开始加载。但是如果所有的动态库都加载到这个位置肯定会引起冲突。因此必须对一些可能引起冲突的dll编译时重新修改基地址。但是对于所有的操作系统所提供的动态库
win
dows已经定义好了映射在指定的位置。这个位置会随着版本的不同而会有所改变,不过对于同一台机器上的映射地址来说都是一样的。即在a进程里映射的kernel32.dll的地址和在进程b里的kernel32.dll的地址是一样的。对于文件映射是一种特殊的方式,使得程序不需要进行磁盘i/o就能对磁盘文件进行操作,而且支持多种保护属性。对于
一个
被映射的文件,主要是使用CreateFileMapping函数,利用他我们可以设定一些读写属性:PAGE_
READ
ONLY,PAGE_
READ
WRITE,PAGE_WRITECOPY.第一参数指定只能对该映射文件进行读操作。任何写操作将导致
内存
访问错误。第二个参数则指明可以对映射文件进行读写。这时候,任何对文件的读写都是直接操作文件的。而对于第三个参数PAGE_WRITECOPY顾名思义就是写入时拷贝,任何向这段
内存
写入的操作(因为文件是映射到进程地址空间的,对这段空间的读写就相当于对文件进行的直接读写)都将被系统捕获,并重新在你的虚拟地址空间重新保留并分配一段
内存
,你所写入的一切东西都将在这里,而且你原先的指向映射文件的
内存
地址也会实际指向这段重新分配的
内存
,于是在进程结束后,映射文件内容并没有改变,只是在运行期间在那段私有拷贝的
内存
里面存在着你修改的内容。
win
dows进程运行所需要映射的一些系统dll就是以这种方式映射的,比如常用的ntdll.dll,kernel32.dll,gdi32.dll.几乎所有的进程都会加载这三个动态库。如果你在
一个
进程里修改这个映射文件的内容,并不会影响到其他的进程使用他们。你所修改的只是在本进程的地址空间之内的。事实上原始文件并没有被改变。 这样,在后面的修改系统api的时候,实际就是修改这些动态库地址内的内容。前面说到这不是修改全局api就是这个原因,因为他们都是以写入时拷贝的方式来映射的。不过这已经足够了,
win
dows提供了2个强大的
内存
操作函数
Read
ProcessMemory和WriteProcessMemory.利用这两个函数我们就可以随便对任意进程的任意用户地址空间进行读写了。但是,现在有
一个
问题,我们该写什么,说了半天,怎么实现跳转呢?现在来看
一个
简单的例子: MessageBox(NULL, "World", "Hello", 0); 我们在执行这条语句的时候,调用了系统api MessageBox,实际上在程序中我没有定义UNICODE宏,系统调用的是MessageBox的ANSI版本MessageBoxA,这个函数是由user32.dll导出的。下面是执行这条语句的汇编代码: 0040102A push 0 0040102C push offset string "Hello" (0041f024) 00401031 push offset string "World" (0041f01c) 00401036 push 0 00401038 call dword ptr [__imp__MessageBoxA@16 (0042428c)] 前面四条
指令
分别为参数压栈,因为MessageBoxA是__stdcall调用约定,所以参数是从右往左压栈的。最后再CALL 0x0042428c 看看0042428c这段
内存
的值: 0042428C 0B 05 D5 77 00 00 00 可以看到这个值0x77d5050b,正是user32.dll导出函数MessageBoxA的入口地址。 这是0x77D5050B处的内容, 77D5050B 8B FF mov edi,edi 77D5050D 55 push ebp 77D5050E 8B EC mov ebp,esp 理论上只要改变api入口和出口的任何机器码,都可以拦截该api。这里我选择最简单的修改
方法
,直接修改qpi入口的前十个字节来实现跳转。为什么是十字节呢?其实修改多少字节都没有关系,只要实现了函数的跳转之后,你能把他们恢复并让他继续运行才是最重要的。在CPU的
指令
里,有几条
指令
可以改变程序的流程:JMP,CALL,INT,RET,RETF,IRET等
指令
。这里我选择CALL
指令
,因为他是以函数调用的方式来实现跳转的,这样可以带一些你需要的参数。到这里,我该说说函数的堆栈了。 总结:
win
dows进程所需要的动态库文件都是以写入时拷贝的方式映射到进程地址空间中的。这样,我们只能拦截指定的进程。修改目标进程地址空间中的指定api的入口和出口地址之间的任意数据,使之跳转到我们的拦截代码中去,然后再恢复这些字节,使之能顺利工作。 三:函数堆栈的一些知识 正如前面所看到MessageBoxA函数执行之前的汇编代码,首先将四个参数压栈,然后CALL MessageBoxA,这时候我们的线程堆栈看起来应该是这样的: | | <---ESP |返回地址| |参数1| |参数2| |参数3| |参数4| |.. | 我们再看MessageBoxA的汇编代码, 77D5050B 8B FF mov edi,edi 77D5050D 55 push ebp 77D5050E 8B EC mov ebp,esp 注意到堆栈的操作有PUSH ebp,这是保存当前的基址指针,以便一会儿恢复堆栈后返回调用线程时使用,然后再有mov ebp,esp就是把当前esp的值赋给ebp,这时候我们就可以使用 ebp+偏移 来表示堆栈中的数据,比如参数1就可以表示成[ebp+8],返回地址就可以表示成[ebp+4]..如果我们在拦截的时候要对这些参数和返回地址做任何处理,就可以使用这种
方法
。如果这个时候函数有局部变量的话,就通过减小ESP的值的方式来为之分配空间。接下来就是保存一些寄存器:EDI,ESI,EBX.要注意的是,函数堆栈是反方向生长的。这时候堆栈的样子: |....| |EDI| <---ESP |ESI| |EBX| |局部变量| |EBP | |返回地址| |参数1| |参数2| |参数3| |参数4| |.. | 在函数返回的时候,由函数自身来进行堆栈的清理,这时候清理的顺序和开始入栈的顺序恰恰相反,类似的汇编代码可能是这样的: pop edi pop esi pop ebx add esp, 4 pop ebp ret 0010 先恢复那些寄存器的值,然后通过增加ESP的值的方式来释放局部变量。这里可以用mov esp, ebp来实现清空所有局部变量和其他一些空闲分配空间。接着函数会恢复EBP的值,利用
指令
POP EBP来恢复该寄存器的值。接着函数运行ret 0010这个
指令
。该
指令
的意思是,函数把控制权交给当前栈顶的地址的
指令
,同时清理堆栈的16字节的参数。如果函数有返回值的话,那在EAX寄存器中保存着当前函数的返回值。如果是__cdecl调用方式,则执行ret
指令
,对于堆栈参数的处理交给调用线程去做。如wsprintf函数。 这个时候堆栈又恢复了原来的样子。线程得以继续往下执行... 在拦截api的过程之中
一个
重要的任务就是保证堆栈的正确性。你要理清每一步堆栈中发生了什么。 四:形成思路 呵呵,不知道你现在脑海是不是有什么想法。怎么去实现拦截
一个
api? 这里给出
一个
思路,事实上拦截的
方法
真的很多,理清了
一个
,其他的也就容易了。而且上面所说的2个关键知识,也可以以另外的形式来利用。 我以拦截CreateFile这个api为例子来简单说下这个思路吧: 首先,既然我们要拦截这个api就应该知道这个函数在
内存
中的位置吧,至少需要知道从哪儿入口。CreateFile这个函数是由kernel32.dll这个动态库导出的。我们可以使用下面的
方法
来获取他映射到
内存
中的地址: HMODULE hkernel32 = LoadLibrary("Kernel32.dll"); PVOID dwCreateFile = GetProcAddress(hkernei32, "CreateFileA"); 这就可以得到createfile的地址了,注意这里是获取的createfile的ansic版本。对于UNICODE版本的则获取CreateFileW。这时dwCreateFile的值就是他的地址了。对于其他进程中的createfile函数也是这个地址,前面说过
win
dows指定了他提供的所有的dll文件的加载地址。 接下来,我们该想办法实现跳转了。最简单的
方法
就是修改这个api入口处的代码了。但是我们该修改多少呢?修改的内容为什么呢?前面说过我们可以使用CALL的方式来实现跳转,这种
方法
的好处是可以为你的拦截函数提供
一个
或者多个参数。这里只要
一个
参数就足够了。带参数的函数调用的汇编代码是什么样子呢,前面也已经说了,类似与调用MessageBoxA时的代码: PUSH 参数地址 CALL 函数入口地址(这里为
一个
偏移地址) 执行这2条
指令
就能跳转到你要拦截的函数了,但是我们该修改成什么呢。首先,我们需要知道这2条
指令
的长度和具体的机器代码的值。其中PUSH对应0x68,而CALL
指令
对应的机器码为0xE8,而后面的则分别对应拦截函数的参数地址和函数的地址。注意第
一个
是
一个
直接的地址,而第二个则是
一个
相对地址。当然你也可以使用0xFF0x15这个CALL
指令
来进行直接地址的跳转。 下面就是计算这2个地址的值了, 对于参数和函数体的地址,要分情况而定,对于对本进程中api的拦截,则直接取地址就可以了。对于参数,可以先定义
一个
参数变量,然后取变量地址就ok了。 如果是想拦截其他进程中的api,则必须使用其他一些
方法
,最典型的
方法
是利用VirtualAllocEx函数来在其他进程中申请和提交
内存
空间。然后用WriteProcessMemory来分别把函数体和参数分别写入申请和分配的
内存
空间中去。然后再生成要修改的数据,最后用WriteProcessMemory来修改api入口,把入口的前10字节修改为刚刚生成的跳转数据。比如在远程进程中你写入的参数和函数体的
内存
地址分别为0x00010000和0x00011000,则生成的跳转数据为 68 00 00 01 00 E8 00 10 01 00(PUSH 00010000 CALL 00011000),这样程序运行createfile函数的时候将会先运行PUSH 00010000 CALL 00011000,这样就达到了跳转的目的。此刻我们应该时刻注意堆栈的状态,对于CreateFile有 HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); 可以看到其有7个参数,于是在调用之前,堆栈应该已经被压入了这7个参数,堆栈的样子: |....| <---ESP |createfile执行后的下一条
指令
地址| |参数1| |参数2| |参数3| |参数4| |参数5| |参数6| |参数7| |..| 这是执行到我们的跳转语句:PUSH 00010000,于是堆栈又变了: |....| <---ESP |00010000| |createfile执行后的下一条
指令
地址| |参数1| |参数2| |参数3| |参数4| |参数5| |参数6| |参数7| |..| 接着执行CALL 00011000,堆栈变为: |...| <---ESP |api入口之后的第六个字节的
指令
的地址| |00010000| |createfile执行后的下一条
指令
地址| |参数1| |参数2| |参数3| |参数4| |参数5| |参数6| |参数7| |..| 接下来就到了我们的拦截函数中拉,当然,函数肯定也会做一些类似动作,把EBP压栈,为局部变量分配空间等。这时候堆栈的样子又变了: |EDI| <---ESP |ESI| |EBX| |局部变量| |EBP| dwMessageBox; pfnMessageBox(NULL, PFileName, PFileName, MB_ICONINFORMATION |MB_OK); //输出要打开的文件的路径..... } 对于你要使用的其他函数,都是使用同样的方式,利用这个参数来传递我们要传递的函数的绝对地址,然后定义这个函数指针,就可以使用了。 好了,接下来我们该让被拦截的api正常工作了,这个不难,把他原来的数据恢复一下就可以了。那入口的10个字节。我们在改写他们的时候应该保存一下,然后也把他放在参数中传递给拦截函数,呵呵,参数的作用可多了。接着我们就可以用WriteProcessMemory函数来恢复这个api的入口了,代码如下: PFN_GETCURRENTPROCESS pfnGetCurrentProcess = (PFN_GETCURRENTPROCESS)pRP->dwGetCurrentProcess; PFN_WRITEPROCESSMEMORY pfnWriteProcessMemory = (PFN_WRITEPROCESSMEMORY)pRP->dwWriteProcessMemory; if(!pfnWriteProcessMemory(pfnGetCurrentProcess(), (LPVOID)pfnConnect, (LPCVOID)pRP->szOldCode, 10, NULL)) pfnMessageBox(NULL, pRP->szModuleName1, pRP->szModuleName2, MB_ICONINFORMATION | MB_OK); 其中这些函数指针的定义和上面的类似。 而参数中的szoldcode则是在源程序中在修改api之前保存好,然后传给拦截函数,在源程序中是用
Read
ProcessMemory函数来获取他的前10个字节的:
Read
ProcessMemory(GetCurrentProcess(), (LPCVOID)RParam.dwCreateFile, oldcode, 10, &dwPid) strcat((char*)RParam.szOldCode, (char*)oldcode); 接下来如果你还继续保持对该api的拦截,则又该用WriteProcessMemory 来修改入口了,跟前面的恢复入口是一样的,只不过把szOldCode换成了szNewCode了而已。这样你又能对CreateFile继续拦截了。 好了,接下来该进行堆栈的清理了,也许你还要做点其他事情,尽管做去。但是清理堆栈是必须要做的,在函数结束的时候,因为在我们放任api恢复执行之后,他又return 到我们的函数中来了,这个时候的堆栈是什么样子呢? |EDI| <---ESP |ESI| |EBX| |局部变量| |EBP| <---EBP |api入口之后的第六个字节的
指令
的地址| |00010000| |createfile执行后的下一条
指令
地址| |参数1| |参数2| |参数3| |参数4| |参数5| |参数6| |参数7| |..| 我们的目标是把返回值记录下来放到EAX寄存器中去,把返回地址记录下来,同时把堆栈恢复成原来的样子。 首先我们恢复那些寄存器的值,接着释放局部变量,可以用mov esp, ebp.因为我们不清楚具体的局部变量分配了多少空间。所以使用这个
方法
。 __asm {POP EDI POP ESI POP EBX //恢复那些寄存器 MOV EDX, [NextIpAddr]//把返回地址放到EDX中,因为待会儿 //EBP被恢复后,线程中的所有局部变量就
不能
正常使用了。 MOV EAX, [RetValue]//返回值放到EAX中,当然也可以修改这个返回值 MOV ESP, EBP//清理局部变量 POP EBP//恢复EBP的值 ADD ESP, 28H //清理参数和返回地址,注意一共(7+1+1+1)*4 PUSH EDX //把返回地址压栈,这样栈中就只有这
一个
返回地址了,返回之后栈就空了 RET } 这样,一切就完成了,堆栈恢复了应该有的状态,而你想拦截的也拦截到了。 五:后记 拦截的方式多种多样,不过大体的思路却都相同。要时刻注意你要拦截的函数的堆栈状态以及在拦截函数中的对数据的
引用
和函数的调用(地址问题)。
北航实验报告实验实验.docx
实验三 UC-OS移植实验 一、实验目的 在内核移植了uCOS-II 的处理器上创建任务。 二、实验内容 1.运行实验十,在超级终端上观察四个任务的切换。 2. 任务1~3,每个控制"红"、"绿"、"蓝"一种颜色的显示,适当增加OSTimeDly()的时间,且优先级高的任务延时时间加长,以便看清三种颜色。 引入
一个
全局变量 BOOLEAN ac_key,
解决
完整刷屏问题。 4. #define rUTRSTAT0 (*(volatile unsigned *)0x50000010) #define RdURXH0() (*(volatile unsigned char *)0x50000024) 当键盘有输入时在超级终端上显示相应的字符。 三、实验设备 硬件:ARM嵌入式开发平台、用于ARM920T的JTAG仿真器、PC机Pentium100以上。
软件
:PC机操作系统
Win
2000
或
Win
XP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。 四、实验原理 所谓移植,指的是
一个
操作系统可以在某个微处理器或者微控制器上运行。虽然uCOS-II的大部分源代码是用C语言写成的,仍需要用C语言和汇编语言完成一些与处理器相关的代码。比如:uCOS-II在读写处理器、寄存器时只能通过汇编语言来实现。因为uCOS-II在设计的时候就己经充分考虑了可移植性,所以,uCOS-II的移植还是比较容易的。 要使uCOS一工工可以正常工作,处理器必须满足以下要求: 1)处理器的C编译器能产生可重入代码。 2)在程序中可以打开或者关闭中断。 3)处理器支持中断,并A能产生定时中断(通常在10Hz}1000Hz之间)。 4)处理器支持能够容纳一定量数据的硬件堆栈。 北航实验报告实验实验全文共6页,当前为第1页。5) 处理器有将堆栈指针和其它CPU寄存器存储和读出到堆栈(或者
内存
)的
指令
。 北航实验报告实验实验全文共6页,当前为第1页。 uCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另
一个
任务的堆栈中恢复原来的工作寄存器,继续运行另
一个
任务。所以,寄存器的入栈和出栈是uCOS一工工多任务调度的基础。 五、实验步骤 1 以实验十为模板,将实验六 inc目录下的LCD320.H 和src目录下的LCD640.C拷到 模板下的相应目录,将LCD640.C加入工程中。 包含以下头文件 #include "inc/lcd320.h"。 改LCD640.C 文件中包含头文件的路径 。 #include "../inc/drv/reg2410.h" 4 声明
引用
的变量 extern U32 LCDBufferII2[LCDHEIGHT][LCDWIDTH]; 源程序 #include"../ucos-ii/includes.h" /* uC/OS interface */ #include "../ucos-ii/add/osaddition.h" #include "../inc/drivers.h" #include "../inc/sys/lib.h" #include "../src/gui/gui.h" #include "../inc/lcd320.h" #include
#include
//#include "..inc/lcd320.h" //#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting OS_EVENT *MboxSem; ///******************任务定义***************/// /*OS_STK SYS_Task_Stack[STACKSIZE]= {0, }; //system task刷新任务堆栈 #define SYS_Task_Prio 1 void SYS_Task(void *Id);*/ OS_STK task1_Stack[STACKSIZE]={0, }; //Main_Test_Task堆栈 void Task1(void *Id); //Main_Test_Task #define Task1_Prio 12 北航实验报告实验实验全文共6页,当前为第2页。OS_STK task2_Stack[STACKSIZE]={0, }; //test_Test_Task堆栈 北航实验报告实验实验全文共6页,当前为第2页。 void Task2(void *Id); //test_Test_Task #define Task2_Prio 15 OS_STK task3_Stack
ASP
28,391
社区成员
357,060
社区内容
发帖
与我相关
我的任务
ASP
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
复制链接
扫一扫
分享
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章