Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.75 KB | None | 0 0
  1. #include <thread>
  2. #include <iostream>
  3. #include <Windows.h>
  4. #include <TlHelp32.h>
  5.  
  6. DWORD GetSigOffset(HANDLE pHandle, DWORD64 mBase, DWORD mSize, BYTE *Sig, const char *Mask, int Len);
  7. bool RPM(HANDLE pHandle, DWORD64 src, void *dst, size_t Size);
  8. bool WPM(HANDLE pHandle, DWORD64 dst, void *src, size_t Size);
  9. DWORD64 AllocEx(HANDLE pHandle, size_t Size);
  10. bool FreeEx(HANDLE pHandle, DWORD64 src);
  11. bool Valid(DWORD64 ptr);
  12.  
  13. class ProcessData
  14. {
  15. public:
  16.     CHAR* pName;
  17.     CHAR* mName;
  18.     BYTE *mBase;
  19.     DWORD mSize;
  20.     DWORD pPid;
  21.     HANDLE pHandle;
  22. };
  23.  
  24. #define WEAPON_LIST_OFFSET              0x055AB800L//1.2.5.11
  25. #define WEAPON_INVALID                  0x00000001L//Default
  26. #define WEAPON_VORPAL                   0x00000002L//Vorpal
  27. #define WEAPON_PLAYABLE_DEFAULT         0x00000004L//Ranged, melee
  28. #define WEAPON_PLAYABLE_RANGED          0x00000008L//Ranged
  29. #define WEAPON_SPEED_FAST               0x00000010L//Ranged, melee
  30. #define WEAPON_SPEED_NORMAL             0x00000020L//Ranged, melee
  31. #define WEAPON_RELOAD_SPEED_FAST        0x00000040L//Ranged
  32. #define WEAPON_RELOAD_SPEED_NORMAL      0x00000080L//Ranged
  33. #define WEAPON_AUTOMATIC_ENABLED        0x00000100L//Ranged, melee
  34. #define WEAPON_AUTOMATIC_DISABLED       0x00000200L//Ranged, melee
  35. #define WEAPON_CHARGING_ENABLED         0x00000400L//Ranged
  36. #define WEAPON_CHARGING_DISABLED        0x00000800L//Ranged
  37. #define WEAPON_HOLD_TO_FIRE_ENABLED     0x00001000L//Ranged
  38. #define WEAPON_HOLD_TO_FIRE_DISABLED    0x00002000L//Ranged
  39. #define WEAPON_REACH_FAR                0x00004000L//Ranged, melee
  40. #define WEAPON_REACH_NORMAL             0x00008000L//Ranged, melee
  41. #define WEAPON_VATS_COST_ZERO           0x00010000L//Ranged, melee
  42. #define WEAPON_PROJECTILES_ONE          0x00020000L//Ranged, grenades
  43. #define WEAPON_PROJECTILES_TEN          0x00040000L//Ranged, greandes
  44. #define WEAPON_PROJECTILES_MAX          0x00080000L//Ranged, grenades
  45. #define WEAPON_CAPACITY_HIGH            0x00100000L//Ranged
  46. #define WEAPON_RECOIL_ZERO              0x00200000L//Ranged
  47. #define WEAPON_SPREAD_ZERO              0x00400000L//Ranged
  48. #define WEAPON_SWAY_ZERO                0x00800000L//Ranged
  49.  
  50. LONG GetWeaponFlags(DWORD Formid)
  51. {
  52.     switch (Formid)//Add whitelisted weapons here
  53.     {
  54.     case 0x0010CC9E://Scorchbeast Strafe Attack
  55.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  56.     case 0x00019951://Grafton Oil Bomb
  57.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  58.     case 0x0039CCB0://Grafton Oil Bomb Salvo
  59.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  60.     case 0x0012A1F2://Snallygaster Spit Attack
  61.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  62.     case 0x000FC3EC://Sonic Attack
  63.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  64.     case 0x0009F24D://Spit Attack
  65.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  66.     case 0x003B7F70://Wendigo Scream Attack
  67.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  68.     case 0x0003226A://MegaslothDirtThrow
  69.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  70.     case 0x0052193E://Megasloth Area Attack
  71.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  72.     case 0x004F4A84://Honey Beast Bee Swarm Spawn (Does not spawn bees, additional edits might be required)
  73.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  74.     case 0x00107BD6://Baseball Grenade
  75.         return WEAPON_PROJECTILES_MAX;
  76.     case 0x00113849://Fragmentation Grenade MIRV
  77.         return WEAPON_PROJECTILES_MAX;
  78.     case 0x0010A340://Nuke Mine
  79.         return WEAPON_PROJECTILES_MAX;
  80.     case 0x000EEBED://Fragmentation Grenade
  81.         return WEAPON_PROJECTILES_MAX;
  82.     case 0x004E5566://Mothman AoE Attack
  83.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  84.     case 0x00001BA1://Sonic Attack
  85.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_PROJECTILES_TEN;
  86.     case 0x0052EEF8://Scorchbeast Sonic Attack
  87.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_PROJECTILES_TEN;
  88.     case 0x0010D80A://Liberator Laser
  89.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  90.     case 0x00004117://Flatwoods Monster Laser
  91.         return WEAPON_PLAYABLE_RANGED | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO;
  92.     case 0x0014245D://Bomb
  93.         return WEAPON_PLAYABLE_DEFAULT | WEAPON_SPEED_FAST | WEAPON_REACH_FAR | WEAPON_VATS_COST_ZERO | WEAPON_AUTOMATIC_ENABLED;
  94.     case 0x000DF621://Fire Hydrant Bat
  95.         return WEAPON_PLAYABLE_DEFAULT | WEAPON_SPEED_FAST | WEAPON_REACH_FAR | WEAPON_VATS_COST_ZERO | WEAPON_AUTOMATIC_ENABLED;
  96.     case 0x000D1EB0://Gauss Rifle
  97.         WEAPON_HOLD_TO_FIRE_DISABLED | WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  98.     case 0x0010FAA7://Salvaged Assaultron Head
  99.         WEAPON_CHARGING_DISABLED | WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST;
  100.     case 0x0012DBB3://Pump Action Shotgun
  101.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  102.     case 0x001025AC://Flare Gun
  103.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  104.     case 0x00004822://10mm Pistol
  105.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  106.     case 0x00113854://Handmade Rifle
  107.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  108.     case 0x000BD56F://Fat Man
  109.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  110.     case 0x0046D2A1://The Fixer
  111.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  112.     case 0x000FE268://Railway Rifle
  113.         return WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED;
  114.     case 0x0005C250://Board
  115.         return WEAPON_SPEED_FAST | WEAPON_REACH_FAR | WEAPON_VATS_COST_ZERO | WEAPON_AUTOMATIC_ENABLED;
  116.     case 0x0030CB79://Vorpal (Do not remove or edit)
  117.         return WEAPON_VORPAL;
  118.     default:
  119.         return WEAPON_INVALID;
  120.     }
  121. }
  122.  
  123. bool EditWeapon(HANDLE pHandle, DWORD64 WeaponPtr, DWORD64 *EquipTypePtr, DWORD64 *KeywordPtr, bool Vorpal)
  124. {
  125.     class Weapon
  126.     {
  127.     public:
  128.         char PaddingA[0x20];
  129.         DWORD Formid;//0x20
  130.         char PaddingB[0x12C];
  131.         DWORD64 EquipTypePtrA;//0x150
  132.         char PaddingC[0x68];
  133.         DWORD64 KeywordArrayPtr;//0x1C0
  134.         DWORD KeywordArraySize;//0x1C8
  135.         char PaddingD[0xC4];
  136.         DWORD64 AmmoPtr;//0x290
  137.         DWORD64 EquipTypePtrB;//0x298
  138.         char PaddingE[0x10];
  139.         DWORD64 AimModelPtr;//0x2B0
  140.         char PaddingF[0x10];
  141.         DWORD64 WeaponMiscPtr;//0x2C8
  142.         char PaddingG[0x2C];
  143.         float ReloadSpeed;//0x2FC
  144.         char PaddingH[0x4];
  145.         float Speed;//0x304
  146.         float Reach;//0x308
  147.         char PaddingI[0x2C];
  148.         float ActionPointCost;//0x338
  149.         float FullPowerSeconds;//0x33C
  150.         float MinPowerPerShot;//0x340
  151.         char PaddingJ[0x1C];
  152.         BYTE FlagA;//0x360
  153.         BYTE FlagB;//0x361
  154.         BYTE FlagC;//0x362
  155.         BYTE FlagD;//0x363
  156.         char PaddingK[0x1C];
  157.         short Capacity;//0x380
  158.     };
  159.  
  160.     class Ammo
  161.     {
  162.     public:
  163.         char PaddingA[0x20];
  164.         DWORD Formid;//0x20
  165.         char PaddingB[0x1B0];
  166.         BYTE FlagA;//0x1D4
  167.         BYTE FlagB;//0x1D5
  168.         BYTE FlagC;//0x1D6
  169.         BYTE FlagD;//0x1D7
  170.     };
  171.  
  172.     class AimModel
  173.     {
  174.     public:
  175.         char PaddingA[0x20];
  176.         DWORD Formid;//0x20
  177.         char PaddingB[0x4];
  178.         float Cone_of_Fire_MinAngle;//0x28
  179.         float Cone_of_Fire_MaxAngle;//0x2C
  180.         float Cone_of_Fire_IncreasePerShot;//0x30
  181.         float Cone_of_Fire_DecreasePerShot;//0x34
  182.         int Cone_of_Fire_DecreaseDelayMS;//0x38
  183.         float Cone_of_Fire_SneakMult;//0x3C
  184.         float Recoil_DiminishSpringForce;//0x40
  185.         float Recoil_DiminishSightsMult;//0x44
  186.         float Recoil_MaxPerShot;//0x48
  187.         float Recoil_MinPerShot;//0x4C
  188.         float Recoil_HipMult;//0x50
  189.         int Runaway_RecoilShots;//0x54
  190.         float Recoil_Arc;//0x58
  191.         float Recoil_ArcRotate;//0x5C
  192.         float Cone_of_Fire_IronSightsMult;//0x60
  193.         float Stability_BaseStability;//0x64
  194.     };
  195.  
  196.     class WeaponMisc
  197.     {
  198.     public:
  199.         char PaddingA[0x34];
  200.         BYTE ProjectileCount;
  201.     };
  202.  
  203.     class Keyword
  204.     {
  205.     public:
  206.         char PaddingA[0x20];
  207.         DWORD Formid;//0x20
  208.     };
  209.  
  210.     Weapon WeaponData;
  211.     if (!RPM(pHandle, WeaponPtr, &WeaponData, sizeof(WeaponData))) return false;
  212.  
  213.     LONG Result = GetWeaponFlags(WeaponData.Formid);
  214.  
  215.     if (Result & WEAPON_INVALID)
  216.     {
  217.         return false;
  218.     }
  219.  
  220.     if (Vorpal)
  221.     {
  222.         if (Result & WEAPON_VORPAL)
  223.         {
  224.             *EquipTypePtr = WeaponData.EquipTypePtrA;
  225.             if (!Valid(WeaponData.KeywordArrayPtr) || WeaponData.KeywordArraySize == 0) return true;
  226.  
  227.             DWORD64 *KeywordArray = new DWORD64[WeaponData.KeywordArraySize];
  228.             if (!RPM(pHandle, WeaponData.KeywordArrayPtr, &*KeywordArray, WeaponData.KeywordArraySize * sizeof(DWORD64)))
  229.             {
  230.                 delete[]KeywordArray;
  231.                 return true;
  232.             }
  233.  
  234.             for (DWORD i = 0; i < WeaponData.KeywordArraySize; i++)
  235.             {
  236.                 Keyword KeywordData;
  237.                 if (!RPM(pHandle, KeywordArray[i], &KeywordData, sizeof(KeywordData))) continue;
  238.                 if (KeywordData.Formid != 0x0004C7EA) continue;
  239.                 *KeywordPtr = KeywordArray[i];
  240.                 break;
  241.             }
  242.  
  243.             delete[]KeywordArray;
  244.             return true;
  245.         }
  246.         else return false;
  247.     }
  248.  
  249.     if (Result & WEAPON_PLAYABLE_DEFAULT)
  250.     {
  251.         if (((WeaponData.FlagC >> 1) & 1) == 1) WeaponData.FlagC &= ~(1 << 1);
  252.         if (((WeaponData.FlagC >> 4) & 1) == 1) WeaponData.FlagC &= ~(1 << 4);
  253.     }
  254.  
  255.     if (Result & WEAPON_PLAYABLE_RANGED)
  256.     {
  257.         if (Valid(*EquipTypePtr))
  258.         {
  259.             WeaponData.EquipTypePtrA = *EquipTypePtr;
  260.             WeaponData.EquipTypePtrB = *EquipTypePtr;
  261.         }
  262.  
  263.         if (!Valid(WeaponData.KeywordArrayPtr) && WeaponData.KeywordArraySize == 0)
  264.         {
  265.             WeaponData.KeywordArrayPtr = AllocEx(pHandle, 0x1000);
  266.             if (Valid(WeaponData.KeywordArrayPtr)) WeaponData.KeywordArraySize = 1;
  267.         }
  268.  
  269.         if (Valid(*KeywordPtr) && Valid(WeaponData.KeywordArrayPtr) && WeaponData.KeywordArraySize > 0)
  270.         {
  271.             DWORD64 *KeywordArray = new DWORD64[WeaponData.KeywordArraySize];
  272.             for (DWORD i = 0; i < WeaponData.KeywordArraySize; i++) KeywordArray[i] = 0;
  273.             KeywordArray[0] = *KeywordPtr;
  274.  
  275.             if (WPM(pHandle, WeaponData.KeywordArrayPtr, &*KeywordArray, WeaponData.KeywordArraySize * sizeof(DWORD64)))
  276.             {
  277.                 WeaponData.KeywordArraySize = 1;
  278.             }
  279.  
  280.             delete[]KeywordArray;
  281.         }
  282.  
  283.         if (((WeaponData.FlagC >> 1) & 1) == 1) WeaponData.FlagC &= ~(1 << 1);
  284.         if (((WeaponData.FlagC >> 4) & 1) == 1) WeaponData.FlagC &= ~(1 << 4);
  285.  
  286.         if (Valid(WeaponData.AmmoPtr))
  287.         {
  288.             Ammo AmmoData;
  289.             if (RPM(pHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData)))
  290.             {
  291.                 if (((AmmoData.FlagA >> 1) & 1) == 1) AmmoData.FlagA &= ~(1 << 1);
  292.                 WPM(pHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData));
  293.             }
  294.         }
  295.     }
  296.  
  297.     if (Result & WEAPON_SPEED_FAST)
  298.     {
  299.         if (WeaponData.Speed != 100.0f) WeaponData.Speed = 100.0f;
  300.     }
  301.  
  302.     if (Result & WEAPON_SPEED_NORMAL)
  303.     {
  304.         if (WeaponData.Speed != 1.0f) WeaponData.Speed = 1.0f;
  305.     }
  306.  
  307.     if (Result & WEAPON_RELOAD_SPEED_FAST)
  308.     {
  309.         if (WeaponData.ReloadSpeed != 100.0f) WeaponData.ReloadSpeed = 100.0f;
  310.     }
  311.  
  312.     if (Result & WEAPON_RELOAD_SPEED_NORMAL)
  313.     {
  314.         if (WeaponData.ReloadSpeed != 1.0f) WeaponData.ReloadSpeed = 1.0f;
  315.     }
  316.  
  317.     if (Result & WEAPON_AUTOMATIC_ENABLED)
  318.     {
  319.         if (((WeaponData.FlagB >> 7) & 1) == 0) WeaponData.FlagB |= 1 << 7;
  320.     }
  321.  
  322.     if (Result & WEAPON_AUTOMATIC_DISABLED)
  323.     {
  324.         if (((WeaponData.FlagC >> 7) & 1) == 1) WeaponData.FlagC &= ~(1 << 7);
  325.     }
  326.  
  327.     if (Result & WEAPON_CHARGING_ENABLED)
  328.     {
  329.         if (((WeaponData.FlagA >> 3) & 1) == 0) WeaponData.FlagA |= 1 << 3;
  330.     }
  331.  
  332.     if (Result & WEAPON_CHARGING_DISABLED)
  333.     {
  334.         if (((WeaponData.FlagA >> 3) & 1) == 1) WeaponData.FlagA &= ~(1 << 3);
  335.     }
  336.  
  337.     if (Result & WEAPON_HOLD_TO_FIRE_ENABLED)
  338.     {
  339.         if (((WeaponData.FlagB >> 3) & 1) == 0) WeaponData.FlagB |= 1 << 3;
  340.     }
  341.  
  342.     if (Result & WEAPON_HOLD_TO_FIRE_DISABLED)
  343.     {
  344.         if (((WeaponData.FlagB >> 3) & 1) == 1) WeaponData.FlagB &= ~(1 << 3);
  345.     }
  346.  
  347.     if (Result & WEAPON_REACH_FAR)
  348.     {
  349.         if (WeaponData.Reach != 999.0f) WeaponData.Reach = 999.0f;
  350.     }
  351.  
  352.     if (Result & WEAPON_REACH_NORMAL)
  353.     {
  354.         if (WeaponData.Reach != 1.0f) WeaponData.Reach = 1.0f;
  355.     }
  356.  
  357.     if (Result & WEAPON_VATS_COST_ZERO)
  358.     {
  359.         if (WeaponData.ActionPointCost != 0.0f) WeaponData.ActionPointCost = 0.0f;
  360.     }
  361.  
  362.     if (Result & WEAPON_PROJECTILES_ONE)
  363.     {
  364.         if (Valid(WeaponData.WeaponMiscPtr))
  365.         {
  366.             WeaponMisc WeaponMiscData;
  367.             if (RPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData)))
  368.             {
  369.                 if (WeaponMiscData.ProjectileCount != 1) WeaponMiscData.ProjectileCount = 1;
  370.                 WPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData));
  371.             }
  372.         }
  373.     }
  374.  
  375.     if (Result & WEAPON_PROJECTILES_TEN)
  376.     {
  377.         if (Valid(WeaponData.WeaponMiscPtr))
  378.         {
  379.             WeaponMisc WeaponMiscData;
  380.             if (RPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData)))
  381.             {
  382.                 if (WeaponMiscData.ProjectileCount != 10) WeaponMiscData.ProjectileCount = 10;
  383.                 WPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData));
  384.             }
  385.         }
  386.     }
  387.  
  388.     if (Result & WEAPON_PROJECTILES_MAX)
  389.     {
  390.         if (Valid(WeaponData.WeaponMiscPtr))
  391.         {
  392.             WeaponMisc WeaponMiscData;
  393.             if (RPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData)))
  394.             {
  395.                 if (WeaponMiscData.ProjectileCount != MAXBYTE) WeaponMiscData.ProjectileCount = MAXBYTE;
  396.                 WPM(pHandle, WeaponData.WeaponMiscPtr, &WeaponMiscData, sizeof(WeaponMiscData));
  397.             }
  398.         }
  399.     }
  400.  
  401.     if (Result & WEAPON_CAPACITY_HIGH)
  402.     {
  403.         if (WeaponData.Capacity != 999) WeaponData.Capacity = 999;
  404.     }
  405.  
  406.     if (Result & WEAPON_RECOIL_ZERO)
  407.     {
  408.         if (Valid(WeaponData.AimModelPtr))
  409.         {
  410.             AimModel AimModelData;
  411.             if (RPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  412.             {
  413.                 if (AimModelData.Recoil_DiminishSpringForce != 0.0f) AimModelData.Recoil_DiminishSpringForce = 0.0f;
  414.                 if (AimModelData.Recoil_DiminishSightsMult != 0.0f) AimModelData.Recoil_DiminishSightsMult = 0.0f;
  415.                 if (AimModelData.Recoil_MaxPerShot != 0.0f) AimModelData.Recoil_MaxPerShot = 0.0f;
  416.                 if (AimModelData.Recoil_MinPerShot != 0.0f) AimModelData.Recoil_MinPerShot = 0.0f;
  417.                 if (AimModelData.Recoil_HipMult != 0.0f) AimModelData.Recoil_HipMult = 0.0f;
  418.                 if (AimModelData.Runaway_RecoilShots != 0) AimModelData.Runaway_RecoilShots = 0;
  419.                 if (AimModelData.Recoil_Arc != 0.0f) AimModelData.Recoil_Arc = 0.0f;
  420.                 if (AimModelData.Recoil_ArcRotate != 0.0f) AimModelData.Recoil_ArcRotate = 0.0f;
  421.                 WPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  422.             }
  423.         }
  424.     }
  425.  
  426.     if (Result & WEAPON_SPREAD_ZERO)
  427.     {
  428.         if (Valid(WeaponData.AimModelPtr))
  429.         {
  430.             AimModel AimModelData;
  431.             if (RPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  432.             {
  433.                 if (AimModelData.Cone_of_Fire_MinAngle != 0.0f) AimModelData.Cone_of_Fire_MinAngle = 0.0f;
  434.                 if (AimModelData.Cone_of_Fire_MaxAngle != 0.0f) AimModelData.Cone_of_Fire_MaxAngle = 0.0f;
  435.                 if (AimModelData.Cone_of_Fire_IncreasePerShot != 0.0f) AimModelData.Cone_of_Fire_IncreasePerShot = 0.0f;
  436.                 if (AimModelData.Cone_of_Fire_DecreasePerShot != 0.0f) AimModelData.Cone_of_Fire_DecreasePerShot = 0.0f;
  437.                 if (AimModelData.Cone_of_Fire_DecreaseDelayMS != 0) AimModelData.Cone_of_Fire_DecreaseDelayMS = 0;
  438.                 if (AimModelData.Cone_of_Fire_SneakMult != 0.0f) AimModelData.Cone_of_Fire_SneakMult = 0.0f;
  439.                 if (AimModelData.Cone_of_Fire_IronSightsMult != 0.0f) AimModelData.Cone_of_Fire_IronSightsMult = 0.0f;
  440.                 WPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  441.             }
  442.         }
  443.     }
  444.  
  445.     if (Result & WEAPON_SWAY_ZERO)
  446.     {
  447.         if (Valid(WeaponData.AimModelPtr))
  448.         {
  449.             AimModel AimModelData;
  450.             if (RPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  451.             {
  452.                 if (AimModelData.Stability_BaseStability != 100.0f) AimModelData.Stability_BaseStability = 100.0f;
  453.                 WPM(pHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  454.             }
  455.         }
  456.     }
  457.  
  458.     return WPM(pHandle, WeaponPtr, &WeaponData, sizeof(WeaponData));
  459. }
  460.  
  461. bool IterateWeapons(HANDLE pHandle, DWORD64 mBase)
  462. {
  463.     class WeaponList
  464.     {
  465.     public:
  466.         DWORD64 List;
  467.         DWORD Size;
  468.     };
  469.  
  470.     WeaponList WeaponListData;
  471.     if (!RPM(pHandle, mBase + WEAPON_LIST_OFFSET, &WeaponListData, sizeof(WeaponListData))) return false;
  472.     if (!Valid(WeaponListData.List)) return false;
  473.     if (!WeaponListData.Size) return false;
  474.  
  475.     DWORD64 *WeaponPtr = new DWORD64[WeaponListData.Size];
  476.     if (!RPM(pHandle, WeaponListData.List, &*WeaponPtr, WeaponListData.Size * sizeof(DWORD64)))
  477.     {
  478.         delete[]WeaponPtr;
  479.         return false;
  480.     }
  481.  
  482.     DWORD64 EquipTypePtr = 0;
  483.     DWORD64 KeywordPtr = 0;
  484.  
  485.     for (DWORD i = 0; i < WeaponListData.Size; i++)
  486.     {
  487.         if (!Valid(WeaponPtr[i])) continue;
  488.         if (EditWeapon(pHandle, WeaponPtr[i], &EquipTypePtr, &KeywordPtr, true)) break;
  489.     }
  490.  
  491.     for (DWORD i = 0; i < WeaponListData.Size; i++)
  492.     {
  493.         if (!Valid(WeaponPtr[i])) continue;
  494.         EditWeapon(pHandle, WeaponPtr[i], &EquipTypePtr, &KeywordPtr, false);
  495.     }
  496.  
  497.     delete[]WeaponPtr;
  498.     return true;
  499. }
  500.  
  501. void ProcessMain(ProcessData pData)
  502. {
  503.     IterateWeapons(pData.pHandle, DWORD64(pData.mBase));
  504. }
  505.  
  506. DWORD GetSigOffset(HANDLE pHandle, DWORD64 mBase, DWORD mSize, BYTE *Sig, const char *Mask, int Len)
  507. {
  508.     DWORD SigOffset = 0;
  509.     BYTE *ModuleArray = new BYTE[mSize];
  510.  
  511.     if (ReadProcessMemory(pHandle, (void*)(mBase), &*ModuleArray, mSize, NULL))
  512.     {
  513.         for (DWORD i = 0; i < mSize; i++)
  514.         {
  515.             if (i + Len >= mSize) break;
  516.             for (int c = 0; c < Len; c++)
  517.             {
  518.                 if (ModuleArray[i + c] != Sig[c] && Mask[c] != '?') break;
  519.                 if (c == Len - 1)
  520.                 {
  521.                     delete[]ModuleArray;
  522.                     return i;
  523.                 }
  524.             }
  525.         }
  526.     }
  527.  
  528.     delete[]ModuleArray;
  529.     return SigOffset;
  530. }
  531.  
  532. bool RPM(HANDLE pHandle, DWORD64 src, void *dst, size_t Size)
  533. {
  534.     return ReadProcessMemory(pHandle, (void*)(src), dst, Size, NULL);
  535. }
  536.  
  537. bool WPM(HANDLE pHandle, DWORD64 dst, void *src, size_t Size)
  538. {
  539.     return WriteProcessMemory(pHandle, (void*)(dst), src, Size, NULL);
  540. }
  541.  
  542. DWORD64 AllocEx(HANDLE pHandle, size_t Size)
  543. {
  544.     return DWORD64(VirtualAllocEx(pHandle, NULL, Size, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE));
  545. }
  546.  
  547. bool FreeEx(HANDLE pHandle, DWORD64 src)
  548. {
  549.     return VirtualFreeEx(pHandle, LPVOID(src), 0, MEM_RELEASE);
  550. }
  551.  
  552. bool Valid(DWORD64 ptr)
  553. {
  554.     if (ptr < 0x7FFF || ptr > 0x7FFFFFFFFFFF) return false;
  555.     else return true;
  556. }
  557.  
  558. bool GetModuleData(ProcessData *pData)
  559. {
  560.     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pData->pPid);
  561.     if (hSnapshot == INVALID_HANDLE_VALUE) return false;
  562.  
  563.     MODULEENTRY32 lpme;
  564.     lpme.dwSize = sizeof(lpme);
  565.  
  566.     while (Module32Next(hSnapshot, &lpme))
  567.     {
  568.         if (!strcmp(lpme.szModule, pData->mName))
  569.         {
  570.             pData->mBase = lpme.modBaseAddr;
  571.             pData->mSize = lpme.modBaseSize;
  572.             CloseHandle(hSnapshot);
  573.             return true;
  574.         }
  575.     }
  576.  
  577.     CloseHandle(hSnapshot);
  578.     return false;
  579. }
  580.  
  581. int GetProcessData(ProcessData *BaseData, ProcessData *pData = nullptr, int pCount = 0)
  582. {
  583.     HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  584.     if (hSnapshot == INVALID_HANDLE_VALUE) return 0;
  585.  
  586.     PROCESSENTRY32 lppe;
  587.     lppe.dwSize = sizeof(lppe);
  588.  
  589.     int ProcessCount = 0;
  590.     while (Process32Next(hSnapshot, &lppe))
  591.     {
  592.         if (!strcmp(lppe.szExeFile, BaseData->pName))
  593.         {
  594.             if (pData != nullptr && pCount > 0 && ProcessCount < pCount)
  595.             {
  596.                 pData[ProcessCount].pPid = lppe.th32ProcessID;
  597.             }
  598.  
  599.             ProcessCount++;
  600.         }
  601.     }
  602.  
  603.     CloseHandle(hSnapshot);
  604.     return ProcessCount;
  605. }
  606.  
  607. int main()
  608. {
  609.     ProcessData BaseData;
  610.     BaseData.pName = (CHAR*)("Fallout76.exe");//Process
  611.     BaseData.mName = (CHAR*)("Fallout76.exe");//Module
  612.  
  613.     int pCount = GetProcessData(&BaseData);
  614.     if (pCount == 0) return 1;
  615.  
  616.     ProcessData *pData = new ProcessData[pCount];
  617.     for (int i = 0; i < pCount; i++) memcpy(&pData[i], &BaseData, sizeof(ProcessData));
  618.  
  619.     if (GetProcessData(&BaseData, pData, pCount) != pCount)
  620.     {
  621.         delete[]pData;
  622.         return 2;
  623.     }
  624.  
  625.     int Index = 0;
  626.     if (pCount > 1)
  627.     {
  628.         for (int i = 0; i < pCount; i++)
  629.         {
  630.             printf("%08lX - %s - Index: %d\n", pData[i].pPid, pData[i].pName, i + 1);
  631.         }
  632.  
  633.         printf("Enter target process index: ");
  634.         std::cin >> Index;
  635.         printf("--------------------------------\n");
  636.  
  637.         if (Index == 0 || Index > pCount)
  638.         {
  639.             delete[]pData;
  640.             return 3;
  641.         }
  642.         else
  643.         {
  644.             Index--;
  645.         }
  646.     }
  647.  
  648.     if (!GetModuleData(&pData[Index]))
  649.     {
  650.         delete[]pData;
  651.         return 4;
  652.     }
  653.  
  654.     pData[Index].pHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pData[Index].pPid);
  655.     if (pData[Index].pHandle == NULL)
  656.     {
  657.         delete[]pData;
  658.         return 5;
  659.     }
  660.  
  661.     ProcessMain(pData[Index]);
  662.  
  663.     CloseHandle(pData[Index].pHandle);
  664.     delete[]pData;
  665.     return 0;
  666. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement