Skip to content

Commit

Permalink
Store 'hooks' object in GlobalContext class
Browse files Browse the repository at this point in the history
  • Loading branch information
danielkrupinski committed Jul 18, 2023
1 parent 81e80a0 commit 42c7948
Show file tree
Hide file tree
Showing 14 changed files with 111 additions and 87 deletions.
73 changes: 37 additions & 36 deletions Source/Endpoints.h

Large diffs are not rendered by default.

23 changes: 15 additions & 8 deletions Source/GUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
#include <Config/ResetConfigurator.h>
#include "Hacks/Features.h"

#include "Hooks.h"

constexpr auto windowFlags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize
| ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoScrollWithMouse;

Expand Down Expand Up @@ -94,25 +96,30 @@ GUI::GUI() noexcept
addFontFromVFONT("csgo/panorama/fonts/notosanssc-regular.vfont", 17.0f, io.Fonts->GetGlyphRangesChineseFull(), true);
}

void GUI::render(const EngineInterfaces& engineInterfaces, const ClientInterfaces& clientInterfaces, const OtherInterfaces& interfaces, const Memory& memory, Config& config) noexcept
void GUI::render(Hooks& hooks, const EngineInterfaces& engineInterfaces, const ClientInterfaces& clientInterfaces, const OtherInterfaces& interfaces, const Memory& memory, Config& config) noexcept
{
auto& features = config.getFeatures();
if (!config.style.menuStyle) {
renderMenuBar(config.getFeatures());
renderMenuBar(features);
renderAimbotWindow(config);
renderTriggerbotWindow(config);
config.getFeatures().backtrack.drawGUI(false);
config.getFeatures().glow.drawGUI(false);
features.backtrack.drawGUI(false);
features.glow.drawGUI(false);
renderChamsWindow(config);
StreamProofESP::drawGUI(config, false);
config.getFeatures().visuals.drawGUI(false);
config.getFeatures().inventoryChanger.drawGUI(memory, false);
config.getFeatures().sound.drawGUI(false);
features.visuals.drawGUI(false);
features.inventoryChanger.drawGUI(memory, false);
features.sound.drawGUI(false);
renderStyleWindow(config);
config.getFeatures().misc.drawGUI(config.getFeatures().visuals, config.getFeatures().inventoryChanger, config.getFeatures().glow, false);
features.misc.drawGUI(features.visuals, features.inventoryChanger, features.glow, false);
renderConfigWindow(interfaces, memory, config);
} else {
renderGuiStyle2(engineInterfaces, clientInterfaces, interfaces, memory, config);
}
if (features.misc.unhook) {
hooks.uninstall(features.misc, features.glow, memory, features.visuals, features.inventoryChanger, clientInterfaces.getClient().getPOD(), engineInterfaces, interfaces);
features.misc.unhook = false;
}
}

void GUI::updateColors(Config& config) const noexcept
Expand Down
3 changes: 2 additions & 1 deletion Source/GUI.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@
class Visuals;
struct ImFont;
class ClientInterfaces;
class Hooks;
class Misc;

