Windows x64上的x86重定向

0x00 背景

搬砖过程中遇到一个很奇怪的现象。写了一个程序利用命令regedit来读取注册表的某项值,出现了一个奇怪的现象:在某些电脑上能读到值,在另一些电脑上无法读取。

0x01 排查过程

在无法读取的机器上手动查看,注册表确实是有这个值的。百思不得其解,猜测可能是权限的问题。

  • 设置了注册表访问权限
  • 程序使用管理员权限运行

试了以上两种方法还是不行。

思考是否为进程权限太低?于是使用Processexp看一下进程的权限。当看到进程路径时,看出了一点端倪。 在x86的机器上,我们程序调用的regedit的路径是C:\windows\regedit.exe;而在x86_64上,程序调用的regedit的路径是C:\windows\SysWOW64\regedit.exe

用实例程序分别编译为32bit和64bit演示一下,不同的程序运行的系统命令所在的路径。

#include<stdio.h>#include<stdlib.h>int main(){ system("cmd"); return 0;}

其中SysWOW64(System Windows on Windows64)是windows的一个兼容层,用来在x86_64的机器上运行x86程序。说白了就是在64bit操作系统上运行32bit程序。因为我们的程序是32bit的,所以在32bit程序中调用的系统程序也是32bit的。

正巧程序读取的注册表键值在64bit版的regedit上可以读取,而在32bit版本的regedit上无法读取,这就造成了开头的问题。

0x02 解决方法

解决方法有两种:

  • 将程序编译成64bit的
  • 使用关闭重定向的函数Wow64DisableWow64FsRedirection

第一种方法当然简单粗暴,但是在x86的系统上却无法运行,只能寻求第二种方法。

#include<stdio.h>#include<stdlib.h>#include<windows.h>int main(){ PVOID OldVal = NULL; if (Wow64DisableWow64FsRedirection(&OldVal)) { system("cmd"); } if (FALSE == Wow64RevertWow64FsRedirection(OldVal)) { return 1; } return 0;}

可以看到启动的cmd已经是64bit的了。

注意,关闭重定向后完成相关操作一定要恢复重定向,一定要恢复重定向,一定要恢复重定向,重要的事情说三遍,若不恢复的话会导致一些dll等调用失败。

0x03 x86 Redirect in x86_64

wow64其实相当于64bit系统的一个子系统,用来兼容32bit的程序。32bit程序运行时会收到重定向的影响,这个重定向主要分为:

  • 文件重定向

当32bit程序运行时,会存在以下的重定向规则。

访问

重定向

%systemroot%/system32

%systemroot%/SysWOW64

比如,当32bit程序访问calc.exe时,本应访问

C:\windows\system32\calc.exe

但是由于重定向机制,会被重定向到

C:\windwos\SysWOW64\calc.exe

  • 注册表重定向

不多说,想了解的话看看微软的文章。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384253(v=vs.85).aspx

0x04 Refer

http://blog.csdn.net/magictong/article/details/5892209 http://www.cnblogs.com/lhglihuagang/p/3930874.html http://www.tuicool.com/articles/Ibui6bZ

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目

3110
来自专栏京东技术

开发属于自己的插件 | IDEA &amp; Android Studio插件开发指南

谷轩宇——从事安卓开发,目前效力于通天塔技术开放组是否曾经被ide重复繁琐的操作所困扰,又或者没有心仪的UI控件而难受。那么请阅读这篇文章,掌握idea插件的开...

8332
来自专栏转载gongluck的CSDN博客

程序的入口

操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接...

3749
来自专栏静默虚空的博客

Eclipse 实用技巧

代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Aut...

2137
来自专栏大内老A

关于WCF的一个非常“无语”的BUG!

这确实是一个让人觉得“无语”的BUG,甚至让我觉得微软在故意和我们开玩笑。这个问题在我刚刚接触WCF的时候就遇到过,换言之,这个问题一直存在于.NET 3.0、...

2017
来自专栏我和未来有约会

Silverlight体积优化

Silverlight体积优化 Silverlight是运行在客户端的富媒体应用程序,他可以使表现形式更加的丰富多彩,相应的开发人员需要写大量的XAML、代买...

2208
来自专栏Alice

1、大部分社交平台接口不支持https协议。

参考文献来自:http://wiki.mob.com/ios9-%E5%AF%B9sharesdk%E7%9A%84%E5%BD%B1%E5%93%8D%EF%...

3605
来自专栏PHP在线

Redis 和 Memcached 的区别

说到redis就会联想到memcached,反之亦然。了解过两者的同学有那么个大致的印象:redis与memcached相比,比仅支持简单的key-value数...

4346
来自专栏王磊的博客

NBear简介与使用图解

NBear简介与使用图解 框架类型:ORM映射框架 简介:NBear是一个基于.Net 2.0、C#2.0开放全部源代码的的软件开发框架类库。NBear的设计目...

42712
来自专栏张善友的专栏

Redis 起步

Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章: 1.Redis简介 ? Redis是一个key-value...

2058

扫码关注云+社区

领取腾讯云代金券