Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <stdio.h>
- #include <cstring>
- DWORD64 GObjObjects_offset = NULL;
- DWORD64 Names_offset = NULL;
- DWORD Offset_Name = 0x10;
- MODULEINFO GetModuleInfo(LPCTSTR lpModuleName)
- {
- MODULEINFO miInfos = { NULL };
- HMODULE hmModule = GetModuleHandle(lpModuleName);
- if (hmModule)
- {
- GetModuleInformation(GetCurrentProcess(), hmModule, &miInfos, sizeof(MODULEINFO));
- }
- return miInfos;
- }
- bool bDataCompare(const BYTE *pData, const BYTE *bMask, const char *szMask)
- {
- for (; *szMask; ++szMask, ++pData, ++bMask) if (*szMask == 'x' && *pData != *bMask) return false;
- return (*szMask) == NULL;
- }
- DWORD64 FindPatternx64(DWORD64 dwAddress, DWORD64 dwLen, BYTE *bMask, char *szMask)
- {
- for (DWORD64 i = 0; i < dwLen; i++)
- if (bDataCompare((BYTE*)(dwAddress + i), bMask, szMask)) return (DWORD64)(dwAddress + i);
- return 0;
- }
- template < class T > struct TArray
- {
- T* Data;
- DWORD Num;
- DWORD Max;
- };
- struct UObject
- {
- UCHAR Unknown[0x10]; // unknowed data
- DWORD NameIndex; // struct FName
- };
- class FUObjectItem
- {
- public:
- UObject * Object;
- __int32 Flags;
- __int32 ClusterIndex;
- __int32 SerialNumber;
- char unknowndata_00[0x4]; //New
- };
- class TUObjectArray
- {
- public:
- FUObjectItem * Objects;
- __int32 MaxElements;
- __int32 NumElements;
- };
- class FUObjectArray
- {
- public:
- __int32 ObjFirstGCIndex; //0x0000
- __int32 ObjLastNonGCIndex; //0x0004
- __int32 MaxObjectsNotConsideredByGC; //0x0008
- __int32 OpenForDisregardForGC; //0x000C
- TUObjectArray ObjObjects;
- };
- struct FNameEntry
- {
- int Index;
- char pad_0x0004[0x4];
- FNameEntry* HashNext;
- char AnsiName[1024];
- };
- template<typename ElementType, __int32 MaxTotalElements, __int32 ElementsPerChunk>
- class TStaticIndirectArrayThreadSafeRead
- {
- public:
- __int32 Num() const
- {
- return numElements;
- }
- bool IsValidIndex(__int32 index) const
- {
- return index >= 0 && index < Num() && GetById(index) != nullptr;
- }
- ElementType const* const& GetById(__int32 index) const
- {
- return *GetItemPtr(index);
- }
- private:
- ElementType const* const* GetItemPtr(__int32 Index) const
- {
- const __int32 ChunkIndex = Index / ElementsPerChunk;
- const __int32 WithinChunkIndex = Index % ElementsPerChunk;
- const auto Chunk = chunks[ChunkIndex];
- return Chunk + WithinChunkIndex;
- }
- enum
- {
- ChunkTableSize = (MaxTotalElements + ElementsPerChunk - 1) / ElementsPerChunk
- };
- ElementType** chunks[ChunkTableSize];
- __int32 numElements;
- __int32 numChunks;
- };
- using TNameEntryArray = TStaticIndirectArrayThreadSafeRead<FNameEntry, 2 * 1024 * 1024, 16384>;
- FUObjectArray* GObjObjects =NULL;
- TNameEntryArray* Names = NULL;
- char* GetName(UObject* Object)
- {
- DWORD64 NameIndex = *(PDWORD64)((DWORD64)Object + Offset_Name);
- if (NameIndex < 0 || NameIndex > Names->Num())
- {
- static char ret[256];
- sprintf_s(ret, "INVALID NAME INDEX : %i > %i", NameIndex, Names->Num());
- return ret;
- }
- else
- {
- return (char*)Names->GetById(NameIndex)->AnsiName;
- }
- }
- void ObjectDump()
- {
- FILE* Log = NULL;
- fopen_s(&Log, "ObjectDump.txt", "w+");
- for (DWORD64 i = 0x0; i < GObjObjects->ObjObjects.NumElements; i++)
- {
- if (!GObjObjects->ObjObjects.Objects[i].Object) { continue; }
- fprintf(Log, "UObject[%06i] %-50s 0x%llX\n", i, GetName(GObjObjects->ObjObjects.Objects[i].Object), GObjObjects->ObjObjects.Objects[i].Object);
- }
- fclose(Log);
- }
- void NameDump()
- {
- FILE* Log = NULL;
- fopen_s(&Log, "NameDump.txt", "w+");
- for (DWORD64 i = 0x0; i < Names->Num(); i++)
- {
- if (!Names->GetById(i)) { continue; }
- fprintf(Log, "Name[%06i] %s\n", i, Names->GetById(i)->AnsiName);
- }
- fclose(Log);
- }
- void onAttach()
- {
- AllocConsole();
- freopen("CONOUT$", "w", stdout);
- MODULEINFO miGame = GetModuleInfo(NULL);
- GObjObjects_offset = (DWORD64)((DWORD64)miGame.lpBaseOfDll + 0x425AD00);
- Names_offset = (*(DWORD64*)((DWORD64)miGame.lpBaseOfDll + 0x42561D8));
- GObjObjects = (FUObjectArray*)GObjObjects_offset;
- Names = (TNameEntryArray*)Names_offset;
- NameDump();
- ObjectDump();
- }
- BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
- {
- switch (dwReason)
- {
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hModule);
- CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)onAttach, NULL, 0, NULL);
- return true;
- break;
- case DLL_PROCESS_DETACH:
- return true;
- break;
- }
- }
Add Comment
Please, Sign In to add comment