├── FortAlpha.sln ├── FortAlpha ├── FortAlpha.vcxproj ├── FortAlpha.vcxproj.filters ├── Responses │ ├── profile0.json │ ├── storefront.json │ └── worldinfo.json ├── dllmain.cpp ├── frontend.h ├── functions.h ├── hooks.h ├── minhook │ ├── LICENSE.txt │ ├── MinHook.h │ └── libMinHook.x86.lib ├── offsets.h ├── ue4.h └── util.h └── README.md /FortAlpha.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.0.31423.177 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FortAlpha", "FortAlpha\FortAlpha.vcxproj", "{4B26D372-2F32-4E8D-A040-BF0056BFE0E6}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|x64 = Debug|x64 11 | Debug|x86 = Debug|x86 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x64.ActiveCfg = Debug|x64 17 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x64.Build.0 = Debug|x64 18 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x86.ActiveCfg = Debug|Win32 19 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Debug|x86.Build.0 = Debug|Win32 20 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x64.ActiveCfg = Release|x64 21 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x64.Build.0 = Release|x64 22 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x86.ActiveCfg = Release|Win32 23 | {4B26D372-2F32-4E8D-A040-BF0056BFE0E6}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {2A729EE7-DA61-4C13-BF87-03267159DFC7} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /FortAlpha/FortAlpha.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 16.0 23 | Win32Proj 24 | {4b26d372-2f32-4e8d-a040-bf0056bfe0e6} 25 | FortAlpha 26 | 10.0 27 | 28 | 29 | 30 | DynamicLibrary 31 | true 32 | v142 33 | Unicode 34 | 35 | 36 | DynamicLibrary 37 | false 38 | v142 39 | true 40 | Unicode 41 | 42 | 43 | DynamicLibrary 44 | true 45 | v142 46 | Unicode 47 | 48 | 49 | DynamicLibrary 50 | false 51 | v142 52 | true 53 | Unicode 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | true 75 | 76 | 77 | false 78 | 79 | 80 | true 81 | 82 | 83 | false 84 | 85 | 86 | 87 | Level3 88 | true 89 | WIN32;_DEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 90 | true 91 | Use 92 | pch.h 93 | 94 | 95 | Windows 96 | true 97 | false 98 | 99 | 100 | 101 | 102 | Level3 103 | true 104 | true 105 | true 106 | WIN32;NDEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 107 | true 108 | NotUsing 109 | pch.h 110 | 111 | 112 | true 113 | 114 | 115 | Windows 116 | true 117 | true 118 | true 119 | false 120 | 121 | 122 | /FORCE %(AdditionalOptions) 123 | 124 | 125 | 126 | 127 | Level3 128 | true 129 | _DEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 130 | true 131 | Use 132 | pch.h 133 | 134 | 135 | Windows 136 | true 137 | false 138 | 139 | 140 | 141 | 142 | Level3 143 | true 144 | true 145 | true 146 | NDEBUG;FORTALPHA_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) 147 | true 148 | NotUsing 149 | pch.h 150 | 151 | 152 | Windows 153 | true 154 | true 155 | true 156 | false 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /FortAlpha/FortAlpha.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | 14 | 15 | Source Files 16 | 17 | 18 | 19 | 20 | Header Files 21 | 22 | 23 | Header Files 24 | 25 | 26 | Header Files 27 | 28 | 29 | Header Files 30 | 31 | 32 | Header Files 33 | 34 | 35 | Header Files 36 | 37 | 38 | -------------------------------------------------------------------------------- /FortAlpha/Responses/profile0.json: -------------------------------------------------------------------------------- 1 | { 2 | "profileRevision": 480, 3 | "profileId": "profile0", 4 | "profileChangesBaseRevision": 480, 5 | "profileChanges": [ 6 | { 7 | "changeType": "fullProfileUpdate", 8 | "profile": { 9 | "_id": "faefefcfdaad4eae8aed65c3139376f8", 10 | "created": "2017-08-29T20:38:59.824Z", 11 | "updated": "2017-12-25T02:08:43.518Z", 12 | "rvn": 480, 13 | "wipeNumber": 9, 14 | "accountId": "b810c129520946d6801a58bb9d5859fc", 15 | "profileId": "profile0", 16 | "version": "s1", 17 | "notifications": 10, 18 | "level": 50, 19 | "stats": { 20 | "level": 50, 21 | "templateId": "profile_v2", 22 | "attributes": { 23 | "node_costs": { 24 | "t1_main_nodepage_layer1": { 25 | "Token:homebasepoints": 5 26 | } 27 | }, 28 | "level": 30, 29 | "xp": 36000, 30 | "level_info": 20, 31 | "totalBalance": 500, 32 | "homebase": { 33 | "townName": "Name", 34 | "flagPattern": 5, 35 | "flagColor": 0, 36 | "level": 30 37 | }, 38 | "commandRevision": 263 39 | } 40 | } 41 | } 42 | } 43 | ], 44 | "profileCommandRevision": 263, 45 | "serverTime": "2017-12-25T11:48:28.089Z", 46 | "responseVersion": 1 47 | } -------------------------------------------------------------------------------- /FortAlpha/Responses/storefront.json: -------------------------------------------------------------------------------- 1 | { 2 | "refreshIntervalHrs": 24, 3 | "dailyPurchaseHrs": 24, 4 | "expiration": "9999-12-31T23:59:59.999Z", 5 | "storefronts": [ 6 | { 7 | "name": "CardPackStorePromo", 8 | "catalogEntries": [ 9 | { 10 | "offerId": "C060A6539A1743CA94C35D132EA91F4D", 11 | "devName": "Bonus.WeaponsPack.02", 12 | "offerType": "StaticPrice", 13 | "prices": [ 14 | { 15 | "currencyType": "MtxCurrency", 16 | "currencySubType": "", 17 | "regularPrice": 200, 18 | "finalPrice": 200, 19 | "saleExpiration": "9999-12-31T23:59:59.999Z", 20 | "basePrice": 200 21 | } 22 | ], 23 | "categories": [], 24 | "dailyLimit": 3, 25 | "weeklyLimit": -1, 26 | "monthlyLimit": -1, 27 | "appStoreId": [ 28 | "", 29 | "", 30 | "", 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "" 37 | ], 38 | "requirements": [], 39 | "metaInfo": [ 40 | { 41 | "key": "RequiredTag", 42 | "value": "Account.Buff.BonusStoreOffer" 43 | } 44 | ], 45 | "metaAssetInfo": { 46 | "structName": "FortCatalogMeta", 47 | "payload": { 48 | "chaseItems": [ 49 | "FortHeroType'/Game/Heroes/Class_Commando.Class_Commando'", 50 | "FortWorkerType'/Game/Items/Workers/Managers/ManagerDoctor_T01.ManagerDoctor_T01'", 51 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Auto_T04.Assault_Auto_T04'" 52 | ], 53 | "packDefinition": "FortCardPackItemDefinition'/Game/Loot/CardPacks/CardPack_Bronze_Weapons.CardPack_Bronze_Weapons'" 54 | } 55 | }, 56 | "catalogGroup": "", 57 | "catalogGroupPriority": 0, 58 | "sortPriority": 0, 59 | "title": "Upgrade Llama", 60 | "shortDescription": "", 61 | "description": "Upgrade Llama", 62 | "displayAssetPath": "", 63 | "itemGrants": [ 64 | { 65 | "templateId": "CardPack:CardPack_Bronze_Weapons", 66 | "quantity": 1 67 | } 68 | ] 69 | }, 70 | { 71 | "offerId": "C060A6539A1743CA94C35D132EA91F4D", 72 | "devName": "Bonus.WeaponsPack.02", 73 | "offerType": "StaticPrice", 74 | "prices": [ 75 | { 76 | "currencyType": "MtxCurrency", 77 | "currencySubType": "", 78 | "regularPrice": 0, 79 | "finalPrice": 0, 80 | "saleExpiration": "9999-12-31T23:59:59.999Z", 81 | "basePrice": 0 82 | } 83 | ], 84 | "categories": [], 85 | "dailyLimit": 3, 86 | "weeklyLimit": -1, 87 | "monthlyLimit": -1, 88 | "appStoreId": [ 89 | "", 90 | "", 91 | "", 92 | "", 93 | "", 94 | "", 95 | "", 96 | "", 97 | "" 98 | ], 99 | "requirements": [], 100 | "metaInfo": [ 101 | { 102 | "key": "RequiredTag", 103 | "value": "Account.Buff.BonusStoreOffer" 104 | } 105 | ], 106 | "metaAssetInfo": { 107 | "structName": "FortCatalogMeta", 108 | "payload": { 109 | "chaseItems": [ 110 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Auto_T10.Assault_Auto_T10'", 111 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Hydra_T09.Assault_Hydra_T09'", 112 | "FortSchematicItemDefinition'/Game/Loot/Schematics/Ranged/Assault_Raygun_Auto_T08.Assault_Raygun_Auto_T08'" 113 | ], 114 | "packDefinition": "FortCardPackItemDefinition'/Game/Loot/CardPacks/CardPack_Jackpot.CardPack_Jackpot'" 115 | } 116 | }, 117 | "catalogGroup": "", 118 | "catalogGroupPriority": 0, 119 | "sortPriority": 0, 120 | "title": "Free Llama", 121 | "shortDescription": "", 122 | "description": "Free", 123 | "displayAssetPath": "", 124 | "itemGrants": [ 125 | { 126 | "templateId": "CardPack:CardPack_Jackpot", 127 | "quantity": 1 128 | } 129 | ] 130 | } 131 | ] 132 | }, 133 | { 134 | "name": "CurrencyStorefront", 135 | "catalogEntries": [ 136 | { 137 | "offerId": "A094F1D14BAE8DA77114DAAE76AFCA83", 138 | "devName": "Medium Currency Pack", 139 | "offerType": "StaticPrice", 140 | "prices": [ 141 | { 142 | "currencyType": "RealMoney", 143 | "currencySubType": "", 144 | "regularPrice": 1999, 145 | "finalPrice": 1999, 146 | "saleExpiration": "9999-12-31T23:59:59.999Z", 147 | "basePrice": 1999 148 | } 149 | ], 150 | "categories": [], 151 | "dailyLimit": -1, 152 | "weeklyLimit": -1, 153 | "monthlyLimit": -1, 154 | "appStoreId": [ 155 | "", 156 | "559f2ba95f874ec987d0ebfd2cc9c70a", 157 | "ios_vbucks_medium", 158 | "10200", 159 | "google_vbucks_medium", 160 | "", 161 | "MTX03K0000000000", 162 | "cee19aa0-5238-4656-9e52-c8bd0765eb53", 163 | "c-virtualcurrency0-MTX2800" 164 | ], 165 | "requirements": [], 166 | "metaInfo": [ 167 | { 168 | "key": "MtxQuantity", 169 | "value": "2800" 170 | }, 171 | { 172 | "key": "MtxBonus", 173 | "value": "300" 174 | } 175 | ], 176 | "catalogGroup": "", 177 | "catalogGroupPriority": 0, 178 | "sortPriority": 2, 179 | "title": "Medium Currency Pack", 180 | "shortDescription": "", 181 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.", 182 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack2800.DA_MtxPack2800", 183 | "itemGrants": [] 184 | }, 185 | { 186 | "offerId": "E2BD4F70498AF13ADAA071B04F885292", 187 | "devName": "Small Currency Pack", 188 | "offerType": "StaticPrice", 189 | "prices": [ 190 | { 191 | "currencyType": "RealMoney", 192 | "currencySubType": "", 193 | "regularPrice": 799, 194 | "finalPrice": 799, 195 | "saleExpiration": "9999-12-31T23:59:59.999Z", 196 | "basePrice": 799 197 | } 198 | ], 199 | "categories": [], 200 | "dailyLimit": -1, 201 | "weeklyLimit": -1, 202 | "monthlyLimit": -1, 203 | "appStoreId": [ 204 | "", 205 | "ede05b3c97e9475a8d9be91da65750f0", 206 | "ios_vbucks_small", 207 | "10100", 208 | "google_vbucks_small", 209 | "", 210 | "MTX01K0000000000", 211 | "6caed040-72dc-499a-9337-a165f1ec0a26", 212 | "c-virtualcurrency0-MTX1000" 213 | ], 214 | "requirements": [], 215 | "metaInfo": [ 216 | { 217 | "key": "MtxQuantity", 218 | "value": "1000" 219 | }, 220 | { 221 | "key": "MtxBonus", 222 | "value": "0" 223 | } 224 | ], 225 | "catalogGroup": "", 226 | "catalogGroupPriority": 0, 227 | "sortPriority": 3, 228 | "title": "Small Currency Pack", 229 | "shortDescription": "", 230 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.", 231 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack1000.DA_MtxPack1000", 232 | "itemGrants": [] 233 | }, 234 | { 235 | "offerId": "425FDD804D9D61AC2530CE8F31398BCD", 236 | "devName": "Large Currency Pack", 237 | "offerType": "StaticPrice", 238 | "prices": [ 239 | { 240 | "currencyType": "RealMoney", 241 | "currencySubType": "", 242 | "regularPrice": 4999, 243 | "finalPrice": 4999, 244 | "saleExpiration": "9999-12-31T23:59:59.999Z", 245 | "basePrice": 4999 246 | } 247 | ], 248 | "categories": [], 249 | "dailyLimit": -1, 250 | "weeklyLimit": -1, 251 | "monthlyLimit": -1, 252 | "appStoreId": [ 253 | "", 254 | "3b4c5df9efa5415b941cf74262865e4e", 255 | "ios_vbucks_large", 256 | "10300", 257 | "google_vbucks_large", 258 | "", 259 | "MTX08K0000000000", 260 | "d299e00d-811e-4b57-85c1-ec06cbc40074", 261 | "c-virtualcurrency0-MTX7500" 262 | ], 263 | "requirements": [], 264 | "metaInfo": [ 265 | { 266 | "key": "MtxQuantity", 267 | "value": "7500" 268 | }, 269 | { 270 | "key": "MtxBonus", 271 | "value": "1500" 272 | } 273 | ], 274 | "catalogGroup": "", 275 | "catalogGroupPriority": 0, 276 | "sortPriority": 1, 277 | "title": "Large Currency Pack", 278 | "shortDescription": "", 279 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.", 280 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack7500.DA_MtxPack7500", 281 | "itemGrants": [] 282 | }, 283 | { 284 | "offerId": "50DC69A74BC4B8D10AF8D5B17A4BF8D4", 285 | "devName": "Jumbo Currency Pack", 286 | "offerType": "StaticPrice", 287 | "prices": [ 288 | { 289 | "currencyType": "RealMoney", 290 | "currencySubType": "", 291 | "regularPrice": 7999, 292 | "finalPrice": 7999, 293 | "saleExpiration": "9999-12-31T23:59:59.999Z", 294 | "basePrice": 7999 295 | } 296 | ], 297 | "categories": [], 298 | "dailyLimit": -1, 299 | "weeklyLimit": -1, 300 | "monthlyLimit": -1, 301 | "appStoreId": [ 302 | "", 303 | "4daadb392f1c4ee2b5a3af443e614d2a", 304 | "ios_vbucks_jumbo", 305 | "10400", 306 | "google_vbucks_jumbo", 307 | "", 308 | "MTX14K0000000000", 309 | "d15248c0-acf6-48b7-9632-c9638cba4b37", 310 | "c-virtualcurrency0-MTX13500" 311 | ], 312 | "requirements": [], 313 | "metaInfo": [ 314 | { 315 | "key": "MtxQuantity", 316 | "value": "13500" 317 | }, 318 | { 319 | "key": "MtxBonus", 320 | "value": "3500" 321 | } 322 | ], 323 | "catalogGroup": "", 324 | "catalogGroupPriority": 0, 325 | "sortPriority": 4, 326 | "title": "Jumbo Currency Pack", 327 | "shortDescription": "", 328 | "description": "This in-game currency can be used to purchase new customization items for your Hero, glider, or pickaxe.", 329 | "displayAssetPath": "/Game/Catalog/DisplayAssets/DA_MtxPack13500.DA_MtxPack13500", 330 | "itemGrants": [] 331 | } 332 | ] 333 | } 334 | ] 335 | } -------------------------------------------------------------------------------- /FortAlpha/dllmain.cpp: -------------------------------------------------------------------------------- 1 | #include "hooks.h" 2 | 3 | DWORD WINAPI Main(PVOID pParam) 4 | { 5 | Util::InitConsole(); 6 | printf("Wait...\n"); 7 | Offsets::Init(); 8 | Hooks::Init(); 9 | Frontend::UnlockConsole(); 10 | printf("Ok now login\n"); 11 | 12 | return NULL; 13 | } 14 | 15 | BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, PVOID pReserved) 16 | { 17 | switch (dwReason) 18 | { 19 | case DLL_PROCESS_ATTACH: 20 | CreateThread(0, 0, Main, hModule, 0, 0); 21 | break; 22 | } 23 | 24 | return TRUE; 25 | } 26 | 27 | -------------------------------------------------------------------------------- /FortAlpha/frontend.h: -------------------------------------------------------------------------------- 1 | #include "functions.h" 2 | 3 | namespace Frontend 4 | { 5 | void UnlockConsole() 6 | { 7 | auto NewConsole = SpawnObject(FindObject(L"Class /Script/Engine.Console"), Offsets::GameViewportClient); 8 | *(UObject**)(DWORD(Offsets::GameViewportClient) + Offsets::ViewportConsoleOffset) = NewConsole; 9 | } 10 | 11 | void SetupHeroMenu() 12 | { 13 | auto FortHero = FindObject(L"FortHero /Engine/Transient.FortHero_0"); 14 | 15 | *(int*)(DWORD(FortHero) + Offsets::HeroLevelOffset) = 25; 16 | *(int*)(DWORD(FortHero) + Offsets::HeroXPOffset) = 300; 17 | *(FString*)(DWORD(FortHero) + Offsets::HeroNameOffset) = L"Rescue Trooper Ramirez"; 18 | *(int*)(DWORD(FortHero) + Offsets::HeroGenderOffset) = 2; 19 | 20 | SetPersonalHeroChoice(FortHero); 21 | } 22 | 23 | void SetRatings() 24 | { 25 | auto HomeBaseRatingWidget = FindObject(L"HomeBaseRatingWidget_C /Engine/Transient.FortEngine_0.FortGameInstance_0.HomeBase_C_0.WidgetTree_1.TopBar.WidgetTree_475.HomeBaseRatingWidget"); 26 | auto MtxCurrencyWidget = FindObject(L"MtxCurrency_Widget_C /Engine/Transient.FortEngine_0.FortGameInstance_0.HomeBase_C_0.WidgetTree_1.TopBar.WidgetTree_475.TopBar_MtxCurrency_Widget"); 27 | 28 | Offsets::CurrentSelfValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentSelfValue"); 29 | Offsets::CurrentTeamValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentTeamValue"); 30 | Offsets::CurrentTotalValueOffset = FindOffset(L"IntProperty /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.CurrentTotalValue"); 31 | 32 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentSelfValueOffset) = 7921; 33 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentTeamValueOffset) = 5684; 34 | *(int*)(DWORD(HomeBaseRatingWidget) + Offsets::CurrentTotalValueOffset) = 13605; 35 | 36 | UpdateRatingWidget(HomeBaseRatingWidget); 37 | UpdateMtxWidget(MtxCurrencyWidget, 500); 38 | 39 | *(bool*)(DWORD(Offsets::PlayerController) + Offsets::bTutorialCompletedOffset) = true; 40 | } 41 | 42 | // I tried to load all the account items with JonLHack but I got the memory error 💀. Try it if you want or put all the items you want in a llama 43 | void GiveAccountItems() 44 | { 45 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++) 46 | { 47 | auto Object = GObjects->ObjObjects.Objects[i].Object; 48 | auto ClassName = GetName(Object->Class); 49 | if (ClassName == L"Class /Script/FortniteGame.FortHeroType" || 50 | ClassName == L"Class /Script/FortniteGame.FortWorkerType" || 51 | ClassName == L"Class /Script/FortniteGame.FortPersistentResourceItemDefinition" || 52 | ClassName == L"Class /Script/FortniteGame.FortSchematicItemDefinition") 53 | { 54 | if (!(GetName(Object).find(L"Default") != std::string::npos)) 55 | GivePlayerLocalAccountItem(Object); 56 | } 57 | } 58 | } 59 | 60 | void DestroyBuildingTooltips() 61 | { 62 | struct Params 63 | { 64 | UObject* Object; 65 | }; 66 | # 67 | Params params; 68 | 69 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++) 70 | { 71 | auto Object = GObjects->ObjObjects.Objects[i].Object; 72 | 73 | if (Object) 74 | { 75 | if (GetName(Object).find(L"HB_") != std::string::npos && GetName(Object).find(L"WidgetComponent") != std::string::npos) 76 | { 77 | params.Object = Object; 78 | ProcessEvent(Object, Object, Offsets::DestroyComponentFunc, ¶ms); 79 | } 80 | } 81 | } 82 | } 83 | 84 | void OpenLlama() 85 | { 86 | ProcessEvent(Offsets::StorePinataMaster, Offsets::StorePinataMaster, Offsets::StartPackOpenFunc, nullptr); 87 | } 88 | } -------------------------------------------------------------------------------- /FortAlpha/functions.h: -------------------------------------------------------------------------------- 1 | #include "offsets.h" 2 | 3 | static UObject* SpawnObject(UObject* Class, UObject* Outer) 4 | { 5 | struct Params 6 | { 7 | UObject* ObjectClass; 8 | UObject* Outer; 9 | UObject* ReturnValue; 10 | }; 11 | 12 | Params params; 13 | params.ObjectClass = Class; 14 | params.Outer = Outer; 15 | 16 | ProcessEvent(Offsets::GameplayStatics, Offsets::GameplayStatics, Offsets::SpawnObjectFunc, ¶ms); 17 | 18 | return params.ReturnValue; 19 | } 20 | 21 | static void GivePlayerLocalAccountItem(UObject* ItemDefinition, int Count = 1) 22 | { 23 | struct Params 24 | { 25 | UObject* ItemDefinition; 26 | int Count; 27 | }; 28 | 29 | Params params; 30 | params.Count = Count; 31 | params.ItemDefinition = ItemDefinition; 32 | 33 | ProcessEvent(Offsets::PlayerController, Offsets::PlayerController, Offsets::GivePlayerLocalAccountItemFunc, ¶ms); 34 | } 35 | 36 | static void SetPersonalHeroChoice(UObject* Hero) 37 | { 38 | struct Params 39 | { 40 | UObject* Hero; 41 | }; 42 | 43 | Params params; 44 | params.Hero = Hero; 45 | 46 | ProcessEvent(Offsets::FrontendContext, Offsets::FrontendContext, Offsets::SetPersonalHeroChoiceFunc, ¶ms); 47 | } 48 | 49 | static void ControlCloudsUpdate() 50 | { 51 | auto OnboardingCloudCover = FindObject(L"S_HB_OnboardingCloudCover_C /Game/Maps/FortniteEntry.FortniteEntry.PersistentLevel.S_HB_OnboardingCloudCover_C_0"); 52 | 53 | ProcessEvent(OnboardingCloudCover, OnboardingCloudCover, Offsets::ControlCloudsUpdateFunc, nullptr); 54 | } 55 | 56 | static void SetActorHiddenInGame(UObject* Actor, bool bNewHidden) 57 | { 58 | struct Params 59 | { 60 | bool bNewHidden; 61 | }; 62 | 63 | Params params; 64 | params.bNewHidden = bNewHidden; 65 | 66 | ProcessEvent(Actor, Actor, Offsets::SetActorHiddenInGameFunc, ¶ms); 67 | } 68 | 69 | void UpdateRatingWidget(UObject* HomeBaseRatingWidget) 70 | { 71 | auto UpdateFunc = FindObject(L"Function /Game/UI/HomeBase/HomeBaseRatingWidget.HomeBaseRatingWidget_C.Update"); 72 | ProcessEvent(HomeBaseRatingWidget, HomeBaseRatingWidget, UpdateFunc, nullptr); 73 | } 74 | 75 | void UpdateMtxWidget(UObject* MtxWidget, int Value) 76 | { 77 | auto SetMtxValueFunc = FindObject(L"Function /Game/UI/Global_Elements/MtxCurrency_Widget.MtxCurrency_Widget_C.Set_MtxValue_from_Int"); 78 | 79 | struct Params 80 | { 81 | int Value; 82 | }; 83 | 84 | Params params; 85 | params.Value = Value; 86 | 87 | ProcessEvent(MtxWidget, MtxWidget, SetMtxValueFunc, ¶ms); 88 | } 89 | 90 | void SetShowHUD(bool bNewShowHUD) 91 | { 92 | struct Params 93 | { 94 | bool bNewShowHUD; 95 | }; 96 | 97 | Params params; 98 | params.bNewShowHUD = bNewShowHUD; 99 | 100 | ProcessEvent(Offsets::PlayerController, Offsets::PlayerController, Offsets::SetShowHUDFunc, ¶ms); 101 | } 102 | 103 | void OpenLlama() 104 | { 105 | auto StorePinataMaster = FindObject(L"StorePinataMaster_BP_C /Game/Maps/FrontEnd/Maps/FrontEndStore.FrontEndStore.PersistentLevel.StorePinataMaster_BP_C_0"); 106 | ProcessEvent(StorePinataMaster, StorePinataMaster, Offsets::StartPackOpenFunc, nullptr); 107 | } 108 | 109 | TArray JonLHack(FString Path, UObject* Class) 110 | { 111 | static auto FortKismetLibrary = SpawnObject(FindObject(L"Class /Script/FortniteGame.FortKismetLibrary"), FindObject(L"Package /Script/FortniteGame")); 112 | static auto JonLHackFunc = FindObject(L"Function /Script/FortniteGame.FortKismetLibrary.JonLHack_GetAllObjectsOfClassFromPath"); 113 | 114 | struct Params 115 | { 116 | FString Path; 117 | UObject* Class; 118 | TArray ReturnValue; 119 | }; 120 | 121 | Params params; 122 | params.Path = Path; 123 | params.Class = Class; 124 | 125 | ProcessEvent(FortKismetLibrary, FortKismetLibrary, JonLHackFunc, ¶ms); 126 | 127 | return params.ReturnValue; 128 | } -------------------------------------------------------------------------------- /FortAlpha/hooks.h: -------------------------------------------------------------------------------- 1 | #include "frontend.h" 2 | 3 | void* __fastcall ProcessEventHook(UObject* _Object, UObject* Object, UObject* Function, void* Params) 4 | { 5 | if (Object && Function) 6 | { 7 | std::wstring ObjectName = GetObjectFirstName(_Object); 8 | std::wstring FunctionName = GetObjectFirstName(Function); 9 | 10 | if (FunctionName.find(L"ShowStoreChanged") != std::string::npos) 11 | return NULL; 12 | if (FunctionName.find(L"PlayZoneChanged") != std::string::npos) 13 | return NULL; 14 | if (FunctionName.find(L"ShowHeroListChanged") != std::string::npos) 15 | return NULL; 16 | if (FunctionName.find(L"ShowVaultChanged") != std::string::npos) 17 | { 18 | Frontend::DestroyBuildingTooltips(); 19 | return NULL; 20 | } 21 | if (FunctionName.find(L"ShowDailyRewardsChanged") != std::string::npos) 22 | return NULL; 23 | if (FunctionName.find(L"Party Bar Feature Changed") != std::string::npos) 24 | { 25 | Frontend::GiveAccountItems(); 26 | Frontend::SetupHeroMenu(); 27 | Frontend::SetRatings(); 28 | return NULL; 29 | } 30 | if (FunctionName.find(L"ShowHomeBaseChanged") != std::string::npos) 31 | return NULL; 32 | if (FunctionName.find(L"HomeBaseOverviewFeature") != std::string::npos) 33 | return NULL; 34 | 35 | if (ObjectName.find(L"S_HB_OnboardingCloudCover_C") != std::string::npos && FunctionName.find(L"UserConstructionScript") != std::string::npos) 36 | { 37 | ControlCloudsUpdate(); 38 | SetActorHiddenInGame(_Object, true); 39 | } 40 | 41 | // Scuffed as hell but it looks clean 42 | if (ObjectName.find(L"HB_") != std::string::npos && FunctionName.find(L"ReceiveBeginPlay") != std::string::npos) 43 | return NULL; 44 | 45 | if (ObjectName.find(L"HomeBaseRatingWidget") != std::string::npos && FunctionName.find(L"Update") != std::string::npos) 46 | return NULL; 47 | 48 | if (FunctionName.find(L"BuyOnePack") != std::string::npos) 49 | { 50 | OpenLlama(); 51 | SetShowHUD(false); 52 | return NULL; 53 | } 54 | 55 | if (FunctionName.find(L"TL-ChangeLighting__FinishedFunc") != std::string::npos) 56 | SetShowHUD(true); 57 | } 58 | 59 | return ProcessEvent(_Object, Object, Function, Params); 60 | } 61 | 62 | namespace Hooks 63 | { 64 | void Init() 65 | { 66 | MH_Initialize(); 67 | 68 | MH_CreateHook(reinterpret_cast(Offsets::ProcessEventAddress), ProcessEventHook, reinterpret_cast(&ProcessEvent)); 69 | MH_EnableHook(reinterpret_cast(Offsets::ProcessEventAddress)); 70 | } 71 | } -------------------------------------------------------------------------------- /FortAlpha/minhook/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MinHook - The Minimalistic API Hooking Library for x64/x86 2 | Copyright (C) 2009-2017 Tsuda Kageyu. 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions 7 | are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright 10 | notice, this list of conditions and the following disclaimer. 11 | 2. Redistributions in binary form must reproduce the above copyright 12 | notice, this list of conditions and the following disclaimer in the 13 | documentation and/or other materials provided with the distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 18 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 19 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | 27 | ================================================================================ 28 | Portions of this software are Copyright (c) 2008-2009, Vyacheslav Patkov. 29 | ================================================================================ 30 | Hacker Disassembler Engine 32 C 31 | Copyright (c) 2008-2009, Vyacheslav Patkov. 32 | All rights reserved. 33 | 34 | Redistribution and use in source and binary forms, with or without 35 | modification, are permitted provided that the following conditions 36 | are met: 37 | 38 | 1. Redistributions of source code must retain the above copyright 39 | notice, this list of conditions and the following disclaimer. 40 | 2. Redistributions in binary form must reproduce the above copyright 41 | notice, this list of conditions and the following disclaimer in the 42 | documentation and/or other materials provided with the distribution. 43 | 44 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 45 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 46 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 47 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 48 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 49 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 50 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 51 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 52 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 53 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 54 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 55 | 56 | ------------------------------------------------------------------------------- 57 | Hacker Disassembler Engine 64 C 58 | Copyright (c) 2008-2009, Vyacheslav Patkov. 59 | All rights reserved. 60 | 61 | Redistribution and use in source and binary forms, with or without 62 | modification, are permitted provided that the following conditions 63 | are met: 64 | 65 | 1. Redistributions of source code must retain the above copyright 66 | notice, this list of conditions and the following disclaimer. 67 | 2. Redistributions in binary form must reproduce the above copyright 68 | notice, this list of conditions and the following disclaimer in the 69 | documentation and/or other materials provided with the distribution. 70 | 71 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 72 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 73 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 74 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 75 | CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 76 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 77 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 78 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 79 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 80 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 81 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 82 | -------------------------------------------------------------------------------- /FortAlpha/minhook/MinHook.h: -------------------------------------------------------------------------------- 1 | /* 2 | * MinHook - The Minimalistic API Hooking Library for x64/x86 3 | * Copyright (C) 2009-2017 Tsuda Kageyu. 4 | * All rights reserved. 5 | * 6 | * Redistribution and use in source and binary forms, with or without 7 | * modification, are permitted provided that the following conditions 8 | * are met: 9 | * 10 | * 1. Redistributions of source code must retain the above copyright 11 | * notice, this list of conditions and the following disclaimer. 12 | * 2. Redistributions in binary form must reproduce the above copyright 13 | * notice, this list of conditions and the following disclaimer in the 14 | * documentation and/or other materials provided with the distribution. 15 | * 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 19 | * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 20 | * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 21 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 22 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | */ 28 | 29 | #pragma once 30 | 31 | #if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) 32 | #error MinHook supports only x86 and x64 systems. 33 | #endif 34 | 35 | #include 36 | 37 | // MinHook Error Codes. 38 | typedef enum MH_STATUS 39 | { 40 | // Unknown error. Should not be returned. 41 | MH_UNKNOWN = -1, 42 | 43 | // Successful. 44 | MH_OK = 0, 45 | 46 | // MinHook is already initialized. 47 | MH_ERROR_ALREADY_INITIALIZED, 48 | 49 | // MinHook is not initialized yet, or already uninitialized. 50 | MH_ERROR_NOT_INITIALIZED, 51 | 52 | // The hook for the specified target function is already created. 53 | MH_ERROR_ALREADY_CREATED, 54 | 55 | // The hook for the specified target function is not created yet. 56 | MH_ERROR_NOT_CREATED, 57 | 58 | // The hook for the specified target function is already enabled. 59 | MH_ERROR_ENABLED, 60 | 61 | // The hook for the specified target function is not enabled yet, or already 62 | // disabled. 63 | MH_ERROR_DISABLED, 64 | 65 | // The specified pointer is invalid. It points the address of non-allocated 66 | // and/or non-executable region. 67 | MH_ERROR_NOT_EXECUTABLE, 68 | 69 | // The specified target function cannot be hooked. 70 | MH_ERROR_UNSUPPORTED_FUNCTION, 71 | 72 | // Failed to allocate memory. 73 | MH_ERROR_MEMORY_ALLOC, 74 | 75 | // Failed to change the memory protection. 76 | MH_ERROR_MEMORY_PROTECT, 77 | 78 | // The specified module is not loaded. 79 | MH_ERROR_MODULE_NOT_FOUND, 80 | 81 | // The specified function is not found. 82 | MH_ERROR_FUNCTION_NOT_FOUND 83 | } 84 | MH_STATUS; 85 | 86 | // Can be passed as a parameter to MH_EnableHook, MH_DisableHook, 87 | // MH_QueueEnableHook or MH_QueueDisableHook. 88 | #define MH_ALL_HOOKS NULL 89 | 90 | #ifdef __cplusplus 91 | extern "C" { 92 | #endif 93 | 94 | // Initialize the MinHook library. You must call this function EXACTLY ONCE 95 | // at the beginning of your program. 96 | MH_STATUS WINAPI MH_Initialize(VOID); 97 | 98 | // Uninitialize the MinHook library. You must call this function EXACTLY 99 | // ONCE at the end of your program. 100 | MH_STATUS WINAPI MH_Uninitialize(VOID); 101 | 102 | // Creates a Hook for the specified target function, in disabled state. 103 | // Parameters: 104 | // pTarget [in] A pointer to the target function, which will be 105 | // overridden by the detour function. 106 | // pDetour [in] A pointer to the detour function, which will override 107 | // the target function. 108 | // ppOriginal [out] A pointer to the trampoline function, which will be 109 | // used to call the original target function. 110 | // This parameter can be NULL. 111 | MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); 112 | 113 | // Creates a Hook for the specified API function, in disabled state. 114 | // Parameters: 115 | // pszModule [in] A pointer to the loaded module name which contains the 116 | // target function. 117 | // pszTarget [in] A pointer to the target function name, which will be 118 | // overridden by the detour function. 119 | // pDetour [in] A pointer to the detour function, which will override 120 | // the target function. 121 | // ppOriginal [out] A pointer to the trampoline function, which will be 122 | // used to call the original target function. 123 | // This parameter can be NULL. 124 | MH_STATUS WINAPI MH_CreateHookApi( 125 | LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); 126 | 127 | // Creates a Hook for the specified API function, in disabled state. 128 | // Parameters: 129 | // pszModule [in] A pointer to the loaded module name which contains the 130 | // target function. 131 | // pszTarget [in] A pointer to the target function name, which will be 132 | // overridden by the detour function. 133 | // pDetour [in] A pointer to the detour function, which will override 134 | // the target function. 135 | // ppOriginal [out] A pointer to the trampoline function, which will be 136 | // used to call the original target function. 137 | // This parameter can be NULL. 138 | // ppTarget [out] A pointer to the target function, which will be used 139 | // with other functions. 140 | // This parameter can be NULL. 141 | MH_STATUS WINAPI MH_CreateHookApiEx( 142 | LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); 143 | 144 | // Removes an already created hook. 145 | // Parameters: 146 | // pTarget [in] A pointer to the target function. 147 | MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); 148 | 149 | // Enables an already created hook. 150 | // Parameters: 151 | // pTarget [in] A pointer to the target function. 152 | // If this parameter is MH_ALL_HOOKS, all created hooks are 153 | // enabled in one go. 154 | MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); 155 | 156 | // Disables an already created hook. 157 | // Parameters: 158 | // pTarget [in] A pointer to the target function. 159 | // If this parameter is MH_ALL_HOOKS, all created hooks are 160 | // disabled in one go. 161 | MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); 162 | 163 | // Queues to enable an already created hook. 164 | // Parameters: 165 | // pTarget [in] A pointer to the target function. 166 | // If this parameter is MH_ALL_HOOKS, all created hooks are 167 | // queued to be enabled. 168 | MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); 169 | 170 | // Queues to disable an already created hook. 171 | // Parameters: 172 | // pTarget [in] A pointer to the target function. 173 | // If this parameter is MH_ALL_HOOKS, all created hooks are 174 | // queued to be disabled. 175 | MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); 176 | 177 | // Applies all queued changes in one go. 178 | MH_STATUS WINAPI MH_ApplyQueued(VOID); 179 | 180 | // Translates the MH_STATUS to its name as a string. 181 | const char * WINAPI MH_StatusToString(MH_STATUS status); 182 | 183 | #ifdef __cplusplus 184 | } 185 | #endif 186 | 187 | -------------------------------------------------------------------------------- /FortAlpha/minhook/libMinHook.x86.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/notsamicc/FortAlpha/70b50b5fbf5e838541ef67494bfb77f57e4d9129/FortAlpha/minhook/libMinHook.x86.lib -------------------------------------------------------------------------------- /FortAlpha/offsets.h: -------------------------------------------------------------------------------- 1 | #include "ue4.h" 2 | 3 | namespace Offsets 4 | { 5 | DWORD ViewportConsoleOffset; 6 | DWORD CurrentTotalValueOffset; 7 | DWORD CurrentSelfValueOffset; 8 | DWORD CurrentTeamValueOffset; 9 | DWORD OwningGameInstanceOffset; 10 | DWORD LocalPlayersOffset; 11 | DWORD PlayerControllerOffset; 12 | DWORD HeroLevelOffset; 13 | DWORD HeroXPOffset; 14 | DWORD HeroNameOffset; 15 | DWORD HeroGenderOffset; 16 | DWORD bTutorialCompletedOffset; 17 | DWORD ProcessEventAddress; 18 | 19 | UObject* GameplayStatics; 20 | UObject* PlayerController; 21 | UObject* FrontendContext; 22 | UObject* GameViewportClient; 23 | UObject* StorePinataMaster; 24 | 25 | UObject* SpawnObjectFunc; 26 | UObject* GivePlayerLocalAccountItemFunc; 27 | UObject* SetPersonalHeroChoiceFunc; 28 | UObject* ControlCloudsUpdateFunc; 29 | UObject* SetActorHiddenInGameFunc; 30 | UObject* DestroyComponentFunc; 31 | UObject* StartPackOpenFunc; 32 | UObject* SetShowHUDFunc; 33 | 34 | void Init() 35 | { 36 | GObjects = (FUObjectArray*)(Util::BaseAddress() + 0x2DC3AAC); 37 | ProcessEventAddress = Util::BaseAddress() + 0x9A9E70; 38 | ProcessEvent = (fProcessEvent)(ProcessEventAddress); 39 | GetObjectName_Internal = (fGetObjectName_Internal)(Util::BaseAddress() + 0x132C400); 40 | Free_Internal = (fFree_Internal)(Util::BaseAddress() + 0x89CAD0); 41 | 42 | HeroLevelOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortAccountItem.Level"); 43 | HeroXPOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortAccountItem.XP"); 44 | HeroNameOffset = FindOffset(L"StrProperty /Script/FortniteGame.FortHero.Hero_Name"); 45 | HeroGenderOffset = FindOffset(L"IntProperty /Script/FortniteGame.FortWorker.Gender"); 46 | ViewportConsoleOffset = FindOffset(L"ObjectProperty /Script/Engine.GameViewportClient.ViewportConsole"); 47 | bTutorialCompletedOffset = FindOffset(L"BoolProperty /Script/FortniteGame.FortPlayerController.bTutorialCompleted"); 48 | 49 | GameplayStatics = FindObject(L"GameplayStatics /Script/Engine.Default__GameplayStatics"); 50 | PlayerController = FindObject(L"FortPlayerControllerFrontEnd /Game/Maps/FortniteEntry.FortniteEntry.PersistentLevel.FortPlayerControllerFrontEnd_0"); 51 | FrontendContext = FindObject(L"FortFrontEndContext /Engine/Transient.FortEngine_0.FortLocalPlayer_0.FortFrontEndContext_0"); 52 | GameViewportClient = FindObject(L"FortGameViewportClient /Engine/Transient.FortEngine_0.FortGameViewportClient_0"); 53 | 54 | SpawnObjectFunc = FindObject(L"Function /Script/Engine.GameplayStatics.SpawnObject"); 55 | GivePlayerLocalAccountItemFunc = FindObject(L"Function /Script/FortniteGame.FortPlayerController.ClientGivePlayerLocalAccountItem"); 56 | FrontendContext = FindObject(L"FortFrontEndContext /Engine/Transient.FortEngine_0.FortLocalPlayer_0.FortFrontEndContext_0"); 57 | SetPersonalHeroChoiceFunc = FindObject(L"Function /Script/FortniteUI.FortFrontEndContext.SetPersonalHeroChoice"); 58 | ControlCloudsUpdateFunc = FindObject(L"Function /Game/Environments/Homebase/Blueprints/Onboarding/S_HB_OnboardingCloudCover.S_HB_OnboardingCloudCover_C.Control_Clouds_Phase02__UpdateFunc"); 59 | SetActorHiddenInGameFunc = FindObject(L"Function /Script/Engine.Actor.SetActorHiddenInGame"); 60 | DestroyComponentFunc = FindObject(L"Function /Script/Engine.ActorComponent.K2_DestroyComponent"); 61 | StartPackOpenFunc = FindObject(L"Function /Game/FrontEnd/Store/Pinata/Blueprints/StorePinataMaster_BP.StorePinataMaster_BP_C.StartPackOpen"); 62 | SetShowHUDFunc = FindObject(L"Function /Script/FortniteGame.FortPlayerController.SetShowHUD"); 63 | } 64 | } -------------------------------------------------------------------------------- /FortAlpha/ue4.h: -------------------------------------------------------------------------------- 1 | #include "util.h" 2 | 3 | template 4 | struct TArray 5 | { 6 | friend struct FString; 7 | 8 | public: 9 | inline TArray() 10 | { 11 | Data = nullptr; 12 | Count = Max = 0; 13 | }; 14 | 15 | inline int Num() const 16 | { 17 | return Count; 18 | }; 19 | 20 | inline T& operator[](int i) 21 | { 22 | return Data[i]; 23 | }; 24 | 25 | inline const T& operator[](int i) const 26 | { 27 | return Data[i]; 28 | }; 29 | 30 | inline bool IsValidIndex(int i) const 31 | { 32 | return i < Num(); 33 | } 34 | 35 | void Add(T InputData) 36 | { 37 | Data = (T*)realloc(Data, sizeof(T) * (Count + 1)); 38 | Data[Count++] = InputData; 39 | Max = Count; 40 | }; 41 | 42 | T* Data; 43 | int32_t Count; 44 | int32_t Max; 45 | }; 46 | 47 | struct FString : private TArray 48 | { 49 | FString() 50 | { 51 | Data = nullptr; 52 | 53 | Max = Count = 0; 54 | } 55 | 56 | FString(const wchar_t* Value) 57 | { 58 | Max = Count = *Value ? std::wcslen(Value) + 1 : 0; 59 | 60 | if (Count) 61 | { 62 | Data = const_cast(Value); 63 | } 64 | }; 65 | 66 | inline bool IsValid() 67 | { 68 | return Data != nullptr; 69 | } 70 | 71 | inline wchar_t* c_str() 72 | { 73 | return Data; 74 | } 75 | 76 | std::string ToString() const 77 | { 78 | size_t length = std::wcslen(Data); 79 | std::string str(length, '\0'); 80 | std::use_facet>(std::locale()).narrow(Data, Data + length, '?', &str[0]); 81 | 82 | return str; 83 | } 84 | }; 85 | 86 | struct FName 87 | { 88 | public: 89 | int32_t ComparisonIndex; 90 | int32_t Number; 91 | }; 92 | 93 | struct UObject 94 | { 95 | void** VTable; 96 | int32_t ObjectFlags; 97 | int32_t InternalIndex; 98 | UObject* Class; 99 | FName Name; 100 | UObject* Outer; 101 | }; 102 | 103 | class FUObjectItem 104 | { 105 | public: 106 | UObject* Object; 107 | int32_t ClusterIndex; 108 | int32_t SerialNumber; 109 | }; 110 | 111 | class TUObjectArray 112 | { 113 | public: 114 | FUObjectItem* Objects; 115 | int32_t MaxElements; 116 | int32_t NumElements; 117 | }; 118 | 119 | class FUObjectArray 120 | { 121 | public: 122 | TUObjectArray ObjObjects; 123 | }; 124 | 125 | FUObjectArray* GObjects; 126 | 127 | typedef void* (__fastcall* fProcessEvent)(UObject* _Object, UObject* Object, UObject* Function, void* Params); 128 | fProcessEvent ProcessEvent; 129 | 130 | typedef FString(__cdecl* fGetObjectName_Internal)(UObject* Object); 131 | static fGetObjectName_Internal GetObjectName_Internal; 132 | 133 | typedef void(__cdecl* fFree_Internal)(void* Buffer); 134 | static fFree_Internal Free_Internal; 135 | 136 | static std::wstring GetObjectName(UObject* Object) 137 | { 138 | std::wstring sName(L""); 139 | 140 | for (auto i = 0; Object; Object = Object->Outer, ++i) 141 | { 142 | FString objName = GetObjectName_Internal(Object); 143 | 144 | if (objName.IsValid()) 145 | { 146 | sName = objName.c_str() + std::wstring(i > 0 ? L"." : L"") + sName; 147 | 148 | Free_Internal(objName.c_str()); 149 | } 150 | } 151 | 152 | return sName; 153 | } 154 | 155 | static std::wstring GetObjectFirstName(UObject* Object) 156 | { 157 | std::wstring sName(L""); 158 | 159 | FString objName = GetObjectName_Internal(Object); 160 | 161 | if (objName.IsValid()) 162 | { 163 | sName = objName.c_str(); 164 | 165 | Free_Internal(objName.c_str()); 166 | } 167 | 168 | return sName; 169 | } 170 | 171 | std::wstring GetName(UObject* obj) 172 | { 173 | std::wstring name; 174 | 175 | if (obj->Class != nullptr) 176 | { 177 | name = GetObjectFirstName((UObject*)obj->Class); 178 | name += L" "; 179 | name += GetObjectName(obj); 180 | } 181 | 182 | return name; 183 | } 184 | 185 | static UObject* FindObject(std::wstring name) 186 | { 187 | for (int i = 0; i < GObjects->ObjObjects.NumElements; i++) 188 | { 189 | auto Object = GObjects->ObjObjects.Objects[i].Object; 190 | 191 | if (Object) 192 | { 193 | if (GetName(Object) == name) 194 | { 195 | return Object; 196 | } 197 | } 198 | } 199 | 200 | std::wcout << "Failed to find " << name << std::endl; 201 | return nullptr; 202 | } 203 | 204 | static DWORD FindOffset(std::wstring Offset) 205 | { 206 | auto Object = FindObject(Offset); 207 | 208 | if (Object) 209 | { 210 | return *(DWORD*)(DWORD(Object) + 0x3C); 211 | } 212 | 213 | return 0; 214 | } -------------------------------------------------------------------------------- /FortAlpha/util.h: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #pragma comment(lib, "libMinHook.x86.lib") 8 | 9 | class Util 10 | { 11 | public: 12 | static uintptr_t BaseAddress() 13 | { 14 | return (uintptr_t)GetModuleHandle(0); 15 | } 16 | 17 | static void InitConsole() 18 | { 19 | AllocConsole(); 20 | FILE* File; 21 | freopen_s(&File, "CONOUT$", "w", stdout); 22 | } 23 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # How to use 2 | 3 | 1. Compile as x86 because alpha is 32 bit 4 | 2. Setup the responses 5 | 3. Inject while in the login screen 6 | 4. Wait for the console to tell you to login 7 | 8 | # Responses 9 | 10 | To use Fiddler with OT 6.5 add "-httpproxy=127.0.0.1:8888" to your launch args (Thanks to Makks for telling me this). Setup the autoresponders like this: 11 | 12 | ![image](https://user-images.githubusercontent.com/69369641/134407434-6ed45f82-e57b-4609-8108-fe5fc9082898.png) 13 | 14 | Note: The worldinfo response is a mess 15 | --------------------------------------------------------------------------------