@@ -10,16 +10,16 @@ details about reversing the game as well as offset tables.
1010
1111## Installation and use
1212To download this hack, navigate to the [ build] ( https://github.com/JulianOzelRose/CSS-MultiHack-Internal/tree/master/CSS-MultiHack-Internal/build )
13- folder, then download ``` CSS-MultiHack-Internal.dll `` ` . You will then need to use a DLL injector.
13+ folder, then download ` CSS-MultiHack-Internal.dll ` . You will then need to use a DLL injector.
1414I recommend using [ this one] ( https://guidedhacking.com/resources/guided-hacking-dll-injector.4/ ) .
1515Once you have the injector, select the process for Counter-Strike: Source, then open the DLL,
1616then press inject. The multihack should then be running. From the menu, you can toggle the different
17- features on or off. To run the aimbot, press the ``` V ``` key. To hide the menu, press the ``` INSERT `` ` Key.
18- To unload the hack, press the ``` END `` ` key on your numpad.
17+ features on or off. To run the aimbot, press the ` V ` key. To hide the menu, press the ` INSERT ` Key.
18+ To unload the hack, press the ` END ` key on your numpad.
1919
2020## Warning
2121This program reads and modifies memory internally. If you use it on a VAC-secured server,
22- you will be banned. To prevent this, be sure to add the ``` -insecure `` ` flag to your
22+ you will be banned. To prevent this, be sure to add the ` -insecure ` flag to your
2323game's launch options. You can find this menu by right-clicking on your game from Steam,
2424then going to Properties. You can then safely play against bots without worrying
2525about catching a VAC ban.
@@ -30,92 +30,95 @@ https://github.com/JulianOzelRose/CSS-MultiHack-Internal/assets/95890436/4f6940c
3030
3131## Bunnyhop
3232The bunnyhop hack is relatively straightforward. It works by first checking for ground flags. If the player
33- is on the ground or crouching, it forces a jump by setting ``` m_dwForceJump `` ` to 6. When in the air,
33+ is on the ground or crouching, it forces a jump by setting ` m_dwForceJump ` to 6. When in the air,
3434the force jump variable resets. The result is perfectly timed jumps every time.
3535
3636```
37+ const int FLAG_STANDING = 257;
38+ const int FLAG_ONGROUND = 263;
39+ const int JUMP_PRESS = 6;
40+
3741void Bunnyhop(uintptr_t client, uintptr_t localPlayer)
3842{
3943 if (GetAsyncKeyState(VK_SPACE))
4044 {
4145 int flag = *reinterpret_cast<std::uint32_t*>(localPlayer + offset::m_fFlags);
4246
43- if (flag == 257 || flag == 263 )
47+ if (flag == FLAG_STANDING || flag == FLAG_ONGROUND )
4448 {
45- *reinterpret_cast<uint32_t*>(client + offset::m_dwForceJump) = 6 ;
49+ *reinterpret_cast<uint32_t*>(client + offset::m_dwForceJump) = JUMP_PRESS ;
4650 }
4751 }
4852}
4953```
5054
5155## Anti-flash
52- For anti-flash, there are 2 relevant variables to be changed; ``` m_flFlashMaxAlpha ```
53- determines how bright the flashbang's blinding effect is, and ``` m_flFlashMaxDuration ``` determines
54- how long the flashbang's effect lasts. Setting them to 0 will nullify the flashbang's blinding effect.
55-
56+ For anti-flash, there are 2 relevant variables; ` m_flFlashMaxAlpha `
57+ determines how bright the flashbang's blinding effect is, and ` m_flFlashMaxDuration ` determines
58+ how long the flashbang's effect lasts. Just setting ` m_flFlashMaxAlpha ` to 0 is sufficient to nullify the flashbang's blinding effect.
5659```
5760void AntiFlash(uintptr_t localPlayer)
5861{
5962 float flashMaxAlpha = *reinterpret_cast<float*>(localPlayer + offset::m_flFlashMaxAlpha);
60- float flashMaxDuration = *reinterpret_cast<float*>(localPlayer + offset::m_flFlashMaxDuration);
6163
6264 if (flashMaxAlpha > 0.0f)
6365 {
6466 *reinterpret_cast<float*>(localPlayer + offset::m_flFlashMaxAlpha) = 0.0f;
6567 }
66-
67- if (flashMaxDuration > 0.0f)
68- {
69- *reinterpret_cast<float*>(localPlayer + offset::m_flFlashMaxDuration) = 0.0f;
70- }
7168}
7269```
7370
7471## Triggerbot
75- The triggerbot uses ``` m_iCrosshairId `` ` to determine what entity is in the player's
72+ The triggerbot uses ` m_iCrosshairId ` to determine what entity is in the player's
7673crosshairs. A value of 0 means no entity. A non-zero value could mean another player,
77- or it could mean a barrel . To prevent the triggerbot from firing at barrels , the
74+ or it could mean a physics object . To prevent the triggerbot from firing at physics objects , the
7875crosshair ID condition should be capped at 64. Once an entity is detected in the crosshairs,
7976a check is performed to ensure the entity is on the opposing team. Then, an attack is forced
80- by setting ``` m_dwForceAttack `` ` to 5. After a delay, this variable needs to be set back to
77+ by setting ` m_dwForceAttack ` to 5. After a delay, this variable needs to be set back to
8178its default value of 4, or only 1 shot will be fired.
8279```
80+ const int MAX_PLAYERS = 64;
81+ const int ATTACK_PRESS = 5;
82+ const int ATTACK_RELEASE = 4;
83+
8384void Triggerbot(uintptr_t client, uintptr_t localPlayer)
8485{
85- int crosshairId = *reinterpret_cast<uint32_t*>(localPlayer + offset::m_iCrosshairId);
86+ uint32_t crosshairId = *reinterpret_cast<uint32_t*>(localPlayer + offset::m_iCrosshairId);
8687
87- if (crosshairId != 0 && crosshairId <= 64 )
88+ if (crosshairId == 0 || crosshairId > MAX_PLAYERS )
8889 {
89- uintptr_t targetEntity = *reinterpret_cast<std::uintptr_t*>(client + (offset::m_dwEntityList + (crosshairId - 1) * 0x10));
90+ return;
91+ }
92+
93+ uintptr_t targetEntity = *reinterpret_cast<std::uintptr_t*>(client + (offset::m_dwEntityList + (crosshairId - 1) * 0x20));
9094
91- if (targetEntity)
95+ if (targetEntity)
96+ {
97+ uint32_t targetTeam = *reinterpret_cast<uint32_t*>(targetEntity + offset::m_iTeamNum);
98+ uint32_t playerTeam = *reinterpret_cast<uint32_t*>(localPlayer + offset::m_iTeamNum);
99+
100+ if (playerTeam != targetTeam)
92101 {
93- int targetTeam = *reinterpret_cast<uint32_t*>(targetEntity + offset::m_iTeamNum);
94- int playerTeam = *reinterpret_cast<uint32_t*>(localPlayer + offset::m_iTeamNum);
102+ uint32_t attackFlag = *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack);
95103
96- if (playerTeam != targetTeam )
104+ if (attackFlag == ATTACK_RELEASE )
97105 {
98- int attackFlag = *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack);
99-
100- if (attackFlag == 4)
101- {
102- *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack) = 5;
103- std::this_thread::sleep_for(std::chrono::milliseconds(1));
106+ *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack) = ATTACK_PRESS;
107+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
104108
105- *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack) = 4;
106- std::this_thread::sleep_for(std::chrono::milliseconds(1));
107- }
109+ *reinterpret_cast<uint32_t*>(client + offset::m_dwForceAttack) = ATTACK_RELEASE;
110+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
108111 }
109112 }
110113 }
111114}
112115```
113116
114117## Aimbot
115- The aimbot works by first iterating through the entity list. Each entity is 0x10 bytes apart,
116- so you must use 0x10 as the iterator. Then, the aimbot checks to ensure that the entity
118+ The aimbot works by first iterating through the entity list. Each entity is 0x20 bytes apart,
119+ so you must use 0x20 as the iterator. Then, the aimbot checks to ensure that the entity
117120is on the opposing team and is alive. Lastly, it performs calculations using trigonometry
118- to get the ideal angles, and updates the player's view angles, ``` m_angRotation `` ` , to focus on the
121+ to get the ideal angles, and updates the player's view angles, ` m_angRotation ` , to focus on the
119122closest enemy's head. Credit goes to [ Guided Hacking] ( https://guidedhacking.com/ ) for the aimbot formula.
120123```
121124void CalcAngle(float* src, float* dst, float* angles)
@@ -141,33 +144,32 @@ void CalcAngle(float* src, float* dst, float* angles)
141144Unfortunately, there is no offset dumper for CS: S that I am aware of. However, it
142145is possible to configure [ hazedumper] ( https://github.com/frk1/hazedumper ) with CS: S
143146offset signatures and get it to dump offsets that way. Below are the offsets I used
144- for this trainer. Note that the offsets for ``` CBaseEntity ``` are located on ``` client.dll `` ` .
147+ for this trainer. Note that the offsets for ` CBasePlayer ` are located on ` client.dll ` .
145148
146149### CBasePlayer ###
147150| Offset | Type | Variable |
148151| --------------- | --------------- | -------------------- |
149- | 0x0094 | Integer | m_iHealth |
150- | 0x009C | Integer | m_iTeamNum |
151- | 0x0290 | Float | m_vecOrigin |
152- | 0x0350 | Float | m_fFlags |
153- | 0x0D80 | Integer | m_hActiveWeapon |
154- | 0x0E48 | Float | m_vecPunchAngle |
155- | 0x144C | Float | m_flFlashMaxAlpha |
156- | 0x1450 | Float | m_flFlashMaxDuration |
157- | 0x14F0 | Integer | m_iCrosshairId |
152+ | 0x00D0 | Int32 | m_iHealth |
153+ | 0x00D8 | Int32 | m_iTeamNum |
154+ | 0x0320 | Float32 | m_vecOrigin |
155+ | 0x0440 | Float32 | m_fFlags |
156+ | 0x1A54 | Float32 | m_flFlashMaxAlpha |
157+ | 0x1A4C | Float32 | m_flFlashMaxDuration |
158+ | 0x1B20 | Int32 | m_iCrosshairId |
158159
159160### client.dll ###
160161| Offset | Type | Variable |
161162| --------------- | --------------- | -------------------- |
162- | 0x4C88E8 | Pointer | m_dwLocalPlayer |
163- | 0x4F5D24 | DWORD | m_dwForceJump |
164- | 0x4F5D30 | DWORD | m_dwForceAttack |
163+ | 0x5F4B68 | Pointer | m_dwLocalPlayer |
164+ | 0x6098C8 | Pointer | m_dwEntityList |
165+ | 0x677300 | DWORD | m_dwForceJump |
166+ | 0x677310 | DWORD | m_dwForceAttack |
165167
166168### engine.dll ###
167169| Offset | Type | Variable |
168170| --------------- | --------------- | -------------------- |
169- | 0x47C33C | Float | m_angRotation |
170- | 0x5EC82C | Integer | m_iNumPlayers |
171+ | 0x53E4E4 | Float32 | m_angRotation |
172+ | 0x6DA960 | Int32 | m_iNumPlayers |
171173
172174## Sources
173175I used the following sources to guide me through the creation of this trainer. The
0 commit comments