class GUI {
public:
GUI() noexcept;
void render(const EngineInterfaces& engineInterfaces, const ClientInterfaces& clientInterfaces, const OtherInterfaces& interfaces, const Memory& memory, Config& config) noexcept;
void render(Hooks& hooks, const EngineInterfaces& engineInterfaces, const ClientInterfaces& clientInterfaces, const OtherInterfaces& interfaces, const Memory& memory, Config& config) noexcept;
void handleToggle(Misc& misc, const OtherInterfaces& interfaces) noexcept;
[[nodiscard]] bool isOpen() const noexcept { return open; }
private:
Expand Down
11 changes: 9 additions & 2 deletions Source/GlobalContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,20 @@

#include "Platform/DynamicLibrary.h"

#if IS_WIN32() || IS_WIN64()
GlobalContext::GlobalContext(HMODULE moduleHandle)
: moduleHandle{ moduleHandle }
#elif IS_LINUX()
GlobalContext::GlobalContext()
#endif
{
const DynamicLibrary clientDLL{ csgo::CLIENT_DLL };
const DynamicLibrary engineDLL{ csgo::ENGINE_DLL };

PatternNotFoundHandler patternNotFoundHandler;
retSpoofGadgets.emplace(PatternFinder{ clientDLL.getCodeSection().raw(), patternNotFoundHandler}, PatternFinder{clientDLL.getCodeSection().raw(), patternNotFoundHandler});
retSpoofGadgets.emplace(PatternFinder{ clientDLL.getCodeSection().raw(), patternNotFoundHandler }, PatternFinder{ engineDLL.getCodeSection().raw(), patternNotFoundHandler });

hooks.emplace(clientDLL, engineDLL, DynamicLibrary{ csgo::VSTDLIB_DLL }, DynamicLibrary{ csgo::VGUIMATSURFACE_DLL });
}

#if IS_LINUX()
Expand Down Expand Up @@ -122,7 +129,7 @@ void GlobalContext::renderFrame()
gui->handleToggle(features->misc, getOtherInterfaces());

if (gui->isOpen())
gui->render(getEngineInterfaces(), ClientInterfaces{ retSpoofGadgets->client, *clientInterfaces }, getOtherInterfaces(), *memory, *config);
gui->render(*hooks, getEngineInterfaces(), ClientInterfaces{ retSpoofGadgets->client, *clientInterfaces }, getOtherInterfaces(), *memory, *config);
}

ImGui::EndFrame();
Expand Down
8 changes: 7 additions & 1 deletion Source/GlobalContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "Utils/ReturnAddress.h"
#include "InventoryChanger/InventoryChanger.h"
#include "Hacks/Features.h"
#include "Hooks.h"

namespace csgo
{
Expand All @@ -47,13 +48,18 @@ enum class GlobalContextState {

class GlobalContext {
public:
#if IS_WIN32() || IS_WIN64()
GlobalContext(HMODULE moduleHandle);

HMODULE moduleHandle;
#elif IS_LINUX()
GlobalContext();

#if IS_LINUX()
int pollEventHook(SDL_Event* event);
void swapWindowHook(SDL_Window* window);
#endif

std::optional<Hooks> hooks;
std::optional<EventListener> gameEventListener;
std::optional<EngineInterfacesPODs> engineInterfacesPODs;
std::optional<Features> features;
Expand Down
8 changes: 4 additions & 4 deletions Source/Hacks/Chams.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ void Chams::renderPlayer(Backtrack& backtrack, const csgo::Entity& player) noexc
const auto records = backtrack.getRecords(player.getNetworkable().index());
if (records && !records->empty() && backtrack.valid(engineInterfaces.getEngine(), memory, records->front().simulationTime)) {
if (!appliedChams)
hooks->modelRenderHooks.getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customBoneToWorld);
modelRenderHooks->getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customBoneToWorld);
applyChams(chamsMaterials[static_cast<std::size_t>(ChamsCategory::Backtrack)].materials, health, records->back().matrix);
interfaces.getStudioRender().forcedMaterialOverride(nullptr);
}
Expand Down Expand Up @@ -170,7 +170,7 @@ void Chams::applyChams(const std::array<ChamsLayer, 7>& chams, int health, csgo:
material.setMaterialVarFlag(MaterialVarFlag::IGNOREZ, true);
material.setMaterialVarFlag(MaterialVarFlag::WIREFRAME, cham.wireframe);
interfaces.getStudioRender().forcedMaterialOverride(material.getPOD());
hooks->modelRenderHooks.getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);
modelRenderHooks->getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);
interfaces.getStudioRender().forcedMaterialOverride(nullptr);
}

Expand Down Expand Up @@ -215,12 +215,12 @@ void Chams::applyChams(const std::array<ChamsLayer, 7>& chams, int health, csgo:
material.alphaModulate(pulse);

if (cham.cover && !appliedChams)
hooks->modelRenderHooks.getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);
modelRenderHooks->getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);

