Official site anti-cheat Ultra Core Protector

Home Download F.A.Q. Addons Monitor Forum Support Advertise English version site UCP Anti-Cheat  Russian version site UCP Anti-Cheat
Ultra Core Protector - is the client-server anti-cheat freeware, for server protection from unscrupulous players.

Abilities Supported games  
Half-Life
Condition Zero
Counter-Strike 1.6
Day of Defeat
Adrenaline Gamer
Team Fortress Classic
Counter-Strike Source
MU Online
Ragnarok Online
Half-Life 2 Deathmatch
Adrenaline Gamer 2
Team Fortress 2
No more GetKeyState/GetAsyncKeyState

I’ve seen too many people use these functions, so I’ve decided to post about this.

Luckily, the game already keeps track of which buttons are down or not, which is handled in CInputSystem:

bool CInputSystem::IsButtonDown( ButtonCode_t code ) const
{
return m_InputState[INPUT_STATE_CURRENT].m_ButtonState.IsBitSet( code );
}

It’s also handy since when you’re tabbed out for example, the buttons won’t be updated, so you won’t be aimbotting when you’re going about in Windows.

Internally, you can get this interface via the vstdlib.dll’s factory (or appsystem): InputSystemVersion001

Then, you can call bool IsButtonDown(ButtonCode_t code) at vtable index 15.

Externally, you also need the interface pointer (I use a reversed version of CreateInterface, it’s also posted here if you need it, search!). Once you have the interface pointer, here’s a reversed version of IsButtonDown:

bool is_button_down(const buttoncode_t& button)
{
auto a2 = static_cast(button);

DWORD result;

if (!get_memory_manager()->read_raw(get_pointer() + (((a2 >> 5) * sizeof(DWORD)) + offsets::button_bits), &result, sizeof(result))) return false;

return ((1 << (a2 & 0x1F)) & result) != 0; }

get_pointer() being the interface pointer.

offsets::button_bits:
GET_OFFSET_FROM_PATTERN(offsets::button_bits, inputsystem, "8D 9F ? ? ? ? 69 C0 ? ? ? ? 03 D8 8B C2 C1 F8 05", 0x0, 0, false, false, true);

offsets::button_bits = inputsystem->dereference_file_offset(offsets::button_bits + 2) + inputsystem->dereference_file_offset(offsets::button_bits + 8);

in inputsystem.dll.

ButtonCode_t:
enum ButtonCode_t
{

BUTTON_CODE_INVALID = -1,
BUTTON_CODE_NONE = 0,

KEY_FIRST = 0,

KEY_NONE = KEY_FIRST,
KEY_0,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_A,
KEY_B,
KEY_C,
KEY_D,
KEY_E,
KEY_F,
KEY_G,
KEY_H,
KEY_I,
KEY_J,
KEY_K,
KEY_L,
KEY_M,
KEY_N,
KEY_O,
KEY_P,
KEY_Q,
KEY_R,
KEY_S,
KEY_T,
KEY_U,
KEY_V,
KEY_W,
KEY_X,
KEY_Y,
KEY_Z,
KEY_PAD_0,
KEY_PAD_1,
KEY_PAD_2,
KEY_PAD_3,
KEY_PAD_4,
KEY_PAD_5,
KEY_PAD_6,
KEY_PAD_7,
KEY_PAD_8,
KEY_PAD_9,
KEY_PAD_DIVIDE,
KEY_PAD_MULTIPLY,
KEY_PAD_MINUS,
KEY_PAD_PLUS,
KEY_PAD_ENTER,
KEY_PAD_DECIMAL,
KEY_LBRACKET,
KEY_RBRACKET,
KEY_SEMICOLON,
KEY_APOSTROPHE,
KEY_BACKQUOTE,
KEY_COMMA,
KEY_PERIOD,
KEY_SLASH,
KEY_BACKSLASH,
KEY_MINUS,
KEY_EQUAL,
KEY_ENTER,
KEY_SPACE,
KEY_BACKSPACE,
KEY_TAB,
KEY_CAPSLOCK,
KEY_NUMLOCK,
KEY_ESCAPE,
KEY_SCROLLLOCK,
KEY_INSERT,
KEY_DELETE,
KEY_HOME,
KEY_END,
KEY_PAGEUP,
KEY_PAGEDOWN,
KEY_BREAK,
KEY_LSHIFT,
KEY_RSHIFT,
KEY_LALT,
KEY_RALT,
KEY_LCONTROL,
KEY_RCONTROL,
KEY_LWIN,
KEY_RWIN,
KEY_APP,
KEY_UP,
KEY_LEFT,
KEY_DOWN,
KEY_RIGHT,
KEY_F1,
KEY_F2,
KEY_F3,
KEY_F4,
KEY_F5,
KEY_F6,
KEY_F7,
KEY_F8,
KEY_F9,
KEY_F10,
KEY_F11,
KEY_F12,
KEY_CAPSLOCKTOGGLE,
KEY_NUMLOCKTOGGLE,
KEY_SCROLLLOCKTOGGLE,

KEY_LAST = KEY_SCROLLLOCKTOGGLE,
KEY_COUNT = KEY_LAST - KEY_FIRST + 1,

// Mouse
MOUSE_FIRST = KEY_LAST + 1,

MOUSE_LEFT = MOUSE_FIRST,
MOUSE_RIGHT,
MOUSE_MIDDLE,
MOUSE_4,
MOUSE_5,
MOUSE_WHEEL_UP, // A fake button which is 'pressed' and 'released' when the wheel is moved up
MOUSE_WHEEL_DOWN, // A fake button which is 'pressed' and 'released' when the wheel is moved down

MOUSE_LAST = MOUSE_WHEEL_DOWN,
MOUSE_COUNT = MOUSE_LAST - MOUSE_FIRST + 1,

};