From 010a9c9da88489e369723b484124fe00f54ffaf8 Mon Sep 17 00:00:00 2001 From: AtomBottle Date: Tue, 9 Jul 2024 18:18:35 +0800 Subject: [PATCH] Update - Aimbot --- cs_dma.cpp | 119 ++++++++++++++++++++++++++++------ game.cpp | 19 ++++-- game.h | 3 +- offset.h | 26 ++++---- radar/react/package-lock.json | 9 +-- radar/react/src/App.jsx | 4 +- radar/web_server/app.js | 4 +- sdk/InputManager.cpp | 29 ++++++++- sdk/ray_trace.h | 2 +- 9 files changed, 164 insertions(+), 51 deletions(-) diff --git a/cs_dma.cpp b/cs_dma.cpp index a694c42..c82c494 100644 --- a/cs_dma.cpp +++ b/cs_dma.cpp @@ -17,7 +17,6 @@ typedef struct local_player{ }; typedef struct player{ - std::vector bones; }; @@ -36,18 +35,23 @@ ws::pointer web_socket; std::string map_name; json m_data{}; +//aimbot +BonePos selected_bone; + /* Cheat Settings */ //web-radar -bool radar = true; +bool radar = false; //rcs bool rcs = true; //aimbot -bool aimbot = false; -Vector ray_end_pos; //test +bool aimbot = true; +uint32_t aim_key = VK_XBUTTON2; +uint32_t secondary_key = VK_XBUTTON1; +float aim_range = 70.0f; void RCS(){ Vector2D prev_punchAngles = Vector2D{ 0 , 0 }; @@ -55,8 +59,6 @@ void RCS(){ while(game_base && rcs){ std::this_thread::sleep_for(std::chrono::milliseconds(1)); - PlayerPawn LocalPawn = getLocalPawn(); - Vector2D viewAngles = local.viewAngles; Vector2D punchAngles = local.punchAngles; @@ -73,9 +75,6 @@ void RCS(){ }else{ prev_punchAngles.x = prev_punchAngles.y = 0.f; } - -//printf("rcs running\n"); - } } @@ -143,7 +142,10 @@ void UpdatePlayers(){ for(int i = 0; i < 64; i++){ PlayerController PlayerController = getController(EntityListEntry, i); PlayerPawn PlayerPawn = PlayerController.getPawn(EntityListEntry); + std::string player_name = PlayerController.getName(); + bool is_dead = (PlayerPawn.getHealth() <= 0); + if(radar && !player_name.empty()){ //stupid way but works json m_player_data{}; m_player_data["m_idx"] = i; @@ -155,7 +157,7 @@ void UpdatePlayers(){ m_player_data["m_position"]["x"] = PlayerPawn.getPos().x; m_player_data["m_position"]["y"] = PlayerPawn.getPos().y; m_player_data["m_eye_angle"] = PlayerPawn.getViewAngles().y; - m_player_data["m_is_dead"] = (PlayerPawn.getHealth() <= 0); + m_player_data["m_is_dead"] = is_dead; m_player_data["m_model_name"] = PlayerPawn.getModelName(); m_player_data["m_steam_id"] = PlayerController.getSteamID(); m_player_data["m_money"] = PlayerController.getCash(); @@ -177,23 +179,102 @@ void UpdatePlayers(){ m_data["m_players"].push_back(m_player_data); } - if(PlayerPawn.ptr == LocalPawn.ptr){ - //nothing - } } - if (duration >= std::chrono::milliseconds(5) && radar) - { + //websocket + if (duration >= std::chrono::milliseconds(50) && radar) + { start = now; web_socket->send(m_data.dump()); } if(radar) web_socket->poll(); - //printf("%s\n\n\n\n", m_data.dump().c_str()); + //printf("radar: %s\n", m_data.dump().c_str()); } } +typedef struct aimPosList{ + PlayerPawn pawn; + float dist; + int x = 0; + int y = 0; +}aimPosList; + void Aimbot(){ + uint64_t last_target; + while(game_base && aimbot){ - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + PlayerPawn LocalPawn = getLocalPawn(); + Vector local_pos = LocalPawn.getPos(); + + uint64_t EntityListEntry = mem.Read(mem.Read(client_base + OFFSET_ENTITY_LIST) + 0x10); + + std::vector list; + + for(int i = 0; i < 64; i++){ + PlayerController PlayerController = getController(EntityListEntry, i); + PlayerPawn PlayerPawn = PlayerController.getPawn(EntityListEntry); + + std::string player_name = PlayerController.getName(); + bool is_dead = (PlayerPawn.getHealth() <= 0); + + //aimbot + if(keyboard.IsKeyDown(aim_key)){ + BonePos preferred_bone; + float arrange_distence = FLT_MAX; //arrange + if(player_name.empty()) continue; + players[i].bones = PlayerPawn.getBones(); + //player not in screen + if(!players[i].bones[head].in_screen && !players[i].bones[leg_lower_L].in_screen && !players[i].bones[leg_lower_R].in_screen){ + continue; + }else if(PlayerPawn.ptr == LocalPawn.ptr){ + continue; + }else if (!is_dead) + { + bool has_target = false; + //select the cloest bone + for(BonePos bone: players[i].bones){ + if(bone.in_screen){ + float screen_dist = bone.ScreenPos.DistTo(Vector2D{960, 540}); + if(screen_dist < arrange_distence && screen_dist <= aim_range && map.is_visible(local.CameraPos, bone.Pos)){ + //if the dist is cloest and bone is visible + arrange_distence = screen_dist; + preferred_bone = bone; + has_target = true; + } + } + } + float screen_dist = players[i].bones[head].ScreenPos.DistTo(Vector2D{960, 540}); + + if(keyboard.IsKeyDown(secondary_key) && screen_dist <= aim_range && map.is_visible(local.CameraPos, players[i].bones[head].Pos)){ + preferred_bone = players[i].bones[head]; + } + selected_bone = preferred_bone; + Vector2D aimPos_screen = selected_bone.ScreenPos; + if(abs(aimPos_screen.x - 960) < 2 && abs(aimPos_screen.y - 960) < 2) continue; + aimPos_screen.x -= 960; + aimPos_screen.y -= 540; + + if(has_target) list.push_back({PlayerPawn, PlayerPawn.getPos().DistTo(local_pos), (int)aimPos_screen.x, (int)aimPos_screen.y}); + + has_target = false; + } + } + } + //qmp.SmoothMove((int)aimPos_screen.x, (int)aimPos_screen.y); + + aimPosList aimPos; + float minimum_dist = FLT_MAX; + for(auto pos: list){ + aimPos = (minimum_dist > pos.dist) ? pos : aimPos; + if(pos.pawn.ptr == last_target){ + aimPos = pos; + break; + } + } + + if(abs(aimPos.dist) > 1){ + qmp.SmoothMove(aimPos.x, aimPos.y); + last_target = aimPos.pawn.ptr; + } } } @@ -204,7 +285,7 @@ int main(int argc, char *argv[]){ }std::cout << "[+] Memory API initialized!" << std::endl; if(argc > 1){ - std::cout << "[+] Loading meshes data from file" << argv[1] << ".tri" << std::endl; + std::cout << "[+] Loading meshes from file " << argv[1] << ".tri" << std::endl; map.load_map(argv[1]); } else printf("[-] Please input map name\n"); @@ -231,7 +312,7 @@ int main(int argc, char *argv[]){ } } - web_socket = ws::from_url("ws://127.0.0.1:22006/cs2_webradar"); + web_socket = ws::from_url("ws://127.0.0.1:8081/cs2_webradar"); if (!web_socket) { std::cout << "[-] Failed to initialize WebSocket!" << std::endl; diff --git a/game.cpp b/game.cpp index 72c67c4..e23ab89 100644 --- a/game.cpp +++ b/game.cpp @@ -37,7 +37,7 @@ Vector PlayerPawn::getCameraPos(){ std::vector PlayerPawn::getBones(){ std::vector bones; uint64_t GameSceneNode = mem.Read(ptr + OFFSET_GAME_SCENE_NODE); - uint64_t BoneArrayAddress = mem.Read(ptr + OFFSET_BONE_ARRAY); + uint64_t BoneArrayAddress = mem.Read(GameSceneNode + OFFSET_BONE_ARRAY); BoneJointData BoneData; BonePos bones_tmp; for (int i = 0; i < 30; i++){ @@ -257,19 +257,24 @@ uint64_t getEntityByClassName(std::string class_name) // other funcs bool WorldToScreen(const Vector& Pos, Vector2D& ToPos, VMatrix Matrix, int width, int height) { + /* + printf("%f, %f, %f, %f\n", Matrix[0][1], Matrix[0][2], Matrix[0][3], Matrix[0][4]); + printf("%f, %f, %f, %f\n", Matrix[1][1], Matrix[1][2], Matrix[1][3], Matrix[1][4]); + printf("%f, %f, %f, %f\n", Matrix[2][1], Matrix[2][2], Matrix[2][3], Matrix[2][4]); + printf("%f, %f, %f, %f\n\n", Matrix[3][1], Matrix[3][2], Matrix[3][3], Matrix[3][4]); + */ float View = 0.f; float SightX = width / 2; - float SightY = height / 2; + float SightY = height / 2; View = Matrix[3][0] * Pos.x + Matrix[3][1] * Pos.y + Matrix[3][2] * Pos.z + Matrix[3][3]; - - if (View <= 0.01) - return false; + + if(View <= 0.01f) return false; ToPos.x = SightX + (Matrix[0][0] * Pos.x + Matrix[0][1] * Pos.y + Matrix[0][2] * Pos.z + Matrix[0][3]) / View * SightX; ToPos.y = SightY - (Matrix[1][0] * Pos.x + Matrix[1][1] * Pos.y + Matrix[1][2] * Pos.z + Matrix[1][3]) / View * SightY; - - return true; + + return true; } void setViewAngles(Vector2D angles){ diff --git a/game.h b/game.h index 99261ae..1d208ae 100644 --- a/game.h +++ b/game.h @@ -6,7 +6,8 @@ struct BoneJointData { Vector Pos; - char pad[0x14]; + float Scale; + char pad[0x10]; }; struct BonePos diff --git a/offset.h b/offset.h index 54883e7..971dda4 100644 --- a/offset.h +++ b/offset.h @@ -1,25 +1,25 @@ //https://github.com/a2x/cs2-dumper/blob/main/output/offsets.hpp -#define OFFSET_LOCAL_PAWN 0x181A9B8 //dwLocalPlayerPawn -#define OFFSET_LOCAL_CONTROLLER 0x1A04768 //dwLocalPlayerController -#define OFFSET_VIEW_ANGLES 0x1A23848 //dwViewAngles -#define OFFSET_SENSITIVITY 0x1A13248 //dwSensitivity -#define OFFSET_VIEW 0x1A16A60 //dwViewMatrix -#define OFFSET_ENTITY_LIST 0x19B49B8 //dwEntityList -#define OFFSET_GLOBAL_VARS 0x180E500 //dwGlobalVars -#define OFFSET_MAP_NAME 0x1A42E0 //dwGameTypes_mapName -#define OFFSET_C4 0x1A1B7A8 //dwPlantedC4 +#define OFFSET_LOCAL_PAWN 0x1823A08 //dwLocalPlayerPawn +#define OFFSET_LOCAL_CONTROLLER 0x1A0D9A8 //dwLocalPlayerController +#define OFFSET_VIEW_ANGLES 0x1A2D248 //dwViewAngles +#define OFFSET_SENSITIVITY 0x1A1C338 //dwSensitivity +#define OFFSET_VIEW 0x1A1FCD0 //dwViewMatrix +#define OFFSET_ENTITY_LIST 0x19BDd78 //dwEntityList +#define OFFSET_GLOBAL_VARS 0x1817638 //dwGlobalVars +#define OFFSET_MAP_NAME 0x1A41C0 + 0x120 //dwGameTypes + dwGameTypes_mapName +#define OFFSET_C4 0x1A251A8 //dwPlantedC4 //https://github.com/a2x/cs2-dumper/blob/main/output/client.dll.hpp -#define OFFSET_SHOTS_FIRED 0x22A4 //m_iShotsFired +#define OFFSET_SHOTS_FIRED 0x22B4 //m_iShotsFired #define OFFSET_EYE_ANGLE 0x1388 //m_angEyeAngles #define OFFSET_AIM_PUNCH 0x14CC //m_aimPunchAngle #define OFFSET_GAME_SCENE_NODE 0x308 //m_pGameSceneNode -#define OFFSET_BONE_ARRAY 0x170 + 0x88 //m_modelState + CGameSceneNode::m_vecOrigin +#define OFFSET_BONE_ARRAY 0x1f0 //m_modelState + ? #define OFFSET_CAMERA_POS 0x12D4 //m_vecLastClipCameraPos #define OFFSET_PLAYER_PAWN 0x7DC //m_hPlayerPawn #define OFFSET_TEAM_NUM 0x3C3 //m_iTeamNum #define OFFSET_HEALTH 0x324 //m_iHealth -#define OFFSET_ARMOR 0x22c0 //m_armorvalue +#define OFFSET_ARMOR 0x22D0 //m_armorvalue #define OFFSET_WEAPON_SERVICE 0x10F8 //m_pweaponservices #define OFFSET_ACTIVE_WEAPON 0x58 //m_hactiveweapon #define OFFSET_SUBCLASS_ID 0x358 //m_nSubclassID @@ -48,6 +48,8 @@ //keyboard #define VK_F4 0x73 +#define VK_XBUTTON1 0x05 +#define VK_XBUTTON2 0x06 //bone enum BONE: int diff --git a/radar/react/package-lock.json b/radar/react/package-lock.json index 4a394c1..2b1ae15 100644 --- a/radar/react/package-lock.json +++ b/radar/react/package-lock.json @@ -1368,9 +1368,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001549", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", - "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "dev": true, "funding": [ { @@ -1385,7 +1385,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", diff --git a/radar/react/src/App.jsx b/radar/react/src/App.jsx index f22c6a6..aeddec1 100644 --- a/radar/react/src/App.jsx +++ b/radar/react/src/App.jsx @@ -9,8 +9,8 @@ import { MaskedIcon } from './MaskedIcon/MaskedIcon'; // if you want to share the radar, set this to '0', otherwise let it be '1'. const USE_LOCALHOST = 0; -const PUBLIC_IP = "192.168.122.1"; -const PORT = 22006; +const PUBLIC_IP = "103.71.69.61"; +const PORT = 42051; const App = () => { const [averageLatency, setAverageLatency] = useState(0); diff --git a/radar/web_server/app.js b/radar/web_server/app.js index d46d72c..9ccdfbc 100644 --- a/radar/web_server/app.js +++ b/radar/web_server/app.js @@ -3,7 +3,7 @@ import http from "http"; console.log("web_server started") -const port = 22006; +const port = 8081; const server = http.createServer(); const web_socket_server = new WebSocketServer( { @@ -30,4 +30,4 @@ web_socket_server.on("connection", (web_socket, request) => { }); server.listen(port); -console.info(`listening on port '${port}'`); \ No newline at end of file +console.info(`listening on port '${port}'`); diff --git a/sdk/InputManager.cpp b/sdk/InputManager.cpp index 7a5b8dc..03a7d52 100644 --- a/sdk/InputManager.cpp +++ b/sdk/InputManager.cpp @@ -17,7 +17,7 @@ bool c_keys::InitKeyboard() uintptr_t tmp = VMMDLL_ProcessGetModuleBaseU(mem.vHandle, pid, const_cast("win32ksgd.sys")); uintptr_t g_session_global_slots = tmp + 0x3110; uintptr_t user_session_state = mem.ReadPID(mem.ReadPID(mem.ReadPID(g_session_global_slots, pid), pid), pid); - gafAsyncKeyStateExport = user_session_state + 0x3690; + gafAsyncKeyStateExport = user_session_state + 0x36a8; if (gafAsyncKeyStateExport > 0x7FFFFFFFFFFF) break; } @@ -200,7 +200,19 @@ void QMP::moveto(moves to){ if( abs(to.x) > 1 || abs(to.y) > 1){ while(true){ moves point_to_move = { 0 , 0 }; - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + + auto start = std::chrono::system_clock::now(); + while(true){ + const auto now = std::chrono::system_clock::now(); + + const auto duration = now - start; + + if (duration >= std::chrono::milliseconds(1)){ + break; + } + } + + //std::this_thread::sleep_for(std::chrono::milliseconds(1)); if(to.x > 1){ to.x -= 1; @@ -226,7 +238,18 @@ void QMP::moveto(moves to){ } } }else{ - std::this_thread::sleep_for(std::chrono::milliseconds(1)); + //std::this_thread::sleep_for(std::chrono::nanoseconds(1000000)); + auto start = std::chrono::system_clock::now(); + while(true){ + const auto now = std::chrono::system_clock::now(); + + const auto duration = now - start; + + if (duration >= std::chrono::milliseconds(1)){ + break; + } + } + MoveMouse(to.x, to.y); } } diff --git a/sdk/ray_trace.h b/sdk/ray_trace.h index 395b26a..c68cc89 100644 --- a/sdk/ray_trace.h +++ b/sdk/ray_trace.h @@ -199,6 +199,6 @@ class map_loader { } bool is_visible(Vector ray_origin, Vector ray_end) { - return rayIntersectsKDTree(kd_tree, ray_origin, ray_end); + return !rayIntersectsKDTree(kd_tree, ray_origin, ray_end); } }; \ No newline at end of file