[C++] İki Aşamalı Pack Güvenliği (İlk aşama)

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 8
  • Gösterim Gösterim 1K

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.070
Çözümler
408
Beğeni
4.312
Puan
1.849
Ticaret Puanı
0
Merhaba, zaman zaman böyle bir olayın varlığını duyuyordum. Aklıma böyle bir çözüm üretmek geldi. Yaptığım testlerde şimdiye kadar herhangi bir sorun yaşamadım.

Olaydan kısaca bahsetmek gerekirse; oyun açıkken bazı pack dosyaları açılıp düzenlenebiliyor. Bu durum bazı istisnai durumlarda sorun teşkil edebilir.
Çoğu zaman cache sebebiyle yapılan değişiklikler client resetlenmediği sürece oyuna yansımayabiliyor fakat yinede bu durumu engellemenin zararı olmaz diye düşündüm.
Ek olarak; günümüzde zaten foxfs vb. yöntemler kullanılmaktadır, dolayısıyla bunu oyununuz için ek güvenlik olarak da düşünebilirsiniz.

Kodlar tamamen geliştirmeye ve özelleştirmeye açık bir yapıdadır, istediğiniz doğrultuda ilerletebilirsiniz.
Bu yöntemin autopatcher ile beraber daha sağlıklı çalışacağını belirtmeliyim. Yani burada sizlere de iş düşüyor, benim burada paylaştığım kodlar bu sistemin ilk aşamasıdır. Bu kodlara bağlı olarak autopatcherda yapacağınız gerekli düzenlemeler ise ikinci aşama olacak.

Çalışma mantığından örnek vermek gerekirse; x adlı pack dosyası düzenlendiği anda oyun tamamen kapanacak, ve tekrar açılırken autopatcher(dosya bütünlüğü özelliği vb. mevcutsa) bu düzenlenmiş pack dosyanın yerine orjinalini indirecek ve orjinal dosyadan giriş yapılmasını sağlayacak.
Tekrar aynı şekilde pack dosyalarına müdahele söz konusu olursa bu işlemler otomatik tekrarlanacak. (Bu benim önerdiğim fikirdir, isteyenler istediği şekilde kullanabilir.)

Şimdi konuya geçelim..
Düzenlemeden önceki halini gösteren kısa bir video:



EterPack/EterPackManager.h açın ve #include listesine ekleyin:
C++:
Genişlet Daralt Kopyala
#include "../UserInterface/Locale_inc.h"

Şu fonksiyonu bulun:
C++:
Genişlet Daralt Kopyala
const char * GetRootPackFileName();

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_PACK_SECURITY
        void StorePackFile(std::string szFileName);
        bool CheckPackFile();
        struct PackFileInfo
        {
            std::string filename;
            size_t size;
        };
        std::vector<PackFileInfo> fileInfoVec;
#endif

EterPackManager.cpp açın ve #include listesine ekleyin:
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_PACK_SECURITY
#include <fstream>
#endif

Şu kısmı bulun ( CEterPackManager::RegisterPack fonksiyonu içinde) :
C++:
Genişlet Daralt Kopyala
            if (pEterPack->Create(m_FileDict, c_szName, c_szDirectory, bReadOnly, c_pbIV))
            {
                m_PackMap.insert(TEterPackMap::value_type(c_szName, pEterPack));
            }

m_PackMap.insert satırının altına ekleyin:
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_PACK_SECURITY
                std::string pFile = std::string(c_szName) + ".eix";
                StorePackFile(pFile);
#endif

Daha sonra RegisterPack fonksiyonunun altına ekleyin:

C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_PACK_SECURITY
void CEterPackManager::StorePackFile(std::string szFileName)
{
    std::ifstream fileStream(szFileName, std::ios::binary | std::ios::ate);

    if (fileStream.is_open())
    {
        size_t fileInf_t = fileStream.tellg();
        fileStream.close();

        PackFileInfo info;
        info.filename = szFileName;
        info.size = fileInf_t;
        fileInfoVec.push_back(info);
#ifdef _DEBUG
        TraceError("OKUNDU : %s", szFileName.c_str());
#endif
    }
    else
    {
#ifdef _DEBUG
        TraceError("HATA! - OKUNAMADI : %s", szFileName.c_str());
#endif
        /****************************************
        Dusuk bir ihtimal de olsa eger bu hata alindiysa calismiyor ve bu haliyle calismayacak demektir. Calismamasi oyunu etkilemeyecektir.
        Lutfen yapilan islemleri, kodlari ve pack uyumlulugunu gozden gecirin.
        Hatayi almaya devam ederseniz veya sebebini bulamadiysaniz kodları tamamen kaldirin.
        *****************************************/
        TraceError("EterPackManager::StorePackFile - ERROR! (0x003)");
        TraceError("");
        TraceError("<< Lutfen bu hatayi yoneticiye bildirin. >>");
        // return;
    }
}
bool CEterPackManager::CheckPackFile()
{
    for (const auto& storedFile : fileInfoVec)
    {
        size_t currentSize = GetFileSize(storedFile.filename.c_str());
        if (currentSize != storedFile.size)
        {
            TraceError("Kritik islem tespit edildi!");
            return false;
        }
    }
    return true;
}
#endif

Son olarak UserInterface/PythonApplication.cpp içinde şu kısmı bulun:
C++:
Genişlet Daralt Kopyala
void CPythonApplication::RenderGame()
{

Parantezin altına ekleyin:
C++:
Genişlet Daralt Kopyala
#ifdef ENABLE_PACK_SECURITY
    bool t = CEterPackManager::Instance().CheckPackFile();
    if (!t)
    {
        CEterPackManager::Instance().fileInfoVec.clear();
        Abort();
    }
#endif

Düzenleme sonrasını gösteren video ise aşağıdadır:


Meraklısına; Kodlar client açılırken sadece bir defa çalışır ve oyun(client) açık olduğu sürece sadece pack dosyalarının takibini yapar. Yani ışınlanma,karakter atma gibi durumlarda tekrar tekrar çalışmaz.
 
O değil`de grafikler halis mi ?
 
burda nasıl bir kontrolden bahsediliyor neyi kontrol ediyor.
eix epk kontrol ediyorsa gerek yok bence bu sisteme
 
burda nasıl bir kontrolden bahsediliyor neyi kontrol ediyor.
eix epk kontrol ediyorsa gerek yok bence bu sisteme
1709441936285.webp
 
Geri
Üst