變速齒輪通過修改API函數GETTICKCOUNT和TIMEGETTIME騙過了游戲和程序的定時器導致游戲和程序速度看起來被改變。
下面以GETTICKCOUNT為例進行分析:原本的GETTICKCOUNT匯編:
kernel32!gettickcount mov gs,[bffcaea18]
mov eax,gs:[00000000]
sub edx,edx
mov gs,dx
ret
變速齒輪修改后的GETTICKCOUNT匯編:
kernel32!gettickcount
這里是關鍵-->jmp 840500d9(840500d9并不是絕對的)
add [eax],al
add [ecx+00000000],ah
sub edx,edx
mov gs,dx
ret
可以看出變速齒輪修改了gettickcount的代碼,當游戲和程序使用gettickcount時就會自動跳轉到840500d9處執(zhí)行。
再看看840500d9處的代碼匯編:
840500d9:CLI
push ebp
mov ebp,esp
push ebx
push ecx
push edx
push esi
push edi
call 840500e7
840500e7:pop edi
xor di,di
mov esi,edi
add esi,00402051
sub esi,00401f0b
push esi
call edi
call 84050101
84050101:pop edi
xor di,di
call [edi+0000fef0]
call 84050110
84050110:sub eax,[edi+0000ff30]
mul dword,ptr[edi+0000ff30]
mov ebx,00100000
div ebx
add eax,[edi+0000fe20]
push eax
mov eax,00402072
sub eax,00401f08
add eax,edi
push eax
call edi
pop eax
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop ebp
sil
ret
以上正是變速齒輪變速的核心所在。(GETTICKCOUNT返回的是EAX的值你可以對EAX進行跟蹤)
下面說一下變速齒輪掛接API的方法:首先變速齒輪在MMF區(qū)(WIN9X/ME)申請一塊內存,把上面的代碼從程序中移到該內存。使用修改描述符的方法從應用程序級跳到核心級(具體可查看《電腦編程技巧與維護》2000年第6期34頁)修改GETTICKCOUNT開頭的代碼使之指向申請的內存的首地址實現掛接。