首页
社区
课程
招聘
8
[原创]分享个东西,cheat engine的变速精灵(speedhack)模块调用方法.
发表于: 2022-9-27 15:25 20482

[原创]分享个东西,cheat engine的变速精灵(speedhack)模块调用方法.

2022-9-27 15:25
20482

CE变速精灵(speedhack)导出表

CE的变速精灵实现原理是把speedhack.dll注入游戏,劫持了三个高精度计时函数
kernel32.dll->GetTickCount
ntdll.RtlQueryPerformanceCounter
kernel32.dll->GetTickCount64
实现了加速/减速功能(别问怎么过注入过检测)
下面是伪代码

这个东西支持x64玩法很多,也非常多检测方式,怎么使用全看你脑洞
很小白,但是我不会pascal,看了CE源码十多个小时才看明白

把ntdll.RtlQueryPerformanceCounter inlink hook
77892984 | 8BFF    mov edi,edi
改成
77892984 | E9 B7DA7E8D
jmp <speedhack-i386.speedhackversion_QueryPerformanceCounter
//speedhack.dll变速精灵模块
speedhack-i386->speedhackversion_QueryPerformanceCounter
//构建回跳桥板
40111111      mov edi,edi
              push ebp
              mov ebp,esp
              jmp (77892984+5)
speedhack-i386->realQueryPerformanceCounter = 40111111
最后这步很重要,speedhack.dll->realQueryPerformanceCounter填入回跳桥板地址,不懂就去调试CE看看他的实现.
剩下两个是hook完全相同,就不说了
kernel32.dll->GetTickCount  inline hook
jmp speedhackversion_GetTickCount
realGetTickCount填入回跳地址
 
kernel32.dll->GetTickCount64 inline hook
jmp speedhackversion_GetTickCount64
realGetTickCount64填入会跳地址
把ntdll.RtlQueryPerformanceCounter inlink hook
77892984 | 8BFF    mov edi,edi
改成
77892984 | E9 B7DA7E8D
jmp <speedhack-i386.speedhackversion_QueryPerformanceCounter
//speedhack.dll变速精灵模块
speedhack-i386->speedhackversion_QueryPerformanceCounter
//构建回跳桥板
40111111      mov edi,edi
              push ebp

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

收藏
免费 8
支持
分享
赞赏记录
参与人
雪币
留言
时间
飘零丶
为你点赞!
4天前
ddwwtom
为你点赞~
2023-9-28 18:18
nevinhappy
为你点赞~
2023-8-24 09:17
mb_yfioexda
为你点赞~
2023-8-22 10:55
轻装前行
为你点赞~
2023-3-27 23:12
伟叔叔
为你点赞~
2023-3-18 01:11
704088
为你点赞~
2023-3-2 09:17
PLEBFE
为你点赞~
2023-1-11 16:23
最新回复 (16)
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
忘记说了,上面是初始化
调用加速减速方法
push 0.5/*0.5倍减速*/   2.5/*2.5倍加速*/    3.5 /*3.5倍加速*/     //单浮点数
call  speedhack->InitializeSpeedhack
2022-9-27 15:29
0
雪    币: 6728
活跃值: (6261)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
3
不止这三个,还有一个,而且XP,WIN7 WIN10 处理方法不同(大同小异),而且最新的7.4,已经放弃支持XP了
2022-9-27 15:47
0
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
gamehack 不止这三个,还有一个,而且XP,WIN7 WIN10 处理方法不同(大同小异),而且最新的7.4,已经放弃支持XP了
哈哈是的,我看他源码太多例外处理了,我就简化了下,照他那么搞人都麻了
2022-9-27 16:33
1
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
gamehack 不止这三个,还有一个,而且XP,WIN7 WIN10 处理方法不同(大同小异),而且最新的7.4,已经放弃支持XP了
对,还有个这个
WINMM.dll->timeGetTime            JMP
speedhackversion_GetTickCount
2022-9-27 17:28
0
雪    币: 2575
活跃值: (502)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
6
能再详细些就好了
2022-12-26 17:50
0
雪    币: 39
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
qj111111 忘记说了,上面是初始化 调用加速减速方法 push 0.5/*0.5倍减速*/ 2.5/*2.5倍加速*/ 3.5 /*3.5倍加速*/ //单浮点数 call speedh ...
大佬我最近在研究csol请问你现在研究过吗
2023-1-6 13:24
0
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
wyfe 能再详细些就好了

