Advertisement
Guest User

weapon editor

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