首页
社区
课程
招聘
[求助]通过UserSharedData读TickCount的疑惑
发表于: 2014-4-28 21:17 7290

[求助]通过UserSharedData读TickCount的疑惑

2014-4-28 21:17
7290
遇到一个奇怪的问题,查了一天也没什么结果(可能是方法不对),于是到这里求助,希望知道的朋友能够帮我解决这个问题。
根据论坛中大神的帖子,用内嵌汇编的方式去实现了GetTickCount,代码如下
DWORD tick;
__asm
{
	mov edx, 7FFE0000h
	mov eax, dword ptr ds:[edx]
	mul dword ptr ds:[edx+4]
	shrd eax, edx, 18h
	mov tick, eax
}
return tick;

昨天在XP上面调试的,一切正常,用变速齿轮无法改变我程序的计时器。
今天拿到Win7 32位上试了一下,发现得到的tick count都是0。本来以为是UserSharedData的数据结构在Win7上不一样了,特地下载了一个WDK,看了下ntddk.h,这个结构并没有变化。于是加打印看了下
TRACE(_T("LowDeprecated:%d Multiplier:%d\n"), *((DWORD*) 0x7ffe0000), *((DWORD*) 0x7ffe0004));

发现,打印如下:
LowDeprecated:0 Multiplier:261726247
LowDeprecated:0 Multiplier:261726247
LowDeprecated:0 Multiplier:261726247
TickCountLowDeprecated这个值一直是0。

希望有知道的朋友能帮忙解决这个问题,先行谢过了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 357
活跃值: (3123)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
2
win7 64

7D858C96 GetTickCount      /EB 02           JMP SHORT 7D858C9A
7D858C98                   |F3:             PREFIX REP:                              ; Superfluous prefix
7D858C99                   |90              NOP
7D858C9A                   \8B0D 2403FE7F   MOV ECX,[7FFE0324]
7D858CA0                    8B15 2003FE7F   MOV EDX,[7FFE0320]
7D858CA6                    A1 2803FE7F     MOV EAX,[7FFE0328]
7D858CAB                    3BC8            CMP ECX,EAX
7D858CAD                  ^ 75 E9           JNZ SHORT 7D858C98
7D858CAF                    A1 0400FE7F     MOV EAX,[7FFE0004]
7D858CB4                    F7E2            MUL EDX
7D858CB6                    C1E1 08         SHL ECX,8
7D858CB9                    0FAF0D 0400FE7F IMUL ECX,[7FFE0004]
7D858CC0                    0FACD0 18       SHRD EAX,EDX,18
7D858CC4                    C1EA 18         SHR EDX,18
7D858CC7                    03C1            ADD EAX,ECX
7D858CC9                    C3              RETN
2014-4-28 21:54
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢你的回复。我对这段CMP ECX,EAX这句有些疑惑,如果地址7FFE0324中的值(MOV到ECX)和地址7FFE0328中的值(MOV到EAX)不相等的话,JNZ SHORT 7D858C98岂不是会永远成立?这样不会是一个死循环吗?
2014-4-28 22:32
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我将这段汇编内嵌后,用VS2010调试,运行会卡死。用单步调试发现确实是卡死在cmp ecx, eax,eax和ecx的值总是差一点点。
2014-4-28 22:53
0
雪    币: 357
活跃值: (3123)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
5
那是系统的GetTickCount api反汇编,你以为那是我自己写的吗
2014-4-28 23:01
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
解决了,怪我汇编水平差。。。嵌入的汇编寻址方式没搞对。。。我开始直接按照你贴的反汇编代码,写的
mov ecx, [7FFE0324h]

后来突然意识到,貌似立即数加方括号不能当做偏移地址。。。于是改成了
mov ecx, ds:[7FFE0324h]

然后就好了,谢谢你贴的代码。
2014-4-28 23:09
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
全局加速那种一样可以加速你的程序
2014-4-29 02:10
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
能说一下思路吗?
2014-4-29 09:48
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
UserSharedData对于用户来说不是一块只读的内存区域吗,你说的全局加速难道是指有办法可以直接篡改UserSharedData中的数据?
2014-4-29 12:42
0
游客
登录 | 注册 方可回帖
返回
//