请问如何修改内存的属性

TeddyWing 2002-03-29 04:34:38
我用VC写了一个程序,通过PE文件的导入表修改导入函数的地址,在debug状态下修改成功,但转到release状态下以后,修改函数地址的时候发生了非法访问的错误,这是为什么?有什么办法可以改掉这段内存的只读属性吗?
...全文
469 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wowocock 2002-03-30
  • 打赏
  • 举报
回复
我只在WIN9X下试过,由于我的机器太破,所以没有试过2000,不过在2000下有
太多的限制,可能没那么容易,而且一般不用驱动程序恐怕无法进RING0,不过
我想如果在80X86的机器上实现的保护,无外于段级保护加页级保护,WIN9X之所以
脆弱,就是应为它没有采用页级保护,一般来说只要能进RING0就可以修改任何东西,即使无法修改,也是以为其物理页属性为只读,而且CR0的WP位为1,只要在RING0中修改该位,就可以做任何事了。估计NT下也是那么作的。
TeddyWing 2002-03-30
  • 打赏
  • 举报
回复
问题已经解决了,我直接修改了PE的Section表中对应Section(.rdata)的属性,将只读改为了可读可写,不过,wowocock(机器猫)你提到的修改该地址所映射的物理地址的页属性的实现复杂吗?要作线性地址到物理地址的转换?这个转换本身似乎不太复杂,但在Ring0是不是可以访问PTD?我不太清楚,请你解释一下。
我用的是Win2000/SP2。
wowocock 2002-03-29
  • 打赏
  • 举报
回复
一般情况下,所有的API函数都是只读的,你用SOFTICE的PAGE 函数名可以看到
所有的函数属性都是用户,只读,也就是说你在RING3下无法修改,解决的方法只有2种,1是进入RING0层去修改,当然前提是你的CR0寄存器的WP位为0,不然进RING0也没用,还有就是修改该地址所映射的物理地址的页属性,改为用户,可读写,就可以了,关于线性地址到物理地址的转换,你可以参考我以前的一个问题,
让WIN9X和NT一样坚固,在里面我通过修改GDT,IDT的页属性达到防止所有WIN9X下RING0层病毒的目的。
TeddyWing 2002-03-29
  • 打赏
  • 举报
回复
忘了说清楚,修改是在程序加载的时候进行的(实际上是通过加载一个动态库:DLL_PROCESS_ATTACH 的时候来实现的),因为我想截获一些API函数的调用。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