Advertisement
Guest User

Weaponedit

a guest
Nov 14th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <TlHelp32.h>
  4.  
  5. bool InfiniteAmmo = true;
  6. bool EquipBrokenItems = true;
  7. bool RemoveEquipmentLevel = true;
  8.  
  9. BYTE InfiniteAmmoSig[] = { 0x30, 0x54, 0x24, 0x52, 0x30, 0x54, 0x24, 0x53 };
  10. BYTE EquipBrokenItemsSig[] = { 0x0F, 0x57, 0xC0, 0x0F, 0x2F, 0x40, 0x10, 0x40, 0x0F, 0x92, 0xC7 };
  11. BYTE RemoveEquipmentLevelSig[] = { 0x48, 0x8B, 0xB8, 0x48, 0x04, 0x00, 0x00, 0x48, 0x8B, 0x86, 0xC8, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x58, 0x08, 0x48, 0x8B, 0xCB };
  12.  
  13. #define WEAPON_LIST_OFFSET 0x055FAB40L//1.2.4.10
  14. #define WEAPON_INVALID 0x00000001L//Default
  15. #define WEAPON_PLAYABLE_ENABLED 0x00000002L//Ranged, melee
  16. #define WEAPON_PLAYABLE_DISABLED 0x00000004L//Ranged, melee
  17. #define WEAPON_PLAYABLE_AMMO_ENABLED 0x00000008L//Ranged
  18. #define WEAPON_PLAYABLE_AMMO_DISABLED 0x00000010L//Ranged
  19. #define WEAPON_SPEED_FAST 0x00000020L//Ranged, melee
  20. #define WEAPON_SPEED_NORMAL 0x00000040L//Ranged, melee
  21. #define WEAPON_RELOAD_SPEED_FAST 0x00000080L//Ranged
  22. #define WEAPON_RELOAD_SPEED_NORMAL 0x00000100L//Ranged
  23. #define WEAPON_AUTOMATIC_ENABLED 0x00000200L//Ranged, melee
  24. #define WEAPON_AUTOMATIC_DISABLED 0x00000400L//Ranged, melee
  25. #define WEAPON_CHARGING_ENABLED 0x00000800L//Ranged
  26. #define WEAPON_CHARGING_DISABLED 0x00001000L//Ranged
  27. #define WEAPON_HOLD_TO_FIRE_ENABLED 0x00002000L//Ranged
  28. #define WEAPON_HOLD_TO_FIRE_DISABLED 0x00004000L//Ranged
  29. #define WEAPON_DAMAGE_HIGH 0x00008000L//Ranged
  30. #define WEAPON_DAMAGE_NORMAL 0x00010000L//Ranged
  31. #define WEAPON_REACH_FAR 0x00020000L//Ranged, melee
  32. #define WEAPON_REACH_NORMAL 0x00040000L//Ranged, melee
  33. #define WEAPON_VATS_COST_ZERO 0x00080000L//Ranged, melee
  34. #define WEAPON_CAPACITY_HIGH 0x00100000L//Ranged
  35. #define WEAPON_RECOIL_ZERO 0x00200000L//Ranged
  36. #define WEAPON_SPREAD_ZERO 0x00400000L//Ranged
  37. #define WEAPON_SWAY_ZERO 0x00800000L//Ranged
  38.  
  39. CHAR sProcess[] = "Fallout76.exe";
  40. bool Valid(DWORD64 ptr);
  41. bool RPM(HANDLE sHandle, DWORD64 src, void *dst, size_t Size);
  42. bool WPM(HANDLE sHandle, DWORD64 dst, void *src, size_t Size);
  43. DWORD GetSigOffset(HANDLE sHandle, DWORD64 mBase, DWORD mSize, void *Sig, size_t Size);
  44.  
  45. LONG GetWeaponFlags(DWORD Formid)
  46. {
  47. switch (Formid)//Add whitelisted weapons here
  48. {
  49. case 0x00113854://Handmade Rifle
  50. return LONG(WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED | WEAPON_DAMAGE_HIGH);
  51. case 0x0046D2A1://The Fixer
  52. return LONG(WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED | WEAPON_DAMAGE_HIGH);
  53. case 0x000FE268://Railway Rifle
  54. return LONG(WEAPON_SWAY_ZERO | WEAPON_RECOIL_ZERO | WEAPON_SPREAD_ZERO | WEAPON_RELOAD_SPEED_FAST | WEAPON_VATS_COST_ZERO | WEAPON_SPEED_FAST | WEAPON_AUTOMATIC_ENABLED | WEAPON_DAMAGE_HIGH);
  55. case 0x0005C250://Board
  56. return LONG(WEAPON_PLAYABLE_ENABLED | WEAPON_SPEED_FAST | WEAPON_REACH_FAR | WEAPON_VATS_COST_ZERO | WEAPON_AUTOMATIC_ENABLED);
  57. case 0x000DF621://Fire Hydrant Bat
  58. return LONG(WEAPON_PLAYABLE_ENABLED | WEAPON_SPEED_FAST | WEAPON_REACH_FAR | WEAPON_VATS_COST_ZERO | WEAPON_AUTOMATIC_ENABLED);
  59. default:
  60. return LONG(WEAPON_INVALID);
  61. }
  62. }
  63.  
  64. bool EditWeapon(DWORD64 WeaponPtr, HANDLE sHandle)
  65. {
  66. class Weapon
  67. {
  68. public:
  69. char PaddingA[0x20];
  70. DWORD Formid;//0x20
  71. char PaddingB[0x19C];
  72. DWORD64 KeywordArrayPtr;//0x1C0
  73. DWORD KeywordArraySize;//0x1C8
  74. char PaddingC[0xC4];
  75. DWORD64 AmmoPtr;//0x290
  76. DWORD64 EquipTypePtr;//0x298
  77. char PaddingD[0x10];
  78. DWORD64 AimModelPtr;//0x2B0
  79. char PaddingE[0x44];
  80. float ReloadSpeed;//0x2FC
  81. char PaddingF[0x4];
  82. float Speed;//0x304
  83. float Reach;//0x308
  84. char PaddingG[0x2C];
  85. float ActionPointCost;//0x338
  86. float FullPowerSeconds;//0x33C
  87. float MinPowerPerShot;//0x340
  88. char PaddingH[0x1C];
  89. BYTE FlagA;//0x360
  90. BYTE FlagB;//0x361
  91. BYTE FlagC;//0x362
  92. BYTE FlagD;//0x363
  93. char PaddingI[0x1C];
  94. short Capacity;//0x380
  95. };
  96.  
  97. class Ammo
  98. {
  99. public:
  100. char PaddingA[0x20];
  101. DWORD Formid;//0x20
  102. char PaddingB[0x1B0];
  103. BYTE FlagA;//0x1D4
  104. BYTE FlagB;//0x1D5
  105. BYTE FlagC;//0x1D6
  106. BYTE FlagD;//0x1D7
  107. };
  108.  
  109. class AimModel
  110. {
  111. public:
  112. char PaddingA[0x20];
  113. DWORD Formid;//0x20
  114. char PaddingB[0x4];
  115. float Cone_of_Fire_MinAngle;//0x28
  116. float Cone_of_Fire_MaxAngle;//0x2C
  117. float Cone_of_Fire_IncreasePerShot;//0x30
  118. float Cone_of_Fire_DecreasePerShot;//0x34
  119. int Cone_of_Fire_DecreaseDelayMS;//0x38
  120. float Cone_of_Fire_SneakMult;//0x3C
  121. float Recoil_DiminishSpringForce;//0x40
  122. float Recoil_DiminishSightsMult;//0x44
  123. float Recoil_MaxPerShot;//0x48
  124. float Recoil_MinPerShot;//0x4C
  125. float Recoil_HipMult;//0x50
  126. int Runaway_RecoilShots;//0x54
  127. float Recoil_Arc;//0x58
  128. float Recoil_ArcRotate;//0x5C
  129. float Cone_of_Fire_IronSightsMult;//0x60
  130. float Stability_BaseStability;//0x64
  131. };
  132.  
  133. Weapon WeaponData;
  134. if (!RPM(sHandle, WeaponPtr, &WeaponData, sizeof(WeaponData))) return false;
  135.  
  136. LONG Result = GetWeaponFlags(WeaponData.Formid);
  137.  
  138. if (Result & WEAPON_INVALID)
  139. {
  140. return false;
  141. }
  142.  
  143. if (Result & WEAPON_PLAYABLE_ENABLED)
  144. {
  145. if (((WeaponData.FlagC >> 1) & 1) == 1) WeaponData.FlagC &= ~(1 << 1);
  146. if (((WeaponData.FlagC >> 4) & 1) == 1) WeaponData.FlagC &= ~(1 << 4);
  147. }
  148.  
  149. if (Result & WEAPON_PLAYABLE_DISABLED)
  150. {
  151. if (((WeaponData.FlagC >> 1) & 1) == 0) WeaponData.FlagC |= 1 << 1;
  152. if (((WeaponData.FlagC >> 4) & 1) == 0) WeaponData.FlagC |= 1 << 4;
  153. }
  154.  
  155. if (Result & WEAPON_PLAYABLE_AMMO_ENABLED)
  156. {
  157. if (Valid(WeaponData.AmmoPtr))
  158. {
  159. Ammo AmmoData;
  160. if (RPM(sHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData)))
  161. {
  162. if (((AmmoData.FlagA >> 1) & 1) == 1) AmmoData.FlagA &= ~(1 << 1);
  163. WPM(sHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData));
  164. }
  165. }
  166. }
  167.  
  168. if (Result & WEAPON_PLAYABLE_AMMO_DISABLED)
  169. {
  170. if (Valid(WeaponData.AmmoPtr))
  171. {
  172. Ammo AmmoData;
  173. if (RPM(sHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData)))
  174. {
  175. if (((AmmoData.FlagA >> 1) & 1) == 0) AmmoData.FlagA |= 1 << 1;
  176. WPM(sHandle, WeaponData.AmmoPtr, &AmmoData, sizeof(AmmoData));
  177. }
  178. }
  179. }
  180.  
  181. if (Result & WEAPON_SPEED_FAST)
  182. {
  183. if (WeaponData.Speed != 999.0f) WeaponData.Speed = 999.0f;
  184. }
  185.  
  186. if (Result & WEAPON_SPEED_NORMAL)
  187. {
  188. if (WeaponData.Speed != 1.0f) WeaponData.Speed = 1.0f;
  189. }
  190.  
  191. if (Result & WEAPON_RELOAD_SPEED_FAST)
  192. {
  193. if (WeaponData.ReloadSpeed != 999.0f) WeaponData.ReloadSpeed = 999.0f;
  194. }
  195.  
  196. if (Result & WEAPON_RELOAD_SPEED_NORMAL)
  197. {
  198. if (WeaponData.ReloadSpeed != 1.0f) WeaponData.ReloadSpeed = 1.0f;
  199. }
  200.  
  201. if (Result & WEAPON_AUTOMATIC_ENABLED)
  202. {
  203. if (((WeaponData.FlagB >> 7) & 1) == 0) WeaponData.FlagB |= 1 << 7;
  204. }
  205.  
  206. if (Result & WEAPON_AUTOMATIC_DISABLED)
  207. {
  208. if (((WeaponData.FlagC >> 7) & 1) == 1) WeaponData.FlagC &= ~(1 << 7);
  209. }
  210.  
  211. if (Result & WEAPON_CHARGING_ENABLED)
  212. {
  213. if (((WeaponData.FlagA >> 3) & 1) == 0) WeaponData.FlagA |= 1 << 3;
  214. }
  215.  
  216. if (Result & WEAPON_CHARGING_DISABLED)
  217. {
  218. if (((WeaponData.FlagA >> 3) & 1) == 1) WeaponData.FlagA &= ~(1 << 3);
  219. }
  220.  
  221. if (Result & WEAPON_HOLD_TO_FIRE_ENABLED)
  222. {
  223. if (((WeaponData.FlagB >> 3) & 1) == 0) WeaponData.FlagB |= 1 << 3;
  224. }
  225.  
  226. if (Result & WEAPON_HOLD_TO_FIRE_DISABLED)
  227. {
  228. if (((WeaponData.FlagB >> 3) & 1) == 1) WeaponData.FlagB &= ~(1 << 3);
  229. }
  230.  
  231. if (Result & WEAPON_DAMAGE_HIGH)
  232. {
  233. if (WeaponData.FullPowerSeconds != 1.0f) WeaponData.FullPowerSeconds = 1.0f;
  234. if (WeaponData.MinPowerPerShot != 9001.0f) WeaponData.MinPowerPerShot = 9001.0f;
  235. }
  236.  
  237. if (Result & WEAPON_DAMAGE_NORMAL)
  238. {
  239. if (WeaponData.FullPowerSeconds != 0.0f) WeaponData.FullPowerSeconds = 0.0f;
  240. if (WeaponData.MinPowerPerShot != 0.0f) WeaponData.MinPowerPerShot = 0.0f;
  241. }
  242.  
  243. if (Result & WEAPON_REACH_FAR)
  244. {
  245. if (WeaponData.Reach != 999.0f) WeaponData.Reach = 999.0f;
  246. }
  247.  
  248. if (Result & WEAPON_REACH_NORMAL)
  249. {
  250. if (WeaponData.Reach != 1.0f) WeaponData.Reach = 1.0f;
  251. }
  252.  
  253. if (Result & WEAPON_VATS_COST_ZERO)
  254. {
  255. if (WeaponData.ActionPointCost != 0.0f) WeaponData.ActionPointCost = 0.0f;
  256. }
  257.  
  258. if (Result & WEAPON_CAPACITY_HIGH)
  259. {
  260. if (WeaponData.Capacity != 999) WeaponData.Capacity = 999;
  261. }
  262.  
  263. if (Result & WEAPON_RECOIL_ZERO)
  264. {
  265. if (Valid(WeaponData.AimModelPtr))
  266. {
  267. AimModel AimModelData;
  268. if (RPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  269. {
  270. if (AimModelData.Recoil_DiminishSpringForce != 0.0f) AimModelData.Recoil_DiminishSpringForce = 0.0f;
  271. if (AimModelData.Recoil_DiminishSightsMult != 0.0f) AimModelData.Recoil_DiminishSightsMult = 0.0f;
  272. if (AimModelData.Recoil_MaxPerShot != 0.0f) AimModelData.Recoil_MaxPerShot = 0.0f;
  273. if (AimModelData.Recoil_MinPerShot != 0.0f) AimModelData.Recoil_MinPerShot = 0.0f;
  274. if (AimModelData.Recoil_HipMult != 0.0f) AimModelData.Recoil_HipMult = 0.0f;
  275. if (AimModelData.Runaway_RecoilShots != 0) AimModelData.Runaway_RecoilShots = 0;
  276. if (AimModelData.Recoil_Arc != 0.0f) AimModelData.Recoil_Arc = 0.0f;
  277. if (AimModelData.Recoil_ArcRotate != 0.0f) AimModelData.Recoil_ArcRotate = 0.0f;
  278. WPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  279. }
  280. }
  281. }
  282.  
  283. if (Result & WEAPON_SPREAD_ZERO)
  284. {
  285. if (Valid(WeaponData.AimModelPtr))
  286. {
  287. AimModel AimModelData;
  288. if (RPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  289. {
  290. if (AimModelData.Cone_of_Fire_MinAngle != 0.0f) AimModelData.Cone_of_Fire_MinAngle = 0.0f;
  291. if (AimModelData.Cone_of_Fire_MaxAngle != 0.0f) AimModelData.Cone_of_Fire_MaxAngle = 0.0f;
  292. if (AimModelData.Cone_of_Fire_IncreasePerShot != 0.0f) AimModelData.Cone_of_Fire_IncreasePerShot = 0.0f;
  293. if (AimModelData.Cone_of_Fire_DecreasePerShot != 0.0f) AimModelData.Cone_of_Fire_DecreasePerShot = 0.0f;
  294. if (AimModelData.Cone_of_Fire_DecreaseDelayMS != 0) AimModelData.Cone_of_Fire_DecreaseDelayMS = 0;
  295. if (AimModelData.Cone_of_Fire_SneakMult != 0.0f) AimModelData.Cone_of_Fire_SneakMult = 0.0f;
  296. if (AimModelData.Cone_of_Fire_IronSightsMult != 0.0f) AimModelData.Cone_of_Fire_IronSightsMult = 0.0f;
  297. WPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  298. }
  299. }
  300. }
  301.  
  302. if (Result & WEAPON_SWAY_ZERO)
  303. {
  304. if (Valid(WeaponData.AimModelPtr))
  305. {
  306. AimModel AimModelData;
  307. if (RPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData)))
  308. {
  309. if (AimModelData.Stability_BaseStability != 100.0f) AimModelData.Stability_BaseStability = 100.0f;
  310. WPM(sHandle, WeaponData.AimModelPtr, &AimModelData, sizeof(AimModelData));
  311. }
  312. }
  313. }
  314.  
  315. return WPM(sHandle, WeaponPtr, &WeaponData, sizeof(WeaponData));
  316. }
  317.  
  318. bool IterateWeapons(HANDLE sHandle, DWORD64 mBase)
  319. {
  320. class WeaponList
  321. {
  322. public:
  323. DWORD64 List;
  324. DWORD Size;
  325. };
  326.  
  327. WeaponList WeaponListData;
  328. if (!RPM(sHandle, mBase + WEAPON_LIST_OFFSET, &WeaponListData, sizeof(WeaponListData))) return false;
  329. if (!Valid(WeaponListData.List)) return false;
  330. if (!WeaponListData.Size) return false;
  331.  
  332. DWORD64 *WeaponPtr = new DWORD64[WeaponListData.Size];
  333. if (!RPM(sHandle, WeaponListData.List, &*WeaponPtr, WeaponListData.Size * sizeof(DWORD64)))
  334. {
  335. delete[]WeaponPtr;
  336. return false;
  337. }
  338.  
  339. for (DWORD i = 0; i < WeaponListData.Size; i++)
  340. {
  341. if (!Valid(WeaponPtr[i])) continue;
  342. EditWeapon(WeaponPtr[i], sHandle);
  343. }
  344.  
  345. delete[]WeaponPtr;
  346. return true;
  347. }
  348.  
  349. void PatchFunctions(HANDLE sHandle, DWORD64 mBase, DWORD mSize)
  350. {
  351. DWORD AmmoOffset = GetSigOffset(sHandle, mBase, mSize, InfiniteAmmoSig, sizeof(InfiniteAmmoSig));
  352. if (AmmoOffset > 0)
  353. {
  354. BYTE AmmoOn[] = { 0x66, 0xBE, 0xE7, 0x03 };
  355. BYTE AmmoOff[] = { 0x8B, 0x74, 0x24, 0x50 };
  356. BYTE AmmoCheck[sizeof(AmmoOff)];
  357. DWORD64 AmmoAddress = mBase + AmmoOffset + 0x8;
  358. if (RPM(sHandle, AmmoAddress, &AmmoCheck, sizeof(AmmoCheck)))
  359. {
  360. if (InfiniteAmmo)
  361. {
  362. if (!memcmp(AmmoCheck, AmmoOff, sizeof(AmmoCheck)))
  363. {
  364. WPM(sHandle, AmmoAddress, &AmmoOn, sizeof(AmmoOn));
  365. }
  366. }
  367. else
  368. {
  369. if (!memcmp(AmmoCheck, AmmoOn, sizeof(AmmoOn)))
  370. {
  371. WPM(sHandle, AmmoAddress, &AmmoOff, sizeof(AmmoOff));
  372. }
  373. }
  374. }
  375. }
  376.  
  377. DWORD BrokenOffset = GetSigOffset(sHandle, mBase, mSize, EquipBrokenItemsSig, sizeof(EquipBrokenItemsSig));
  378. if (BrokenOffset > 0)
  379. {
  380. BYTE BrokenOn[] = { 0x31, 0xFF };
  381. BYTE BrokenOff[] = { 0xFF, 0xC7 };
  382. BYTE BrokenCheck[sizeof(BrokenOff)];
  383. DWORD64 BrokenAddress = mBase + BrokenOffset + 0xB;
  384. if (RPM(sHandle, BrokenAddress, &BrokenCheck, sizeof(BrokenCheck)))
  385. {
  386. if (EquipBrokenItems)
  387. {
  388. if (!memcmp(BrokenCheck, BrokenOff, sizeof(BrokenCheck)))
  389. {
  390. WPM(sHandle, BrokenAddress, &BrokenOn, sizeof(BrokenOn));
  391. }
  392. }
  393. else
  394. {
  395. if (!memcmp(BrokenCheck, BrokenOn, sizeof(BrokenOn)))
  396. {
  397. WPM(sHandle, BrokenAddress, &BrokenOff, sizeof(BrokenOff));
  398. }
  399. }
  400. }
  401. }
  402.  
  403. DWORD LevelOffset = GetSigOffset(sHandle, mBase, mSize, RemoveEquipmentLevelSig, sizeof(RemoveEquipmentLevelSig));
  404. if (LevelOffset > 0)
  405. {
  406. BYTE LevelOn[] = { 0xB8, 0x32, 0x00, 0x00, 0x00 };
  407. BYTE LevelOff[] = { 0xF3, 0x48, 0x0F, 0x2C, 0xC0 };
  408. BYTE LevelCheck[sizeof(LevelOff)];
  409. DWORD64 LevelAddress = mBase + LevelOffset + 0x31;
  410. if (RPM(sHandle, LevelAddress, &LevelCheck, sizeof(LevelCheck)))
  411. {
  412. if (RemoveEquipmentLevel)
  413. {
  414. if (!memcmp(LevelCheck, LevelOff, sizeof(LevelCheck)))
  415. {
  416. WPM(sHandle, LevelAddress, &LevelOn, sizeof(LevelOn));
  417. }
  418. }
  419. else
  420. {
  421. if (!memcmp(LevelCheck, LevelOn, sizeof(LevelOn)))
  422. {
  423. WPM(sHandle, LevelAddress, &LevelOff, sizeof(LevelOff));
  424. }
  425. }
  426. }
  427. }
  428. }
  429.  
  430. bool RPM(HANDLE sHandle, DWORD64 src, void *dst, size_t Size)
  431. {
  432. return ReadProcessMemory(sHandle, (void*)(src), dst, Size, NULL);
  433. }
  434.  
  435. bool WPM(HANDLE sHandle, DWORD64 dst, void *src, size_t Size)
  436. {
  437. return WriteProcessMemory(sHandle, (void*)(dst), src, Size, NULL);
  438. }
  439.  
  440. bool Valid(DWORD64 ptr)
  441. {
  442. if (ptr < 0x7FFF || ptr > 0x7FFFFFFFFFFF) return false;
  443. else return true;
  444. }
  445.  
  446. DWORD GetSigOffset(HANDLE sHandle, DWORD64 mBase, DWORD mSize, void *Sig, size_t Size)
  447. {
  448. DWORD SigOffset = 0;
  449. unsigned char *ModuleArray = new unsigned char[mSize];
  450.  
  451. if (RPM(sHandle, mBase, &*ModuleArray, mSize))
  452. {
  453. for (DWORD i = 0; i < mSize; i++)
  454. {
  455. if (i + Size >= mSize) break;
  456. if (!memcmp(&ModuleArray[i], Sig, Size))
  457. {
  458. SigOffset = i;
  459. break;
  460. }
  461. }
  462. }
  463.  
  464. delete[]ModuleArray;
  465. return SigOffset;
  466. }
  467.  
  468. class ModuleData
  469. {
  470. public:
  471. CHAR *mName;
  472. BYTE *mBase;
  473. DWORD mSize;
  474. DWORD mPid;
  475. };
  476.  
  477. bool GetModuleData(ModuleData &mData)
  478. {
  479. HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, mData.mPid);
  480. if (hSnapshot == INVALID_HANDLE_VALUE) return false;
  481.  
  482. MODULEENTRY32 lpme;
  483. lpme.dwSize = sizeof(lpme);
  484.  
  485. while (Module32Next(hSnapshot, &lpme))
  486. {
  487. if (!strcmp(lpme.szModule, mData.mName))
  488. {
  489. mData.mBase = lpme.modBaseAddr;
  490. mData.mSize = lpme.modBaseSize;
  491. CloseHandle(hSnapshot);
  492. return true;
  493. }
  494. }
  495.  
  496. CloseHandle(hSnapshot);
  497. return false;
  498. }
  499.  
  500. int main()
  501. {
  502. HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
  503. if (hSnapshot == INVALID_HANDLE_VALUE) return 1;
  504.  
  505. PROCESSENTRY32 lppe;
  506. lppe.dwSize = sizeof(lppe);
  507.  
  508. while (Process32Next(hSnapshot, &lppe))
  509. {
  510. if (!strcmp(lppe.szExeFile, sProcess))
  511. {
  512. ModuleData mData;
  513. mData.mName = lppe.szExeFile;
  514. mData.mPid = lppe.th32ProcessID;
  515. if (!GetModuleData(mData)) continue;
  516.  
  517. HANDLE sHandle = OpenProcess(PROCESS_ALL_ACCESS, false, mData.mPid);
  518. IterateWeapons(sHandle, DWORD64(mData.mBase));
  519. PatchFunctions(sHandle, DWORD64(mData.mBase), mData.mSize);
  520. CloseHandle(sHandle);
  521. }
  522. }
  523.  
  524. CloseHandle(hSnapshot);
  525. return 0;
  526. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement