Many people consider "pasting" to be a bad thing, but I consider it an opportunity to learn the language better and to eventually move on to creating your own hacks.
Requirements
-First I would at least try to familiarize your self with what is going on so you aren't just completely lost.
>>Watch a beginner tutorial on C++ or two, get an idea of the syntax so you can know a little bit about what you are looking at.
-Find a few free sources that look like decent starting points
>>Popular choices include Ayyware fixes and Ayyware rewrites. Find two or more sources with a fair amount of features, and download them to your desktop.
>>Choose something fairly new, so you wont have to update any offsets.
-Have Visual Studio 2015/2017 Community. (It's free, if you don't have it go download it or else you wont be getting anywhere)
Step One
-After you have your couple sources you want to pick one that either you like the menu better, maybe the cheat is a bit better/has better features, or whatever, just pick one of them to use as your 'base' for the cheat. (The other one will still be useful, DW)
-Open up the solution (mycheat.sln) in Visual Studio, set it to Windows 8.1 SDK, and click upgrade if it asks.
-At the top set the build to be "Debug" and "x86"
-Click "Build", and and make sure it compiles by default if it doesn't, look at the errors you're getting and try to figure out what needs to be fixed (or copy paste your error to google and see if someone else has a fix for it) (Try changing Debug to Release and recompile and see if that fixes it, if not change it back to Debug and begin troubleshooting)
-Move on after you have a successfully building base for your cheat.
>>You can even try launching csgo with "-insecure" in the launch options and injecting it if you want to really make sure it works.
Step Two
Now that you have a working base for your cheat, since it's public there is a 99% chance it is detected, or will be in the next couple days. You are going to have to change the "signature" of the hack.
>>A "signature" is how VAC will detect your cheat, it will scan for known "signatures" and if it finds one it knows it's a cheat, it'll ban you.
>>Lucky for you, changing the signature is relatively easy.
-Look around through some of the hack files, familiarize yourself with what is in your cheat. you'll probably have a "dllmain.cpp" file, and probably a couple other files for different parts of the cheat. (Ex. "Aimbot.cpp", "Misc.cpp", "ESP.cpp", etc.)
>>You mainly are going to be looking through the hack source files (.cpp) not the header files (.h). The cpp files will be where the actual "code" for the hack is.
-Next you're going to want to open your other cheat source you downloaded and look around in it as well. (PROBABLY MAKE SURE IT'S NOT THE EXACT SAME OR SUPER SIMILAR, LIKE TWO DIFFERENT "AYYWARE FIXES".)
-Notice the similarities between the two cheats such as where the aimbot code is, where the menu code is, where the misc hacks code is, etc.
-For this example I have a "Suicide.cc" source, and a random Ayyware fix source. Let's take a look at both of their "Rage Strafe" functions.
SUICIDE.CC:
Code:
void CMiscHacks::RageStrafe(CUserCmd *pCmd)
{
float strafespeed = 100;
IClientEntity* pLocal = (IClientEntity*)Interfaces::EntList->GetClientEntity(Interfaces::Engine->GetLocalPlayer());
bool bKeysPressed = true;
if (GUI.GetKeyState(0x41) || GUI.GetKeyState(0x57) || GUI.GetKeyState(0x53) || GUI.GetKeyState(0x44)) bKeysPressed = false;
if ((GetAsyncKeyState(VK_SPACE) && !(pLocal->GetFlags() & FL_ONGROUND)) && bKeysPressed)
{
pCmd->forwardmove = (1550.f * strafespeed) / pLocal->GetVelocity().Length2D();
pCmd->sidemove = (pCmd->command_number % 2) == 0 ? -450.f : 450.f;
if (pCmd->forwardmove > 450.f)
pCmd->forwardmove = 450.f;
}
}
AYYWARE:
Code:
void CMiscHacks::RageStrafe(CUserCmd *pCmd)
{
IClientEntity* pLocal = (IClientEntity*)Interfaces::EntList->GetClientEntity(Interfaces::Engine->GetLocalPlayer());
static bool bDirection = true;
static float move = 450.f;
float s_move = move * 0.5065f;
static float strafe = pCmd->viewangles.y;
float rt = pCmd->viewangles.y, rotation;
if ((pCmd->buttons & IN_JUMP) || !(pLocal->GetFlags() & FL_ONGROUND))
{
pCmd->forwardmove = move * 0.015f;
pCmd->sidemove += (float)(((pCmd->tick_count % 2) * 2) - 1) * s_move;
if (pCmd->mousedx)
pCmd->sidemove = (float)clamp(pCmd->mousedx, -1, 1) * s_move;
rotation = strafe - rt;
strafe = rt;
IClientEntity* pLocal = hackManager.pLocal();
static bool bDirection = true;
bool bKeysPressed = true;
if (GUI.GetKeyState(0x41) || GUI.GetKeyState(0x57) || GUI.GetKeyState(0x53) || GUI.GetKeyState(0x44))
bKeysPressed = false;
if (pCmd->buttons & IN_ATTACK)
bKeysPressed = false;
float flYawBhop = 0.f;
float sdmw = pCmd->sidemove;
float fdmw = pCmd->forwardmove;
static float move = 450.f;
float s_move = move * 0.5276f;
static float strafe = pCmd->viewangles.y;
if (Menu::Window.MiscTab.OtherAutoStrafe.GetIndex() == 2 && !GetAsyncKeyState(VK_RBUTTON))
{
if (pLocal->GetVelocity().Length() > 45.f)
{
float x = 30.f, y = pLocal->GetVelocity().Length(), z = 0.f, a = 0.f;
z = x / y;
z = fabsf(z);
a = x * z;
flYawBhop = a;
}
if ((GetAsyncKeyState(VK_SPACE) && !(pLocal->GetFlags() & FL_ONGROUND)) && bKeysPressed)
{
if (bDirection)
{
AutoStrafeView -= flYawBhop;
GameUtils::NormaliseViewAngle(AutoStrafeView);
pCmd->sidemove = -450;
bDirection = false;
}
else
{
AutoStrafeView += flYawBhop;
GameUtils::NormaliseViewAngle(AutoStrafeView);
pCmd->sidemove = 430;
bDirection = true;
}
if (pCmd->mousedx < 0)
{
pCmd->forwardmove = 22;
pCmd->sidemove = -450;
}
if (pCmd->mousedx > 0)
{
pCmd->forwardmove = +22;
pCmd->sidemove = 450;
}
}
}
}
}
-They aren't the same, but are intended for the same use (being ragestrafe) so we can copy the contents of the function from the suicide.cc cheat, and replace our rage strafe contents with it. (NOTE: just take between the braces "{ }" and don't copy the top part like
Code:
void CMiscHacks::RageStrafe(CUserCmd *pCmd)
so that we don't mess up function calls to it within other parts of the code.
-Hit compile and see if you get any errors, if you do, trouble shoot why you might be getting these errors. Are you trying to make a call to grab information from that cheats menu that you don't have on your menu? If something like that is the issue, you can try replacing it with a static value, or even figure out how to integrate it into your cheat's menu.
Figure out a couple places you can do this in, replace the rage strafe, the bhop, maybe the 'GetFovToPlayer' in the ragebot, etc. the more you do, the better the results.
Step Three
-Determine pieces you don't really need or could stand to remove, this will help a lot to change your signature and make it more UD.
-Let's use an example from the same source as before (Suicide.cc). They have a couple chat spam features that I really have no interest in using.
In "MiscHacks.cpp"
Code:
switch (Menu::Window.MiscTab.OtherChatSpam.GetIndex())
{
case 0:
// No Chat Spam
break;
case 1:
//Namestealer
ChatSpamName();
break;
case 1:
// Regular
ChatSpamRegular();
break;
}
-I'm going to delete all of this along with all the functions it references.
You can see some of these calls later on in "MiscHacks.cpp":
Code:
void CMiscHacks::ChatSpamxxxxx()
{
static clock_t start_t = clock();
double timeSoFar = (double)(clock() - start_t) / CLOCKS_PER_SEC;
if (timeSoFar < 0.001)
return;
static bool wasSpamming = true;
//static std::string nameBackup = "Ixxxxxx";
if (wasSpamming)
{
static bool useSpace = true;
if (useSpace)
{
change_name ("xxxxxx");
useSpace = !useSpace;
}
else
{
change_name("xxxxxx");
useSpace = !useSpace;
}
}
start_t = clock();
}
void CMiscHacks::ChatSpamDisperseName()
{
static clock_t start_t = clock();
double timeSoFar = (double)(clock() - start_t) / CLOCKS_PER_SEC;
if (timeSoFar < 0.001)
return;
static bool wasSpamming = true;
if (wasSpamming)
{
change_name("\xxxxxx\n");
}
start_t = clock();
}
void CMiscHacks::ChatSpamName()
{
static clock_t start_t = clock();
double timeSoFar = (double)(clock() - start_t) / CLOCKS_PER_SEC;
if (timeSoFar < 0.001)
return;
std::vector < std::string > Names;
for (int i = 0; i < Interfaces::EntList->GetHighestEntityIndex(); i++)
{
// Get the entity
IClientEntity *entity = Interfaces::EntList->GetClientEntity(i);
player_info_t pInfo;
// If it's a valid entity and isn't the player
if (entity && hackManager.pLocal()->GetTeamNum() == entity->GetTeamNum() && entity != hackManager.pLocal())
{
ClientClass* cClass = (ClientClass*)entity->GetClientClass();
// If entity is a player
if (cClass->m_ClassID == (int)CSGOClassID::CCSPlayer)
{
if (Interfaces::Engine->GetPlayerInfo(i, &pInfo))
{
if (!strstr(pInfo.name, "GOTV"))
Names.push_back(pInfo.name);
}
}
}
}
static bool wasSpamming = true;
//static std::string nameBackup = "xxxxxx";
int randomIndex = rand() % Names.size();
char buffer[128];
sprintf_s(buffer, "%s ", Names[randomIndex].c_str());
if (wasSpamming)
{
change_name(buffer);
}
else
{
change_name ("p$i 1337");
}
start_t = clock();
}
void CMiscHacks::ChatSpamRegular()
{
// Don't spam it too fast so you can still do stuff
static clock_t start_t = clock();
int spamtime = Menu::Window.MiscTab.OtherChatDelay.GetValue();
double timeSoFar = (double)(clock() - start_t) / CLOCKS_PER_SEC;
if (timeSoFar < spamtime)
return;
static bool holzed = true;
if (Menu::Window.MiscTab.OtherTeamChat.GetState())
{
SayInTeamChat("xxxxxx OWNS ME AND ALL");
}
else
{
SayInChat("xxxxxx OWNS ME AND ALL");
}
start_t = clock();
}
-Also in the menu it has the options for chat spam, which I just removed, so I don't want those in the menu. I can find those by looking around a little in the menu file. (CTRL+F is your friend.)
In "Menu.cpp":
Code:
OtherChatSpam.SetFileId("otr_spam");
OtherChatSpam.AddItem("Off");
OtherChatSpam.AddItem("Name");
OtherChatSpam.AddItem("Normal");
OtherGroup.PlaceLabledControl("Chat Spam", this, &OtherChatSpam);
OtherNameSpam.SetFileId("otr_spam");
OtherNameSpam.AddItem("Off");
OtherNameSpam.AddItem("SUICIDE.CC");
OtherNameSpam.AddItem("SUICIDE.CC Colored");
OtherNameSpam.AddItem("Blank");
OtherNameSpam.AddItem("PU Sucks");
OtherNameSpam.AddItem("xxxxx);
OtherNameSpam.AddItem("xxxxx");
OtherGroup.PlaceLabledControl("Name Spam", this, &OtherNameSpam);
-After removing all of this, my cheat still compiles fine and I can begin removing other parts. I would do this with as many pieces as you can stand to remove.
STEP FOUR
-I'd say adding junk code in is a good idea JUST to be safe. Don't want any unwanted VAC bans.
-Most people use something similar to:
Code:
void Junk()
{
float pJunkcode = 542894213;
if (pJunkcode = 34921523473490534);
pJunkcode = 230443243213748943;
pJunkcode = 4390751390453;
if (pJunkcode = 17321842125)
pJunkcode = 18345132543425;
pJunkcode = 1732423198465;
pJunkcode = 43578534;
pJunkcode = 134142142189242;
if (pJunkcode = 17111111132425)
pJunkcode = 183211111111425;
pJunkcode = 17321421111425;
pJunkcode = 11114324328911;
if (pJunkcode = 3492432432490534);
pJunkcode = 23048921893748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1713892425)
pJunkcode = 183421421425;
pJunkcode = 17324214925;
pJunkcode = 43578195346534;
if (pJunkcode = 34921523473490534);
pJunkcode = 230489213748943;
pJunkcode = 4390751390453;
pJunkcode = 111178978911;
if (pJunkcode = 3492514324320534);
pJunkcode = 23048921893748943;
pJunkcode = 4390751390453;
if (pJunkcode = 34973490534);
pJunkcode = 230489213748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1732189342425)
pJunkcode = 18421421543425;
pJunkcode = 1732423198465;
pJunkcode = 435789513416534;
if (pJunkcode = 1713892425)
pJunkcode = 1838912425;
pJunkcode = 17324118925;
pJunkcode = 43578195346534;
if (pJunkcode = 349214324320534);
pJunkcode = 439043753910453;
pJunkcode = 134142142189242;
if (pJunkcode = 1714214225)
pJunkcode = 18321421421;
pJunkcode = 17321111111425;
pJunkcode = 111178978911;
if (pJunkcode = 349254324320534);
pJunkcode = 23048921893748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1713892425)
pJunkcode = 1838912425;
pJunkcode = 17324118925;
pJunkcode = 43578195346534;
if (pJunkcode = 3492154324320534);
pJunkcode = 230489213748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1732189342425)
pJunkcode = 18345132543425;
pJunkcode = 17324421465;
pJunkcode = 230484211148943346;
pJunkcode = 43904213910453;
pJunkcode = 17323214211425;
pJunkcode = 111178978911;
if (pJunkcode = 34925142190534);
pJunkcode = 23048921893748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1713892425)
pJunkcode = 1838912425;
pJunkcode = 17324118925;
pJunkcode = 4357421421;
if (pJunkcode = 34921523473490534);
pJunkcode = 230489213748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1732189342425)
pJunkcode = 18345132543425;
pJunkcode = 1732423198465;
pJunkcode = 435789513416534;
if (pJunkcode = 34934624213474);
pJunkcode = 2304892371148943346;
pJunkcode = 4390434210453;
}
-But also remember to make calls to your junk code in your already existing code so like put:
-As an example you can do this to your "AutoJump" function:
Code:
void Junk()
{
float pJunkcode = 542894213;
if (pJunkcode = 34921523473490534);
pJunkcode = 230443243213748943;
pJunkcode = 4390751390453;
pJunkcode = 17324118925;
pJunkcode = 4357421421;
if (pJunkcode = 34921523473490534);
pJunkcode = 230489213748943;
pJunkcode = 4390751390453;
if (pJunkcode = 1732189342425)
pJunkcode = 18345132543425;
pJunkcode = 1732423198465;
pJunkcode = 435789513416534;
if (pJunkcode = 34934624213474);
pJunkcode = 2304892371148943346;
pJunkcode = 4390434210453;
}
void CMiscHacks::AutoJump(CUserCmd *pCmd)
{
Junk(); //<<< HERE IS OUR CALL TO THE JUNK CODE!
if (pCmd->buttons & IN_JUMP && GUI.GetKeyState(VK_SPACE))
{
int iFlags = hackManager.pLocal()->GetFlags();
if (!(iFlags & FL_ONGROUND))
pCmd->buttons &= ~IN_JUMP;
if (hackManager.pLocal()->GetVelocity().Length() <= 50)
{
pCmd->forwardmove = 450.f;
}
}
}
All you need to do is copy paste your junk code function right above another pre-existing function then in the function add in a call to the "Junk" function you just made above it. (Ex. Junk();)
Every time you copy paste in your junk function change up the numbers a good bit and name the function something else like "Junk2", "Junk3", and so on. (And call Junk2(); Junk3(); etc)
-The more functions you add your junk code to, the better. I'd say 4-6 ATLEAST per main .cpp file like Aimbot, Autowall, ESP, Menu, etc.
-Once you have an amount of junk functions you think is a good amount, build your cheat again and make sure it compiles, if not click on and check out the errors and see if you can troubleshoot what you did wrong.
STEP FIVE
-Now that you have your hopefully UD cheat compiled, you'll need an undetected injector. Look around on the forums and find a new one, or google around and look for a not popular one, maybe one that doesn't even say it's used for CSGO. The one I use is a "manual map" injector, which is arguably the most secure way to inject your cheat. So probably look for one of those if you can.
-Once you find an injector that looks like it shouldn't be detected, you should be good to go. Open up that injector and inject that DLL to csgo!
Want to actually learn, and improve your cheat?
Look around on forums for "sources" to different parts of cheats, and figure out how to integrate them into your cheat base. This is THE BEST way to make your cheat 100% undetected, and probably make it better than everyone else's regular pasted cheats.
Good luck on your cheat making! If you have any questions or other tips I may have missed, feel free to comment below! Sorry that this guide takes a LITTLE bit of knowledge on C++, but honestly why bother doing this at all if you can't take a little bit of time to figure some of this out! It'll make you better with cheats and programming stuff in the long run!