|
15 | 15 | { |
16 | 16 | "library" "server" |
17 | 17 | "windows" "@CreateInterface" |
| 18 | + "windows64" "@CreateInterface" |
18 | 19 | "linux" "@CreateInterface" |
| 20 | + "linux64" "@CreateInterface" |
19 | 21 | } |
20 | 22 |
|
21 | 23 | "CreateInterface_Engine" |
22 | 24 | { |
23 | 25 | "library" "engine" |
24 | 26 | "windows" "@CreateInterface" |
| 27 | + "windows64" "@CreateInterface" |
25 | 28 | "linux" "@CreateInterface" |
| 29 | + "linux64" "@CreateInterface" |
26 | 30 | } |
27 | 31 | } |
28 | 32 |
|
|
31 | 35 | "OS" |
32 | 36 | { |
33 | 37 | "windows" "1" |
| 38 | + "windows64" "1" |
34 | 39 | "linux" "2" |
| 40 | + "linux64" "2" |
| 41 | + } |
| 42 | + |
| 43 | + "X64" |
| 44 | + { |
| 45 | + "windows" "0" |
| 46 | + "windows64" "1" |
| 47 | + "linux" "0" |
| 48 | + "linux64" "1" |
35 | 49 | } |
36 | 50 |
|
37 | 51 | "ProcessMovement" |
38 | 52 | { |
39 | 53 | "windows" "1" |
| 54 | + "windows64" "1" |
40 | 55 | "linux" "2" |
| 56 | + "linux64" "2" |
41 | 57 | } |
42 | 58 | } |
43 | 59 | } |
|
151 | 167 | { |
152 | 168 | "Addresses" |
153 | 169 | { |
154 | | - "m_surfaceFriction" |
155 | | - { |
156 | | - "signature" "CBasePlayer->m_surfaceFriction" |
157 | | - "read" "2" // skip the first 2 bytes |
158 | | - } |
159 | 170 | } |
160 | 171 |
|
161 | 172 | "Offsets" |
162 | 173 | { |
163 | | - // https://asherkin.github.io/vtable/ |
| 174 | + // https://asherkin.github.io/vtable/ (you can drop a .so from your srcds into this) |
| 175 | + // search string: "func_pushable" and you can find CBaseTrigger::PassesTriggerFilters / CBaseVPhysicsTrigger::PassesTriggerFilters. Follow references to these functions to find the vtable and then calculate the offset... |
164 | 176 | "CBaseTrigger::PassesTriggerFilters" |
165 | 177 | { |
166 | | - "windows" "197" |
167 | | - "linux" "198" |
| 178 | + "windows" "203" |
| 179 | + "windows64" "203" |
| 180 | + "linux" "204" |
| 181 | + "linux64" "204" |
168 | 182 | } |
169 | | - // https://asherkin.github.io/vtable/ |
| 183 | + // https://asherkin.github.io/vtable/ (you can drop a .so from your srcds into this) |
| 184 | + // search string: "start %f %f %f" and then check the function call offsets above it and convert them to vtable offsets (divide by 4 most likely or whatever) |
170 | 185 | "CCSPlayer::GetPlayerMaxSpeed" |
171 | 186 | { |
172 | | - "windows" "438" |
173 | | - "linux" "439" |
174 | | - "mac" "439" |
| 187 | + "windows" "445" |
| 188 | + "windows64" "445" |
| 189 | + "linux" "446" |
| 190 | + "linux64" "446" |
175 | 191 | } |
176 | | - // https://asherkin.github.io/vtable/ |
| 192 | + // https://asherkin.github.io/vtable/ (you can drop a .so from your srcds into this) |
| 193 | + // search string: "Invalid counterterrorist spawnpoint" and then look for the first function call in each iteration of the loop |
177 | 194 | "CGameRules::IsSpawnPointValid" |
178 | 195 | { |
179 | 196 | "windows" "76" |
| 197 | + "windows64" "77" // yes, same as linux64 (according to vtable site) |
180 | 198 | "linux" "77" |
181 | | - "mac" "77" |
| 199 | + "linux64" "77" |
182 | 200 | } |
183 | | - // https://asherkin.github.io/vtable/ |
| 201 | + // https://asherkin.github.io/vtable/ (you can drop a .so from your srcds into this) |
| 202 | + // search string: "water" to find CBasePlayer::UpdateStepSound. At the bottom there's a vtable call to ::PlayStepSound. Grab that, divide by 4, subtract 1. Bam, UpdateStepSound... |
184 | 203 | "CBasePlayer::UpdateStepSound" |
185 | 204 | { |
186 | | - "windows" "358" |
187 | | - "linux" "359" |
| 205 | + "windows" "364" |
| 206 | + "windows64" "364" |
| 207 | + "linux" "365" |
| 208 | + "linux64" "365" |
188 | 209 | } |
189 | 210 | // find in CCSGameMovement::CheckForLadders which references CCSPlayer::CanGrabLadder |
| 211 | + // |
| 212 | + // Find CCSPlayer::CanGrabLadder by searching for 4096.0f, then find the function (CheckForLadders) that references it... |
| 213 | + // CanGrabLadder might look like this on Windows (or just use symbols on Linux) |
| 214 | + // undefined4 __thiscall CCSPlayer::CanGrabLadder(int param_1_00,float *param_1,float *param_2) |
| 215 | + // { |
| 216 | + // float10 extraout_ST0; |
| 217 | + // float fVar1; |
| 218 | + // float fVar2; |
| 219 | + // |
| 220 | + // (*(code *)**(undefined4 **)(param_1_00 + 0x1790))(); |
| 221 | + // if ((float10)0 < (float10)*(float *)(param_1_00 + 0x1798) - extraout_ST0) { |
| 222 | + // fVar1 = *param_1 - *(float *)(param_1_00 + 0x17a8); |
| 223 | + // fVar2 = param_1[1] - *(float *)(param_1_00 + 0x17ac); |
| 224 | + // if (fVar2 * fVar2 + fVar1 * fVar1 < 4096.0) { |
| 225 | + // return 0; |
| 226 | + // } |
| 227 | + // if ((((NAN(*(float *)(param_1_00 + 0x179c)) || NAN(*param_2)) != |
| 228 | + // (*(float *)(param_1_00 + 0x179c) == *param_2)) && |
| 229 | + // ((NAN(*(float *)(param_1_00 + 0x17a0)) || NAN(param_2[1])) != |
| 230 | + // (*(float *)(param_1_00 + 0x17a0) == param_2[1]))) && |
| 231 | + // ((NAN(*(float *)(param_1_00 + 0x17a4)) || NAN(param_2[2])) != |
| 232 | + // (*(float *)(param_1_00 + 0x17a4) == param_2[2]))) { |
| 233 | + // return 0; |
| 234 | + // } |
| 235 | + // } |
| 236 | + // return 1; |
| 237 | + // } |
190 | 238 | "CCSPlayer::m_lastStandingPos" |
191 | 239 | { |
192 | | - "windows" "5684" |
193 | | - "linux" "5704" // +20 wow that's easy! |
| 240 | + "windows" "6016" |
| 241 | + "windows64" "6640" |
| 242 | + "linux" "6036" // +20 wow that's easy! |
| 243 | + "linux64" "6688" // +48 wow that's easy! |
194 | 244 | } |
195 | 245 | // find CCSPlayer::CanGrabLadder via 4096.0f or symbols on linux... |
196 | 246 | "CCSPlayer::m_ladderSurpressionTimer" |
197 | 247 | { |
198 | | - "windows" "5700" |
199 | | - "linux" "5720" // +20 wow that's easy! |
| 248 | + "windows" "6032" |
| 249 | + "windows64" "6668" |
| 250 | + "linux" "6052" // +20 wow that's easy! |
| 251 | + "linux64" "6716" // +48 wow that's easy! |
200 | 252 | } |
201 | 253 | // find CCSPlayer::CanGrabLadder via 4096.0f or symbols on linux... |
202 | 254 | "CCSPlayer::m_lastLadderNormal" |
203 | 255 | { |
204 | | - "windows" "5712" |
205 | | - "linux" "5732" // +20 wow that's easy! |
| 256 | + "windows" "6044" |
| 257 | + "windows64" "6672" |
| 258 | + "linux" "6064" // +20 wow that's easy! |
| 259 | + "linux64" "6720" // +48 wow that's easy! |
206 | 260 | } |
207 | 261 | // find CCSPlayer::CanGrabLadder via 4096.0f or symbols on linux... |
208 | 262 | "CCSPlayer::m_lastLadderPos" |
209 | 263 | { |
210 | | - "windows" "5724" |
211 | | - "linux" "5744" // +20 wow that's easy! |
| 264 | + "windows" "6056" |
| 265 | + "windows64" "6684" |
| 266 | + "linux" "6076" // +20 wow that's easy! |
| 267 | + "linux64" "6732" // +48 wow that's easy! |
212 | 268 | } |
213 | 269 | // TODO |
214 | 270 | "GetClusterForOrigin" |
|
226 | 282 |
|
227 | 283 | "Signatures" |
228 | 284 | { |
229 | | - // search string: "ReloadEffect" to find CWeaponCSBase::SendReloadEvents and then DoAnimationEvent is probably the second to last function called there. |
| 285 | + // search string: "ReloadEffect" to find CWeaponCSBase::SendReloadEvents and then CCSPlayer::DoAnimationEvent is probably the second to last function called there. |
230 | 286 | "Player::DoAnimationEvent" |
231 | 287 | { |
232 | | - "windows" "\x55\x8B\xEC\x83\xEC\x10\x89\x4D\xFC\x83\x7D\x08\x02" |
| 288 | + "windows" "\x55\x8B\xEC\x83\xEC\x0C\x89\x4D\x2A\x83\x7D\x2A\x02" |
| 289 | + "windows64" "\x44\x89\x44\x24\x2A\x89\x54\x24\x2A\x48\x89\x4C\x24\x2A\x48\x83\xEC\x38\x83\x7C\x24\x2A\x02" |
233 | 290 | "linux" "@_ZN9CCSPlayer16DoAnimationEventE17PlayerAnimEvent_ti" |
| 291 | + "linux64" "@_ZN9CCSPlayer16DoAnimationEventE17PlayerAnimEvent_ti" |
234 | 292 | } |
235 | | - // search string: "-nobots" |
| 293 | + // search string: "-nobots" (and then look for the function that also references "fill" and "match" (or just the function with 0 or 1 parameters...)) |
236 | 294 | "BotManager::MaintainBotQuota" |
237 | 295 | { |
238 | 296 | "windows" "\x55\x8B\xEC\x83\xEC\x14\xFF\x15" |
| 297 | + "windows64" "\x48\x83\xEC\x78\xFF\x15" |
239 | 298 | "linux" "@_ZN13CCSBotManager16MaintainBotQuotaEv" |
| 299 | + "linux64" "@_ZN13CCSBotManager16MaintainBotQuotaEv" |
240 | 300 | } |
241 | | - // search string: "Server is hibernating" to find SetHibernating and then go its references |
| 301 | + // search string: "Server is hibernating" to find SetHibernating and then go to its references |
| 302 | + // NOTE 2025-02-19: Function has been inlined on Windows into SV_Think... |
242 | 303 | "CGameServer::UpdateHibernationState" |
243 | 304 | { |
244 | 305 | "library" "engine" |
245 | | - "windows" "\x55\x8B\xEC\x83\xEC\x08\x57\x8B\xF9\x8B\x07\x8B\x40\x2A\xFF\xD0\x84\xC0\x0F\x84" |
246 | | - "linux" "@_ZN11CGameServer22UpdateHibernationStateEv" |
| 306 | + //"windows" "" |
| 307 | + "windows64" "\x48\x89\x5C\x24\x2A\x56\x48\x83\xEC\x40\x8B\x05" |
| 308 | + "linux" "@_ZN11CGameServer22UpdateHibernationStateEv.part.0" |
| 309 | + "linux64" "@_ZN11CGameServer14SetHibernatingEb" |
247 | 310 | } |
248 | 311 | // search string: "remove 0x%p: %s-%s" to find PhysicsRemoveToucher. |
249 | 312 | // Find PhysicsCheckForEntityUntouch by checking the functions that call PhysicsRemoveToucher. |
| 313 | + // (should be the function with one argument (this ptr)) |
250 | 314 | "PhysicsCheckForEntityUntouch" |
251 | 315 | { |
252 | | - "windows" "\x55\x8B\xEC\x83\xEC\x08\x56\x8B\xF1\x8B\x86" |
| 316 | + "windows" "\x55\x8B\xEC\x83\xEC\x08\x57\x8B\xF9\x8B\x87" |
| 317 | + "windows64" "\x40\x57\x48\x83\xEC\x20\x8B\x81" |
253 | 318 | "linux" "@_ZN11CBaseEntity28PhysicsCheckForEntityUntouchEv" |
| 319 | + "linux64" "@_ZN11CBaseEntity28PhysicsCheckForEntityUntouchEv" |
254 | 320 | } |
255 | | - // search string: "Could not add bot to the game: Team is full" |
| 321 | + // search string: "Could not add bot to the game: Team is full" to find CCSBotManager::BotAddCommand and then follow the if-statement up to find the function call that was full (because TeamFull()) |
256 | 322 | // protip: on csgo we just use mp_randomspawn instead. |
257 | 323 | "CCSGameRules::TeamFull" |
258 | 324 | { |
259 | 325 | "windows" "\x55\x8B\xEC\x56\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x8B\x45\x2A\x83\xE8\x02" |
| 326 | + "windows64" "\x48\x89\x5C\x24\x2A\x57\x48\x83\xEC\x20\x8B\xFA\x48\x8B\xD9\xE8\x2A\x2A\x2A\x2A\x83\xEF\x02" |
260 | 327 | "linux" "@_ZN12CCSGameRules8TeamFullEi" |
| 328 | + "linux64" "@_ZN12CCSGameRules8TeamFullEi" |
261 | 329 | } |
262 | 330 | // search string: "remove 0x%p: %s-%s (%d-%d) [%d in play, %d max]\n". |
263 | 331 | // function with one argument is PhysicsRemoveTouchedList |
264 | 332 | "PhysicsRemoveTouchedList" |
265 | 333 | { |
266 | | - "windows" "\x55\x8B\xEC\x83\xEC\x08\x57\x8B\x7D\x08\x8B\x87\x2A\x2A\x2A\x2A\xD1\xE8\xA8\x01\x0F\x84" |
| 334 | + "windows" "\x55\x8B\xEC\x83\xEC\x08\x53\x8B\x5D\x2A\x8B\x83" |
| 335 | + "windows64" "\x40\x55\x56\x48\x83\xEC\x58" |
267 | 336 | "linux" "@_ZN11CBaseEntity24PhysicsRemoveTouchedListEPS_" |
| 337 | + "linux64" "@_ZN11CBaseEntity24PhysicsRemoveTouchedListEPS_" |
268 | 338 | } |
269 | | - // look for function CGameMovement::CategorizePosition |
270 | | - // and you will see something something *(_DWORD*)(a1[1] + some_offset) = 0x3F800000 |
| 339 | + // look for CGameMovement::CategorizePosition by searching for 140.0f |
| 340 | + // and you will see something something `*(_DWORD*)(a1[1] + some_offset) = 0x3F800000` right at the top |
271 | 341 | // make a signature at "mov dword ptr[eax+some_offset], 3F800000h" |
272 | 342 | "CBasePlayer->m_surfaceFriction" |
273 | 343 | { |
274 | | - "windows" "\xC7\x80\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x8B\x07\xFF\x90" |
275 | | - "linux" "\xC7\x80\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x8B\x03\x89\x1C\x24\xFF\x90\x2A\x2A\x2A\x2A\x8B\x53\x04" |
| 344 | + "windows" "\xC7\x80\x2A\x2A\x2A\x2A\x00\x00\x80\x3F\x8B\x07" |
| 345 | + "windows64" "\xC7\x80\x2A\x2A\x2A\x2A\x00\x00\x80\x3F\x48\x8B\x01" |
| 346 | + "linux" "\xC7\x80\x2A\x2A\x2A\x2A\x00\x00\x80\x3F\x8B\x03" |
| 347 | + "linux64" "\xC7\x80\x2A\x2A\x2A\x2A\x00\x00\x80\x3F\x48\x8B\x07" |
276 | 348 | } |
277 | 349 | } |
278 | 350 | } |
|
0 commit comments