首页
社区
课程
招聘
[求助] 请问在这种情况下,GS段寄存器是如何被修改的?
发表于: 2019-2-27 20:38 3847

[求助] 请问在这种情况下,GS段寄存器是如何被修改的?

2019-2-27 20:38
3847

在64位Windows上运行32位程序,GS段寄存器的内容将会是0x2B。

虽然可以暂时修改GS的内容,但很快GS的内容又会变成0x2B。

请问GS段寄存器到底是在什么地方被修改的?


问这个问题的原因是因为有一段程序必须在GS=0的情况下才能正常运行,为此我在程序的开头加了一句指令,手动把GS设置成0。

现在这段程序在大多数情况下都能正常运行,但是偶尔会出错。而调查出错的情况,发现都是因为GS中途又变回0x2B了。


P.S. 可以很容易观察到这个现象:在64位Windows上用调试器调试任意一个Win32程序,会发现GS一直是0x2B。哪怕手动改成0,step一下就又变成0x2B了(这是否意味着GS是在比调试器优先级更高的地方被修改的呢?)


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-2-27 20:42 被knightprf编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
KeContextToKframes KeContextFromKframes
2019-2-27 22:37
1
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3

用调试器修改eax和gs的值,然后step,会发现eax的值正常保留,而gs的值变回0x2b。

搞不懂一个win32程序为啥对gs这么执着。。。

最后于 2019-2-28 00:23 被knightprf编辑 ,原因:
2019-2-28 00:14
1
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
小艾 KeContextToKframes KeContextFromKframes
多谢回复。这两个函数好像确实有能力越过调试器把GS改回来。

不过感觉道理上说不通,因为类似于这种“保存状态并恢复”的函数,
应该会把已经改为0的GS保存下来。中间GS可能会变,但最后会恢复为保存下来的值。
在应用程序看来,GS改为0后就一直是0。

而实际情况是在应用程序把GS改为0以后,很快GS又会变为0x2b。
2019-2-28 00:16
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
knightprf 多谢回复。这两个函数好像确实有能力越过调试器把GS改回来。 不过感觉道理上说不通,因为类似于这种“保存状态并恢复”的函数, 应该会把已经改为0的GS保存下来。中间GS可能会变,但最后会恢复为保 ...
gs是被强制指定的,应该不是简单的保存+恢复
2019-2-28 06:57
1
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
knightprf 多谢回复。这两个函数好像确实有能力越过调试器把GS改回来。 不过感觉道理上说不通,因为类似于这种“保存状态并恢复”的函数, 应该会把已经改为0的GS保存下来。中间GS可能会变,但最后会恢复为保 ...
直接指定的,并不是保存,R0直接指定GS=2B然后把处理权限交给R3, NTDLL->WOW64->X86(若GS != 2B)会爆炸.
2019-2-28 08:27
1
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
原来是这样啊
2019-2-28 09:50
0
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
现在的情况如下:
1. 把GS设成0
2. 运行我的代码
3. 把GS设回0x2B
以上代码运行在R3。一旦运行的过程中偶尔进入了R0,GS就会被重置,回到R3后程序已经无法正常运行了。

有没有办法捕获 R0回到R3这个时间点?(能的话想在这个时间点再次把GS设为0)
2019-2-28 10:04
0
雪    币: 12848
活跃值: (9142)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
9
knightprf 现在的情况如下: 1. 把GS设成0 2. 运行我的代码 3. 把GS设回0x2B 以上代码运行在R3。一旦运行的过程中偶尔进入了R0,GS就会被重置,回到R3后程序已经无法正常运行了。 ...
那你还不如patch掉内核强制指定gs的那块代码 做个hook 然后自己做判断
2019-3-2 09:27
0
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
hzqst 那你还不如patch掉内核强制指定gs的那块代码 做个hook 然后自己做判断
谢谢,主要是希望在发生上下文切换后,回到程序的时候程序能感知,但好像Windows没有提供正常途径实现这一点。可能只有patch内核了
2019-3-2 16:33
0
游客
登录 | 注册 方可回帖
返回
//