material.setMaterialVarFlag(MaterialVarFlag::IGNOREZ, false);
material.setMaterialVarFlag(MaterialVarFlag::WIREFRAME, cham.wireframe);
interfaces.getStudioRender().forcedMaterialOverride(material.getPOD());
hooks->modelRenderHooks.getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);
modelRenderHooks->getOriginalDrawModelExecute()(std::get<csgo::ModelRenderPOD*>(engineInterfaces.getPODs()), ctx, state, info, customMatrix ? customMatrix : customBoneToWorld);
appliedChams = true;
}
}
7 changes: 7 additions & 0 deletions Source/Hacks/Chams.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct MaterialPOD;
}

class Backtrack;
class ModelRenderHooks;

class Chams {
public:
Expand All @@ -39,6 +40,11 @@ class Chams {
bool render(Backtrack& backtrack, void*, void*, const csgo::ModelRenderInfo&, csgo::matrix3x4*) noexcept;
void updateInput() noexcept;

void setModelRenderHooks(const ModelRenderHooks* modelRenderHooks) noexcept
{
this->modelRenderHooks = modelRenderHooks;
}

static constexpr auto numberOfCategories = 9;

struct ChamsCategoryMaterials {
Expand Down Expand Up @@ -84,4 +90,5 @@ class Chams {
OtherInterfaces interfaces;
const Memory& memory;
ChamsMaterials materials;
const ModelRenderHooks* modelRenderHooks = nullptr;
};
2 changes: 1 addition & 1 deletion Source/Hacks/Misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1547,7 +1547,7 @@ void Misc::drawGUI(Visuals& visuals, inventory_changer::InventoryChanger& invent
ImGui::PopID();

if (ImGui::Button("Unhook"))
hooks->uninstall(*this, glow, memory, visuals, inventoryChanger, clientInterfaces.getClient().getPOD(), engineInterfaces, interfaces);
unhook = true;

ImGui::Columns(1);
if (!contentOnly)
Expand Down
2 changes: 2 additions & 0 deletions Source/Hacks/Misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ class Misc {
void fromJson(const json& j) noexcept;
void resetConfig() noexcept;

bool unhook = false;

private:
void onVoteStart(const void* data, int size) noexcept;
void onVotePass() noexcept;
Expand Down
4 changes: 2 additions & 2 deletions Source/Hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@
HRESULT __stdcall reset(IDirect3DDevice9* device, D3DPRESENT_PARAMETERS* params) noexcept;
HRESULT __stdcall present(IDirect3DDevice9* device, const RECT* src, const RECT* dest, HWND windowOverride, const RGNDATA* dirtyRegion) noexcept;

DWORD WINAPI unload(HMODULE moduleHandle) noexcept;
DWORD WINAPI unload(LPVOID) noexcept;
#elif IS_LINUX()

int pollEvent(SDL_Event* event) noexcept;
Expand Down Expand Up @@ -167,7 +167,7 @@ void Hooks::uninstall(Misc& misc, Glow& glow, const Memory& memory, Visuals& vis
**reinterpret_cast<void***>(memory.present) = originalPresent;
**reinterpret_cast<void***>(memory.reset) = originalReset;

if (HANDLE thread = CreateThread(nullptr, 0, LPTHREAD_START_ROUTINE(unload), moduleHandle, 0, nullptr))
if (HANDLE thread = CreateThread(nullptr, 0, LPTHREAD_START_ROUTINE(unload), 0, 0, nullptr))
CloseHandle(thread);
#elif IS_LINUX()
*reinterpret_cast<decltype(pollEvent)*>(sdlFunctions.pollEvent) = pollEvent;
Expand Down
10 changes: 1 addition & 9 deletions Source/Hooks.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ int pollEvent(SDL_Event* event) noexcept;
class Hooks {
public:
#if IS_WIN32() || IS_WIN64()
Hooks(HMODULE moduleHandle, DynamicLibrary clientDll, DynamicLibrary engineDll, DynamicLibrary vstdlibDll, DynamicLibrary vguiMatSurfaceDll) noexcept
Hooks(DynamicLibrary clientDll, DynamicLibrary engineDll, DynamicLibrary vstdlibDll, DynamicLibrary vguiMatSurfaceDll) noexcept
: windowProcedureHook{ FindWindowW(L"Valve001", nullptr) }
#if IS_WIN32()
, keyValuesSystemHooks{ VmtLengthCalculator{ vstdlibDll.getCodeSection(), vstdlibDll.getVmtSection() } }
Expand All @@ -82,7 +82,6 @@ class Hooks {
, svCheatsHooks{ VmtLengthCalculator{ engineDll.getCodeSection(), engineDll.getVmtSection() } }
, modelRenderHooks{ VmtLengthCalculator{ engineDll.getCodeSection(), engineDll.getVmtSection() } }
, surfaceHooks{ VmtLengthCalculator{ vguiMatSurfaceDll.getCodeSection(), vguiMatSurfaceDll.getVmtSection() } }
, moduleHandle{ moduleHandle }
{
}

Expand Down Expand Up @@ -136,11 +135,4 @@ class Hooks {
SvCheatsHooks svCheatsHooks;
ModelRenderHooks modelRenderHooks;
SurfaceHooks surfaceHooks;

private:
#if IS_WIN32() || IS_WIN64()
HMODULE moduleHandle;
#endif
};

inline std::optional<Hooks> hooks;
32 changes: 16 additions & 16 deletions Source/InventoryChanger/InventoryChanger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1248,15 +1248,15 @@ void InventoryChanger::overrideHudIcon(const Memory& memory, const csgo::GameEve
return static_cast<csgo::Tournament>(stringToUint64(removePrefix(s, "tournament:")));
}

void InventoryChanger::getArgAsStringHook(const Memory& memory, const char* string, ReturnAddress returnAddress, void* params)
void InventoryChanger::getArgAsStringHook(const PanoramaMarshallHelperHooks& panoramaMarshallHelperHooks, const Memory& memory, const char* string, ReturnAddress returnAddress, void* params)
{
if (returnAddress == returnAddresses.useToolGetArgAsString) {
const auto toolItemID = stringToUint64(string);
const auto destItemIdString = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
const auto destItemIdString = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
if (destItemIdString)
getRequestBuilder().useToolOn(ItemId{ toolItemID }, ItemId{ stringToUint64(destItemIdString) });
} else if (returnAddress == returnAddresses.wearItemStickerGetArgAsString) {
const auto slot = (std::uint8_t)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 1);
const auto slot = (std::uint8_t)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 1);
getRequestBuilder().wearStickerOf(ItemId{ stringToUint64(string) }, slot);
} else if (returnAddress == returnAddresses.setNameToolStringGetArgAsString) {
requestBuilderParams.nameTag = string;
Expand All @@ -1269,16 +1269,16 @@ void InventoryChanger::getArgAsStringHook(const Memory& memory, const char* stri
acknowledgeItem(memory, stringToUint64(string));
} else if (returnAddress == returnAddresses.setStatTrakSwapToolItemsGetArgAsString) {
const auto swapItem1 = ItemId{ stringToUint64(string) };
const auto swapItem2String = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
const auto swapItem2String = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
if (swapItem2String) {
requestBuilderParams.statTrakSwapItemID1 = swapItem1;
requestBuilderParams.statTrakSwapItemID2 = ItemId{ stringToUint64(swapItem2String) };
}
} else if (returnAddress == returnAddresses.setItemAttributeValueAsyncGetArgAsString) {
if (const auto itOptional = backend.itemFromID(ItemId{ stringToUint64(string) }); itOptional.has_value() && (*itOptional)->gameItem().isTournamentCoin()) {
const auto attribute = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
const auto attribute = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
if (attribute && std::strcmp(attribute, "sticker slot 0 id") == 0) {
const auto graffitiID = (int)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 2);
const auto graffitiID = (int)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 2);
backend.getItemModificationHandler().selectTeamGraffiti(*itOptional, static_cast<std::uint16_t>(graffitiID));
}
}
Expand All @@ -1287,14 +1287,14 @@ void InventoryChanger::getArgAsStringHook(const Memory& memory, const char* stri
if (tournament == csgo::Tournament{})
return;

const auto groupId = (std::uint16_t)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 1);
const auto pickInGroupIndex = (std::uint8_t)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 2);
hooks->panoramaMarshallHelperHooks.getOriginalSetResultInt()(memory.panoramaMarshallHelper, params, static_cast<int>(backend.getPickEm().getPickedTeam({ tournament, groupId, pickInGroupIndex })));
const auto groupId = (std::uint16_t)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 1);
const auto pickInGroupIndex = (std::uint8_t)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 2);
panoramaMarshallHelperHooks.getOriginalSetResultInt()(memory.panoramaMarshallHelper, params, static_cast<int>(backend.getPickEm().getPickedTeam({ tournament, groupId, pickInGroupIndex })));
} else if (returnAddress == returnAddresses.setInventorySortAndFiltersGetArgAsString) {
panoramaCodeInXrayScanner = (std::strcmp(string, "xraymachine") == 0);
} else if (returnAddress == returnAddresses.performItemCasketTransactionGetArgAsString) {
const auto operation = (int)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 0);
const auto storageUnitItemIdString = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);
const auto operation = (int)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(memory.panoramaMarshallHelper, params, 0);
const auto storageUnitItemIdString = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(memory.panoramaMarshallHelper, params, 1);

if (operation == 1) {
getRequestBuilder().addToStorageUnit(ItemId{ stringToUint64(string) }, ItemId{ stringToUint64(storageUnitItemIdString) });
Expand All @@ -1306,15 +1306,15 @@ void InventoryChanger::getArgAsStringHook(const Memory& memory, const char* stri
}
}

void InventoryChanger::getNumArgsHook(csgo::PanoramaMarshallHelperPOD* panoramaMarshallHelper, unsigned numberOfArgs, ReturnAddress returnAddress, void* params)
void InventoryChanger::getNumArgsHook(const PanoramaMarshallHelperHooks& panoramaMarshallHelperHooks, csgo::PanoramaMarshallHelperPOD* panoramaMarshallHelper, unsigned numberOfArgs, ReturnAddress returnAddress, void* params)
{
if (returnAddress != returnAddresses.setMyPredictionUsingItemIdGetNumArgs)
return;

if (numberOfArgs <= 1 || (numberOfArgs - 1) % 3 != 0)
return;

const char* tournamentStr = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(panoramaMarshallHelper, params, 0);
const char* tournamentStr = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(panoramaMarshallHelper, params, 0);
if (!tournamentStr)
return;

Expand All @@ -1323,9 +1323,9 @@ void InventoryChanger::getNumArgsHook(csgo::PanoramaMarshallHelperPOD* panoramaM
return;

for (unsigned i = 1; i < numberOfArgs; i += 3) {
const auto groupId = (std::uint16_t)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(panoramaMarshallHelper, params, i);
const auto pickInGroupIndex = (std::uint8_t)hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(panoramaMarshallHelper, params, i + 1);
const char* stickerItemID = hooks->panoramaMarshallHelperHooks.getOriginalGetArgAsString()(panoramaMarshallHelper, params, i + 2);
const auto groupId = (std::uint16_t)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(panoramaMarshallHelper, params, i);
const auto pickInGroupIndex = (std::uint8_t)panoramaMarshallHelperHooks.getOriginalGetArgAsNumber()(panoramaMarshallHelper, params, i + 1);
const char* stickerItemID = panoramaMarshallHelperHooks.getOriginalGetArgAsString()(panoramaMarshallHelper, params, i + 2);

if (!stickerItemID)
continue;
Expand Down
Loading

0 comments on commit 42c7948

Please sign in to comment.