R7flex
Banned
- Katılım
- 7 Haz 2020
- Mesajlar
- 3,314
- Beğeniler
- 1,740
Bu kullanıcıyla herhangi bir iş veya ticaret yapmak istiyorsanız, forumdan uzaklaştırıldığını sakın unutmayın.
Bu method scalar'a aittir bende nasıl yapılıcağını net şekilde anlattım.
Oyunun memorysini fiziksel bellekte okunabiliyor ve bu method böyle çalışıyor.
Yukarda ki kodda guarded regionun olduğu adresi buluyoruz fakat scalar ucde açtığı konuda usermode fonksiyonlarını kullanmış, driverınıza onları ekleyerek kullanbilrisiniz. (ben paste yaparak ekledim )
guarded region büyüklüğü her zaman 0x200000 miş.
bu kodlada maplenmiş fiziksel memory ile guarded regionu buluyoruz.
bu kodlada exfreepoolda ki adress ile guarded regionun asıl halini buluyoruz.
yine virtualqueryex i drivera geçiriyoruz burda.
ve artık guarded regionu bulduk burda offsetleri bulmak için guarded regionu tabi bir adres bularak okutuyoruz.
mesela burda özel offsetler var
guarded_region (mesela uworld) + 0x144E0 (solda ki ifadeyi eklersek gerçek memorymizi buluyoruz)
ama player controllerda o + ifadesi 0xBD0B0 ekliyoruz. normalde eskiden çalışıyordu fakat bu offseti ekleyince çalışmıyor şu an bende onun üzerinde uğraşıyorum player controller bulunmuyor güncelleme olursa yazarım
Oyunun memorysini fiziksel bellekte okunabiliyor ve bu method böyle çalışıyor.
Kod:
ULONG infoLen = 0;
NTSTATUS status = ZwQuerySystemInformation(SystemBigPoolInformation, &infoLen, 0, &infoLen); //driver
PSYSTEM_BIGPOOL_INFORMATION pPoolInfo = 0;
while (status == STATUS_INFO_LENGTH_MISMATCH)
{
DbgPrintEx(0, 0, "Length : %lX", infoLen);
if (pPoolInfo)
ExFreePool(pPoolInfo); //driver
pPoolInfo = (PSYSTEM_BIGPOOL_INFORMATION)ExAllocatePool(NonPagedPool, infoLen); //driver
status = ZwQuerySystemInformation(SystemBigPoolInformation, pPoolInfo, infoLen, &infoLen); // driver
}
if (pPoolInfo)
{
DbgPrintEx(0, 0, "status : %lX", status);
DbgPrintEx(0, 0, "Count : %lu", pPoolInfo->Count);
for (int i = 0; i < pPoolInfo->Count; i++)
{
SYSTEM_BIGPOOL_ENTRY* Entry = &pPoolInfo->AllocatedInfo[i];
PVOID VirtualAddress = (PVOID)((uintptr_t)Entry->VirtualAddress & ~1ull);
SIZE_T SizeInBytes = Entry->SizeInBytes;
BOOLEAN NonPaged = Entry->NonPaged;
if (NonPaged && SizeInBytes == 0x200000)
{
DbgPrintEx(0, 0, "NonPagedPool : %p - %p", VirtualAddress, SizeInBytes);
}
}
ExFreePool(pPoolInfo);
}
guarded region büyüklüğü her zaman 0x200000 miş.
Kod:
if (NonPaged && SizeInBytes == 0x200000)
{
DbgPrintEx(0, 0, "NonPagedPool : %p - %p", VirtualAddress, SizeInBytes);
if ((*(uintptr_t*)((PBYTE)VirtualAddress + 0x50) & 0xFFFFFF) == 0x144F0)
{
// It is the mapped physical memory of guarded region!
}
}
Kod:
f (VirtualQueryEx(hProcess, address /* ex) 0x8000000050*/, &mbi, sizeof(mbi)))
if (mbi.State == MEM_RESERVED)
// It is guarded region!
yine virtualqueryex i drivera geçiriyoruz burda.
ve artık guarded regionu bulduk burda offsetleri bulmak için guarded regionu tabi bir adres bularak okutuyoruz.
mesela burda özel offsetler var
guarded_region (mesela uworld) + 0x144E0 (solda ki ifadeyi eklersek gerçek memorymizi buluyoruz)
ama player controllerda o + ifadesi 0xBD0B0 ekliyoruz. normalde eskiden çalışıyordu fakat bu offseti ekleyince çalışmıyor şu an bende onun üzerinde uğraşıyorum player controller bulunmuyor güncelleme olursa yazarım