Skip to content
Back to skills

215 Name Skill 238fce32

ASecurity

Find and identify the CBaseEntity_SetOwner virtual function in CS2 binary using IDA Pro MCP. Use this skill when reverse engineering CS2 server.dll or libserver.so to locate the SetOwner function. CBaseEntity_SetOwner is a virtual function on CBaseEntity, resolved via vtable offset in CCSPlayer_WeaponServices_EquipWeapon. Trigger: CBaseEntity_SetOwner, SetOwner

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
data

Works with

  • mcp

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 215-name-skill_238fce32 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 215 Name Skill 238fce32?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 215 Name Skill 238fce32
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-215-name-skill-238fce32/badge)](https://www.skillsdirectory.com/skills/tools-only-215-name-skill-238fce32)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: find-CBaseEntity_SetOwner
description: |
  Find and identify the CBaseEntity_SetOwner virtual function in CS2 binary using IDA Pro MCP.
  Use this skill when reverse engineering CS2 server.dll or libserver.so to locate the SetOwner function.
  CBaseEntity_SetOwner is a virtual function on CBaseEntity, resolved via vtable offset in CCSPlayer_WeaponServices_EquipWeapon.
  Trigger: CBaseEntity_SetOwner, SetOwner
disable-model-invocation: true
---

# Find CBaseEntity_SetOwner

Locate the `CBaseEntity_SetOwner` virtual function in CS2 server binary using IDA Pro MCP tools.

## Overview

`CBaseEntity_SetOwner` is a virtual function on `CBaseEntity`. It is identified by decompiling `CCSPlayer_WeaponServices_EquipWeapon` and resolving the vtable call at offset `416` (Windows) / `408` (Linux) from the weapon entity's vtable pointer.

## Prerequisites

- `CCSPlayer_WeaponServices_EquipWeapon` must already be identified (YAML must exist)
- `CBaseEntity` vtable must already be identified (vtable YAML must exist)

If either is missing, run the corresponding skill first:
- `/find-CCSPlayer_WeaponServices_PickupItem-AND-CCSPlayer_WeaponServices_EquipWeapon`
- `/write-vtable-as-yaml` with `class_name=CBaseEntity`

## Method

### 1. Get CCSPlayer_WeaponServices_EquipWeapon Function Info

**ALWAYS** Use SKILL `/get-func-from-yaml` with `func_name=CCSPlayer_WeaponServices_EquipWeapon`.

If the skill returns an error, stop and report to user.
Otherwise, extract `func_va` for subsequent steps.

### 2. Get CBaseEntity VTable Info

**ALWAYS** Use SKILL `/get-vtable-from-yaml` with `class_name=CBaseEntity`.

If the skill returns an error, stop and report to user.
Otherwise, extract `vtable_va`, `vtable_numvfunc` and `vtable_entries` for subsequent steps.

### 3. Decompile CCSPlayer_WeaponServices_EquipWeapon and Locate SetOwner Call

Decompile the function at `func_va` from step 1 and look for the following code pattern:

Windows binary:
```c
  sub_XXXXXXXX((__int64)(a2 + 182));
  v7 = *(void (__fastcall **)(_QWORD *, _QWORD))(*a2 + 416LL); // <-- CBaseEntity_SetOwner
  if ( !*(_QWORD *)(a1 + 56) )
    nullsub_XXX(a1);
  v7(a2, *(_QWORD *)(a1 + 56));
  sub_YYYYYYYY(a1, a2);
  v8 = *(void (__fastcall **)(_QWORD *, _QWORD))(*a2 + 816LL);
```

Linux binary:
```c
  sub_XXXXXXXX(a2 + 274);
  v9 = *(void (__fastcall **)(_QWORD *, double, double, double))(*a2 + 408LL); // <-- CBaseEntity_SetOwner
  if ( !*(_QWORD *)(a1 + 56) )
    nullsub_XXXX();
  v9(a2, ...);
  sub_YYYYYYYY(a1, a2);
  v10 = *(void (__fastcall **)(_QWORD *, _QWORD))(*a2 + 808LL);
```

Key identification:
- Windows: vtable offset `416` (`0x1A0`), vtable index = 416 / 8 = **52**
- Linux: vtable offset `408` (`0x198`), vtable index = 408 / 8 = **51**

### 4. Resolve VTable Entry

Using the vtable entries from step 2, look up the entry at the platform-specific index:
- Windows: `vtable_entries[52]`
- Linux: `vtable_entries[51]`

The address at that index is `CBaseEntity_SetOwner`.

### 5. Rename CBaseEntity_SetOwner

Verify the function name at the resolved address. If not already renamed:

```
mcp__ida-pro-mcp__rename(batch={"func": {"addr": "<resolved_addr>", "name": "CBaseEntity_SetOwner"}})
```

### 6. Generate and Validate Unique Signature

**ALWAYS** Use SKILL `/generate-signature-for-function` to generate a robust and unique signature for `CBaseEntity_SetOwner`.

### 7. Write IDA Analysis Output as YAML

**ALWAYS** Use SKILL `/write-vfunc-as-yaml` to write the analysis results.

Required parameters:
- `func_name`: `CBaseEntity_SetOwner`
- `func_addr`: The resolved function address from step 4
- `func_sig`: The validated signature from step 6

VTable parameters:
- `vtable_name`: `CBaseEntity`
- `vfunc_offset`: `0x1A0` (Windows) / `0x198` (Linux) — may change with game updates
- `vfunc_index`: `52` (Windows) / `51` (Linux) — may change with game updates

## Function Characteristics

- **VTable Class**: `CBaseEntity`
- **Parameters**: `(CBaseEntity* this, CBaseEntity* owner)`
- **Purpose**: Sets the owner entity for a given entity (e.g., assigning weapon ownership to a player pawn during equip)
- **Called from**: `CCSPlayer_WeaponServices_EquipWeapon` — called with the player's pawn as the owner argument

## VTable Information

- **VTable Name**: `CBaseEntity`
- **VTable Mangled Name**:
  - Windows: `??_7CBaseEntity@@6B@`
  - Linux: `_ZTV11CBaseEntity`
- **VTable Offset**: `0x1A0` (Windows) / `0x198` (Linux) — may change with game updates
- **VTable Index**: `52` (Windows) / `51` (Linux) — may change with game updates

## Output YAML Format

The output YAML filename depends on the platform:
- `server.dll` → `CBaseEntity_SetOwner.windows.yaml`
- `libserver.so` / `libserver.so` → `CBaseEntity_SetOwner.linux.yaml`

## Troubleshooting

**If CCSPlayer_WeaponServices_EquipWeapon YAML not found:**
- Run `/find-CCSPlayer_WeaponServices_PickupItem-AND-CCSPlayer_WeaponServices_EquipWeapon` first

**If CBaseEntity vtable YAML not found:**
- Run `/write-vtable-as-yaml` with `class_name=CBaseEntity` first

**If the vtable offset differs from expected:**
- The vtable layout may have changed in a game update
- Look for the first vtable call after `sub_XXXXXXXX(a2 + 182)` / `sub_XXXXXXXX(a2 + 274)` in the decompiled output
- The call passes `*(_QWORD *)(a1 + 56)` (the player pawn) as the second argument — this is the distinguishing pattern

Files in this skill

  • README.md885 B
  • skill.md5.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.