给出源码拿去玩吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
void InitSpeedHack()
{
     
    DWORD ndbase_speed;//speedhack基址
    DWORD i;
    DWORD kernel32base;
    DWORD WINMMbase;
    DWORD ntdllbase;
 
    DWORD kernel_GetTickCount;
    DWORD WINMMtimeGetTime;
    DWORD ntdll_RtlqueryPerf;
    DWORD kernel_GetTick64;
 
    CString szbuff;
    wchar_t szpid[10];
 
    nhHero = g_dm->FindWindow(NULL,_T("游戏名"));//我懒得用自己注入,随便找了个大漠注入
 
    DWORD pid = g_dm->GetWindowProcessId(nhHero);
 
    _itow(pid,szpid,10);
    szbuff = L"inject 2 <c:\\1.dll> ";
    szbuff = szbuff + szpid;
    szbuff = szbuff + L" 0 1";
    OutputDebugStringW(L"InitSpeedHack");
    i = g_dm->DmGuard(1,szbuff.GetBuffer());//注入
    dbg_print(i);
    wchar_t* szsign = L"55 89 E5 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? E8 ?? ?? ?? ?? A3";
 
    wchar_t wszbuff[4]={0};
    CString szresult=L"";
    CString csbuff,szback;
    //找到基址speedhack
    for (i=0;i<0xf;i++)
    {
        if (i<10)
        {   wszbuff[0]=i+48;
        }else
        {
            wszbuff[0]=i+55;
        }
        csbuff = wszbuff;
        szback = csbuff + L"0000000-" + csbuff + L"FFFFFFF"
        szresult = g_dm->FindData(nhHero,szback,szsign);
        OutputDebugStringW(szresult.GetBuffer());
        if (szresult!="")
        {
            break;
        }
    }
     
    ndbase_speed = wcstoul(szresult.GetBuffer(),0,16);
    ndbase_speed = ndbase_speed-0x204F0;
    dbg_print(ndbase_speed);
    speedhackversion_QueryPerformanceCounter = ndbase_speed+0x20440;
    speedhackversion_GetTickCount64  = ndbase_speed+0x000203B0   ;
    speedhackversion_GetTickCount  = ndbase_speed+0x00020330;
    realQueryPerformanceCounter  = ndbase_speed+0x0002D950;
    realGetTickCount64 = ndbase_speed+0x0002D940;
    realGetTickCount = ndbase_speed+0x0002D930;
    InitializeSpeedhack = ndbase_speed+0x000204F0;
 
    kernel32base = g_dm->GetModuleBaseAddr(nhHero,L"kernel32.dll");
    kernel_GetTickCount = kernel32base+0x1110C;
    kernel_GetTick64 = kernel32base+0x2EEC8;
    WINMMbase = g_dm->GetModuleBaseAddr(nhHero,L"WINMM.dll");
    WINMMtimeGetTime = WINMMbase+0x26E0;
    ntdllbase = g_dm->GetModuleBaseAddr(nhHero,L"ntdll.dll");
    ntdll_RtlqueryPerf = ntdllbase+0x388C4;
     
    inlineHook(kernel_GetTickCount,speedhackversion_GetTickCount,realGetTickCount,0);
    inlineHook(WINMMtimeGetTime,speedhackversion_GetTickCount,0,0);
 
    inlineHook(ntdll_RtlqueryPerf,speedhackversion_QueryPerformanceCounter,realQueryPerformanceCounter,1);
 
    inlineHook(kernel_GetTick64,speedhackversion_GetTickCount64,realGetTickCount64,0);
}
 
void 3被加速()
{
    if (InitializeSpeedhack==0)
    {
        checkspeedhack();
    }
    wchar_t wsbuff[10];
    CString csbuff;
    float fchange=3.0;
    _itow(*(PDWORD)&fchange,wsbuff,16);
    csbuff = L"push ";
    csbuff =csbuff + wsbuff;
    OutputDebugStringW(csbuff);
    g_dm->AsmAdd(csbuff);
    _itow(InitializeSpeedhack,wsbuff,16);
    csbuff = L"call ";
    csbuff = csbuff + wsbuff;
    OutputDebugStringW(csbuff);
 
    g_dm->AsmAdd(csbuff);
    g_dm->AsmCall(nhHero,1);
    g_dm->AsmClear();
}


2023-4-10 22:12
0
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
qq无言 大佬我最近在研究csol请问你现在研究过吗
研究这游戏变现非常危险,所以没兴趣
2023-4-10 22:15
0
雪    币: 347
活跃值: (2467)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我用易语言注入和hook函数都成功了,就是远程调用变速无效
2023-8-10 13:34
0
雪    币: 5004
活跃值: (5012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
qj111111 研究这游戏变现非常危险,所以没兴趣
怎么说  老牌产品不是屹立不倒吗
2023-8-10 13:41
0
雪    币: 0
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享 谢谢大神
2023-8-14 00:16
0
雪    币: 4405
活跃值: (31556)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享
2023-8-14 09:06
1
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
轻装前行 我用易语言注入和hook函数都成功了,就是远程调用变速无效
你先看看用ce变速精灵功能能不能正常使用,这个和ce变速精灵功能等价的
再检查代码
2023-8-14 19:16
0
雪    币: 1557
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
木志本柯 怎么说 老牌产品不是屹立不倒吗
所有fps都有概率速通铁饭碗,一辈子无忧
2023-8-23 21:22
0
雪    币: 360
活跃值: (476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
qj111111 所有fps都有概率速通铁饭碗,一辈子无忧
怎么说?FPS游戏收益最高还是咋?
2023-11-24 19:53
0
雪    币: 535
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
感谢分享
2024-7-20 18:25
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册